بار تقاضاها و محدودیت ها

این راهنما loadDemands و loadLimits و نحوه ارتباط آنها با یکدیگر را شرح می دهد.

همانطور که در محدودیت‌های پنجره زمان تحویل و تحویل ذکر شد، پیام OptimizeToursRequest ( REST ، gRPC ) حاوی تعدادی ویژگی است که محدودیت‌هایی را برای مشکل در حال بهینه‌سازی مشخص می‌کند. چندین ویژگی OptimizeToursRequest محدودیت های بار را نشان می دهند.

وسایل نقلیه و محموله ها دارای ویژگی های فیزیکی هستند که باید هنگام برنامه ریزی مسیر در نظر گرفته شوند.

  • وسایل نقلیه : ویژگی loadLimits حداکثر باری را که وسیله نقلیه می تواند تحمل کند مشخص می کند. مستندات پیام Vehicle ( REST ، gRPC ) را ببینید.
  • محموله ها : ویژگی loadDemands مشخص می کند که یک محموله معین چه مقدار بار مصرف می کند. مستندات پیام Shipment ( REST ، gRPC ) را ببینید.

این دو محدودیت با هم این امکان را برای بهینه‌ساز فراهم می‌آورند که محموله‌ها را به نحوی مناسب به وسایل نقلیه اختصاص دهد که به بهترین وجه با ظرفیت ناوگان و نیازهای حمل و نقل شما مطابقت داشته باشد.

در ادامه این سند loadLimits و loadDemands به تفصیل مورد بحث قرار می گیرد.

تقاضاها و محدودیت های بار: انواع

شما هر تقاضای بار و محدودیت محدودیت را بر حسب یک نوع بیان می کنید.

شما می توانید مجموعه ای از انواع بار خود را ارائه دهید، مانند مثال های زیر:

  • وزن
  • جلد
  • اندازه گیری های خطی
  • نام اقلام یا تجهیزات در حال حمل و نقل

این راهنما از weightKg به عنوان نمونه استفاده می کند.

هر دو Shipment.loadDemands و Vehicle.loadLimits از نوع map Protocol Buffers با کلیدهای string استفاده می کنند که انواع بار را نشان می دهد.

مقادیر Shipment.loadDemands از پیام Load ( REST ، gRPC ) استفاده می کنند. پیام Load دارای ویژگی amount واحدی است که نشان دهنده میزان ظرفیت مورد نیاز برای تکمیل حمل و نقل در نوع مشخص شده است.

مقادیر Vehicle.loadLimits از پیام LoadLimit ( REST ، gRPC ) استفاده می کنند. پیام LoadLimit دارای چندین ویژگی است که maxLoad حداکثر ظرفیت بار خودرو را در نوع مشخص شده نشان می دهد.

loadDemands یک محموله، loadLimits خودرو اختصاص داده شده را تنها در صورتی مصرف می‌کند که این دو کلید نوع بار منطبق را داشته باشند. به عنوان مثال، یک محموله با loadDemands از:

"loadDemands": {
  "weightKg": {
    "amount": 50
  }
}

برای تکمیل محموله به 50 واحد بار در نوع weightKg نیاز دارد. وسیله نقلیه با loadLimits :

"loadLimits": {
  "weightKg": {
    "maxLoad": 100
  }
}

ممکن است بتواند محموله را تکمیل کند، زیرا maxLoad خودرو در نوع weightKg weightKg بیشتر یا برابر با loadDemands محموله است. با این حال، خودرویی با loadLimits :

"loadLimits": {
  "equipmentRackStorage": {
    "maxLoad": 10
  }
}

به طور ضمنی دارای ظرفیت نامحدود weightKg به دلیل عدم وجود محدودیت وزن weightKg است، بنابراین وسیله نقلیه توسط تقاضای وزن محموله محدود نمی شود.

انتقال بار بین محموله ها و وسایل نقلیه

از آنجایی که محموله ها توسط وسایل نقلیه تحویل و تحویل می شوند، loadDemand بین محموله و وسیله نقلیه منتقل می شود. می‌توانید بارهای خودرو را در ورودی routes.transitions ( REST ، gRPC ) پیام OptimizeToursResponse برای یک وسیله نقلیه مشخص ببینید. دنباله به شرح زیر است:

  1. ظرفیت بار مورد نیاز برای محموله به عنوان loadDemand تعریف می شود.
  2. محموله توسط وسیله نقلیه اختصاص داده شده دریافت می شود و vehicleLoads وسیله نقلیه با مقدار loadDemand محموله افزایش می یابد. این انتقال با visits.loadDemands مثبت در پیام پاسخ نشان داده می شود.
  3. وسیله نقلیه محموله را تحویل می دهد و vehicleLoads وسیله نقلیه وسیله نقلیه با مقدار loadDemand محموله تحویلی کاهش می یابدDemand . این انتقال با visits.loadDemands منفی .loadDemands در پیام پاسخ نشان داده می شود.

