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

توسعه‌دهندگان منطقه اقتصادی اروپا (EEA)

این راهنما 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 بزرگتر یا مساوی با loadDemands محموله در نوع weightKg است. با این حال، وسیله نقلیه‌ای با loadLimits :

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

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

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

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

  1. ظرفیت بار مورد نیاز برای حمل و نقل به عنوان loadDemand تعریف می‌شود.
  2. محموله توسط وسیله نقلیه اختصاص داده شده به آن دریافت می‌شود و vehicleLoads نقلیه به اندازه loadDemand محموله افزایش می‌یابد. این انتقال با visits.loadDemands مثبت در پیام پاسخ نشان داده می‌شود.
  3. وسیله نقلیه محموله را تحویل می‌دهد و بار vehicleLoads نقلیه به اندازه loadDemand محموله تحویل داده شده کاهش می‌یابد. این انتقال با مقدار منفی visits.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] محدودیت بار ۱۰۰ 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] است.

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

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

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

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

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

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