این راهنما 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
برای یک وسیله نقلیه مشخص ببینید. دنباله به شرح زیر است:
- ظرفیت بار مورد نیاز برای محموله به عنوان
loadDemand
تعریف می شود. - محموله توسط وسیله نقلیه اختصاص داده شده دریافت می شود و
vehicleLoads
وسیله نقلیه با مقدارloadDemand
محموله افزایش می یابد. این انتقال باvisits.loadDemands
مثبت در پیام پاسخ نشان داده می شود. - وسیله نقلیه محموله را تحویل می دهد و
vehicleLoads
نقلیه وسیله نقلیه با مقدار بار محموله تحویلی کاهش می یابدloadDemand
. این انتقال با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]
تقاضای بار 50weightKg
دارد. -
shipments[1]
تقاضای بار 10weightKg
دارند. -
shipments[2]
تقاضای بار 80weightKg
دارند. -
vehicles[0]
دارای محدودیت وزنی 100weightKg
است.
پاسخ به درخواست را با تقاضاها و محدودیت های بار مشاهده کنید
{ "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
تأثیر می گذارد:
-
shipment[0]
برداشت می شود -
shipment[1]
برداشت می شود -
shipment[0]
تحویل داده می شود -
shipment[1]
تحویل داده می شود -
shipment[2]
برداشت می شود -
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
را متحمل میشود.
محدودیت های محدودیت بار نرم چندین کاربرد دارد، مانند:
- متعادل کردن محموله ها در وسایل نقلیه بیشتر از حداقل تعداد لازم در صورت مقرون به صرفه بودن انجام این کار
- بیان ترجیح راننده برای تعداد اقلامی که به راحتی می توانند در یک مسیر مشخص تحویل بگیرند
- بارگیری وسایل نقلیه کمتر از حداکثر ظرفیت فیزیکی آنها برای محدود کردن سایش و کاهش هزینه های نگهداری
محدودیت های محدودیت بار سخت و نرم را می توان با هم استفاده کرد. برای مثال، محدودیت بار سخت ممکن است حداکثر وزن محمولهای را که یک وسیله نقلیه میتواند با خیال راحت حمل کند یا حداکثر تعداد اقلامی که در یک زمان در یک وسیله نقلیه جا میشوند بیان کند، در حالی که محدودیت بار نرم ممکن است حداکثر وزن یا تعداد اقلامی باشد که در یک وسیله نقلیه قرار میگیرند. بر توانایی راننده برای جا دادن همه چیز در وسیله نقلیه مالیات می دهد.
،این راهنما 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
برای یک وسیله نقلیه مشخص ببینید. دنباله به شرح زیر است:
- ظرفیت بار مورد نیاز برای محموله به عنوان
loadDemand
تعریف می شود. - محموله توسط وسیله نقلیه اختصاص داده شده دریافت می شود و
vehicleLoads
وسیله نقلیه با مقدارloadDemand
محموله افزایش می یابد. این انتقال باvisits.loadDemands
مثبت در پیام پاسخ نشان داده می شود. - وسیله نقلیه محموله را تحویل می دهد و
vehicleLoads
نقلیه وسیله نقلیه با مقدار بار محموله تحویلی کاهش می یابدloadDemand
. این انتقال با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]
تقاضای بار 50weightKg
دارد. -
shipments[1]
تقاضای بار 10weightKg
دارند. -
shipments[2]
تقاضای بار 80weightKg
دارند. -
vehicles[0]
دارای محدودیت وزنی 100weightKg
است.
پاسخ به درخواست را با تقاضاها و محدودیت های بار مشاهده کنید
{ "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
تأثیر می گذارد:
-
shipment[0]
برداشت می شود -
shipment[1]
برداشت می شود -
shipment[0]
تحویل داده می شود -
shipment[1]
تحویل داده می شود -
shipment[2]
برداشت می شود -
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
را متحمل میشود.
محدودیت های محدودیت بار نرم چندین کاربرد دارد، مانند:
- متعادل کردن محموله ها در وسایل نقلیه بیشتر از حداقل تعداد لازم در صورت مقرون به صرفه بودن انجام این کار
- بیان ترجیح راننده برای تعداد اقلامی که به راحتی می توانند در یک مسیر مشخص تحویل بگیرند
- بارگیری وسایل نقلیه کمتر از حداکثر ظرفیت فیزیکی آنها برای محدود کردن سایش و کاهش هزینه های نگهداری
محدودیت های محدودیت بار سخت و نرم را می توان با هم استفاده کرد. برای مثال، محدودیت بار سخت ممکن است حداکثر وزن محمولهای را که یک وسیله نقلیه میتواند با خیال راحت حمل کند یا حداکثر تعداد اقلامی که در یک زمان در یک وسیله نقلیه جا میشوند بیان کند، در حالی که محدودیت بار نرم ممکن است حداکثر وزن یا تعداد اقلامی باشد که در یک وسیله نقلیه قرار میگیرند. بر توانایی راننده برای جا دادن همه چیز در وسیله نقلیه مالیات می دهد.
،این راهنما 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
برای یک وسیله نقلیه مشخص ببینید. دنباله به شرح زیر است:
- ظرفیت بار مورد نیاز برای محموله به عنوان
loadDemand
تعریف می شود. - محموله توسط وسیله نقلیه اختصاص داده شده دریافت می شود و
vehicleLoads
وسیله نقلیه با مقدارloadDemand
محموله افزایش می یابد. این انتقال باvisits.loadDemands
مثبت در پیام پاسخ نشان داده می شود. - وسیله نقلیه محموله را تحویل می دهد و
vehicleLoads
نقلیه وسیله نقلیه با مقدار بار محموله تحویلی کاهش می یابدloadDemand
. این انتقال با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]
تقاضای بار 50weightKg
دارد. -
shipments[1]
تقاضای بار 10weightKg
دارند. -
shipments[2]
تقاضای بار 80weightKg
دارند. -
vehicles[0]
دارای محدودیت وزنی 100weightKg
است.
پاسخ به درخواست را با تقاضاها و محدودیت های بار مشاهده کنید
{ "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
تأثیر می گذارد:
-
shipment[0]
برداشت می شود -
shipment[1]
برداشت می شود -
shipment[0]
تحویل داده می شود -
shipment[1]
تحویل داده می شود -
shipment[2]
برداشت می شود -
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
را متحمل میشود.
محدودیت های محدودیت بار نرم چندین کاربرد دارد، مانند:
- متعادل کردن محموله ها در وسایل نقلیه بیشتر از حداقل تعداد لازم در صورت مقرون به صرفه بودن انجام این کار
- بیان ترجیح راننده برای تعداد اقلامی که به راحتی می توانند در یک مسیر مشخص تحویل بگیرند
- بارگیری وسایل نقلیه کمتر از حداکثر ظرفیت فیزیکی آنها برای محدود کردن سایش و کاهش هزینه های نگهداری
محدودیت های محدودیت بار سخت و نرم را می توان با هم استفاده کرد. برای مثال، محدودیت بار سخت ممکن است حداکثر وزن محمولهای را که یک وسیله نقلیه میتواند با خیال راحت حمل کند یا حداکثر تعداد اقلامی که در یک زمان در یک وسیله نقلیه جا میشوند بیان کند، در حالی که محدودیت بار نرم ممکن است حداکثر وزن یا تعداد اقلامی باشد که در یک وسیله نقلیه قرار میگیرند. بر توانایی راننده برای جا دادن همه چیز در وسیله نقلیه مالیات می دهد.
،این راهنما 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
برای یک وسیله نقلیه مشخص ببینید. دنباله به شرح زیر است:
- ظرفیت بار مورد نیاز برای محموله به عنوان
loadDemand
تعریف می شود. - محموله توسط وسیله نقلیه اختصاص داده شده دریافت می شود و
vehicleLoads
وسیله نقلیه با مقدارloadDemand
محموله افزایش می یابد. این انتقال باvisits.loadDemands
مثبت در پیام پاسخ نشان داده می شود. - وسیله نقلیه محموله را تحویل می دهد و
vehicleLoads
نقلیه وسیله نقلیه با مقدار بار محموله تحویلی کاهش می یابدloadDemand
. این انتقال با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]
تقاضای بار 50weightKg
دارد. -
shipments[1]
تقاضای بار 10weightKg
دارند. -
shipments[2]
تقاضای بار 80weightKg
دارند. -
vehicles[0]
دارای محدودیت وزنی 100weightKg
است.
پاسخ به درخواست را با تقاضاها و محدودیت های بار مشاهده کنید
{ "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
تأثیر می گذارد:
-
shipment[0]
برداشت می شود -
shipment[1]
برداشت می شود -
shipment[0]
تحویل داده می شود -
shipment[1]
تحویل داده می شود -
shipment[2]
برداشت می شود -
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
را متحمل میشود.
محدودیت های محدودیت بار نرم چندین کاربرد دارد، مانند:
- متعادل کردن محموله ها در وسایل نقلیه بیشتر از حداقل تعداد لازم در صورت مقرون به صرفه بودن انجام این کار
- بیان ترجیح راننده برای تعداد اقلامی که به راحتی می توانند در یک مسیر مشخص تحویل بگیرند
- بارگیری وسایل نقلیه کمتر از حداکثر ظرفیت فیزیکی آنها برای محدود کردن سایش و کاهش هزینه های نگهداری
محدودیت های محدودیت بار سخت و نرم را می توان با هم استفاده کرد. برای مثال، محدودیت بار سخت ممکن است حداکثر وزن محمولهای را که یک وسیله نقلیه میتواند با خیال راحت حمل کند یا حداکثر تعداد اقلامی که در یک زمان در یک وسیله نقلیه جا میشوند بیان کند، در حالی که محدودیت بار نرم ممکن است حداکثر وزن یا تعداد اقلامی باشد که در یک وسیله نقلیه قرار میگیرند. بر توانایی راننده برای جا دادن همه چیز در وسیله نقلیه مالیات می دهد.