vehicleLoads یک وسیله نقلیه نمی تواند از loadLimits مشخص شده آن در هر نقطه از مسیر آن تجاوز کند.

یک مثال کامل با تقاضاها و محدودیت های بار

یک نمونه درخواست با تقاضاها و محدودیت های بار را ببینید

{
  "populatePolylines": false,
  "populateTransitionPolylines": false,
  "model": {
    "globalStartTime": "2023-01-13T16:00:00Z",
    "globalEndTime": "2023-01-14T16:00:00Z",
    "shipments": [
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789456,
              "longitude": -122.390192
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 100.0,
        "loadDemands": {
          "weightKg": {
            "amount": 50
          }
        }
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 15.0,
        "loadDemands": {
          "weightKg": {
            "amount": 10
          }
        }
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 50.0,
        "loadDemands": {
          "weightKg": {
            "amount": 80
          }
        }
      }
    ],
    "vehicles": [
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0,
        "loadLimits": {
          "weightKg": {
            "maxLoad": 100
          }
        }
      }
    ]
  }
}
    

درخواست مثال شامل چندین پارامتر مرتبط با بار است:

  • shipments[0] تقاضای بار 50 weightKg دارد.
  • shipments[1] تقاضای بار 10 weightKg دارند.
  • shipments[2] تقاضای بار 80 weightKg دارند.
  • vehicles[0] دارای محدودیت وزنی 100 weightKg است.

پاسخ به درخواست را با تقاضاها و محدودیت های بار مشاهده کنید

{
  "routes": [
    {
      "vehicleStartTime": "2023-01-13T16:00:00Z",
      "vehicleEndTime": "2023-01-13T16:43:27Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2023-01-13T16:00:00Z",
          "detour": "0s",
          "loadDemands": {
            "weightKg": {
              "amount": "50"
            }
          }
        },
        {
          "shipmentIndex": 1,
          "isPickup": true,
          "startTime": "2023-01-13T16:02:30Z",
          "detour": "150s",
          "loadDemands": {
            "weightKg": {
              "amount": "10"
            }
          }
        },
        {
          "startTime": "2023-01-13T16:08:55Z",
          "detour": "150s",
          "loadDemands": {
            "weightKg": {
              "amount": "-50"
            }
          }
        },
        {
          "shipmentIndex": 1,
          "startTime": "2023-01-13T16:16:37Z",
          "detour": "343s",
          "loadDemands": {
            "weightKg": {
              "amount": "-10"
            }
          }
        },
        {
          "shipmentIndex": 2,
          "isPickup": true,
          "startTime": "2023-01-13T16:27:07Z",
          "detour": "1627s",
          "loadDemands": {
            "weightKg": {
              "amount": "80"
            }
          }
        },
        {
          "shipmentIndex": 2,
          "startTime": "2023-01-13T16:36:26Z",
          "detour": "0s",
          "loadDemands": {
            "weightKg": {
              "amount": "-80"
            }
          }
        }
      ],
      "transitions": [
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T16:00:00Z",
          "vehicleLoads": {
            "weightKg": {}
          }
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T16:02:30Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "50"
            }
          }
        },
        {
          "travelDuration": "235s",
          "travelDistanceMeters": 795,
          "waitDuration": "0s",
          "totalDuration": "235s",
          "startTime": "2023-01-13T16:05:00Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "60"
            }
          }
        },
        {
          "travelDuration": "212s",
          "travelDistanceMeters": 791,
          "waitDuration": "0s",
          "totalDuration": "212s",
          "startTime": "2023-01-13T16:13:05Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "10"
            }
          }
        },
        {
          "travelDuration": "380s",
          "travelDistanceMeters": 1190,
          "waitDuration": "0s",
          "totalDuration": "380s",
          "startTime": "2023-01-13T16:20:47Z",
          "vehicleLoads": {
            "weightKg": {}
          }
        },
        {
          "travelDuration": "409s",
          "travelDistanceMeters": 1371,
          "waitDuration": "0s",
          "totalDuration": "409s",
          "startTime": "2023-01-13T16:29:37Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "80"
            }
          }
        },
        {
          "travelDuration": "171s",
          "travelDistanceMeters": 665,
          "waitDuration": "0s",
          "totalDuration": "171s",
          "startTime": "2023-01-13T16:40:36Z",
          "vehicleLoads": {
            "weightKg": {}
          }
        }
      ],
      "metrics": {
        "performedShipmentCount": 3,
        "travelDuration": "1407s",
        "waitDuration": "0s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "1200s",
        "totalDuration": "2607s",
        "travelDistanceMeters": 4812,
        "maxLoads": {
          "weightKg": {
            "amount": "80"
          }
        }
      },
      "routeCosts": {
        "model.vehicles.cost_per_kilometer": 48.12,
        "model.vehicles.cost_per_hour": 28.966666666666665
      },
      "routeTotalCost": 77.086666666666659
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 3,
      "travelDuration": "1407s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "1200s",
      "totalDuration": "2607s",
      "travelDistanceMeters": 4812,
      "maxLoads": {
        "weightKg": {
          "amount": "80"
        }
      }
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2023-01-13T16:00:00Z",
    "latestVehicleEndTime": "2023-01-13T16:43:27Z",
    "totalCost": 77.086666666666659,
    "costs": {
      "model.vehicles.cost_per_hour": 28.966666666666665,
      "model.vehicles.cost_per_kilometer": 48.12
    }
  }
}
    

محدودیت های بار اضافه شده بر ترتیب visits تأثیر می گذارد:

  1. shipment[0] برداشت می شود
  2. shipment[1] برداشت می شود
  3. shipment[0] تحویل داده می شود
  4. shipment[1] تحویل داده می شود
  5. shipment[2] برداشت می شود
  6. shipment[2] تحویل داده می شود

این سفارش نشان می‌دهد که سه محموله نمی‌تواند به طور همزمان توسط وسیله نقلیه تکمیل شود، زیرا مجموع loadDemands آنها از loadLimits خودرو بیشتر است.

هر ورودی visits شامل تغییر بار وسیله نقلیه ناشی از تکمیل Visit است. مقادیر بار مثبت نشان دهنده بارگیری محموله است در حالی که مقادیر منفی نشان دهنده تخلیه محموله است.

هر ورودی transitions شامل کل بار وسیله نقلیه در طول Transition است. برای مثال، transitions[2] دارای وزن weightKg وزن 60 است که نشان دهنده بارهای ترکیبی shipment[0] و shipment[1] است.

اشیاء متریک routes[0].metrics و metrics.aggregatedRouteMetrics شامل ویژگی maxLoads است. مقدار برای نوع weightKg 80 است، که نمایانگر بخشی از مسیر وسیله نقلیه است که shipments[2] به محل تحویل آن منتقل می‌کند.

محدودیت های محدودیت بار نرم

مانند پنجره‌های زمانی که در محدودیت‌های پنجره زمان تحویل و تحویل توضیح داده شده است، محدودیت‌های محدودیت بار دارای انواع سخت و نرم هستند. ویژگی maxLoad پیام LoadLimit یک محدودیت سخت را بیان می کند: وسیله نقلیه هرگز نباید باری را بیش از مقدار maxLoad در نوع مشخص شده حمل کند. ویژگی‌های softMaxLoad و costPerUnitAboveSoftMax یک محدودیت نرم را بیان می‌کنند، با هر واحدی که بیش از softMaxLoad هزینه‌های costPerUnitAboveSoftMax را متحمل می‌شود.

محدودیت های محدودیت بار نرم چندین کاربرد دارد، مانند:

  • متعادل کردن محموله ها در وسایل نقلیه بیشتر از حداقل تعداد لازم در صورت مقرون به صرفه بودن انجام این کار
  • بیان ترجیح راننده برای تعداد اقلامی که به راحتی می توانند در یک مسیر مشخص تحویل بگیرند
  • بارگیری وسایل نقلیه کمتر از حداکثر ظرفیت فیزیکی آنها برای محدود کردن سایش و کاهش هزینه های نگهداری

محدودیت های محدودیت بار سخت و نرم را می توان با هم استفاده کرد. برای مثال، محدودیت بار سخت ممکن است حداکثر وزن محموله‌ای را که یک وسیله نقلیه می‌تواند با خیال راحت حمل کند یا حداکثر تعداد اقلامی که در یک زمان در یک وسیله نقلیه جا می‌شوند بیان کند، در حالی که محدودیت بار نرم ممکن است حداکثر وزن یا تعداد اقلامی باشد که در یک وسیله نقلیه قرار می‌گیرند. بر توانایی راننده برای جا دادن همه چیز در وسیله نقلیه مالیات می دهد.