این مثال نحوه استفاده loadDemands و loadLimits را برای مدیریت محدودیتهای ظرفیت خودرو در یک درخواست API بهینهسازی مسیر نشان میدهد.
برای یک مرور کلی مفهومی، به سند مفاهیم کلیدی «مطالبات و محدودیتهای بار» مراجعه کنید.
درخواست نمونه
مثال زیر سناریویی را نشان میدهد که در آن یک وسیله نقلیه با محدودیت بار باید سه محموله با وزنهای مختلف را تحویل دهد.
این درخواست نمونه شامل پارامترهای مرتبط با بارگذاری زیر است:
-
shipments[0]باamountتقاضای بار 50weightKg. -
shipments[1]باamountتقاضای بار 10weightKg. -
shipments[2]باamountتقاضای بار 80weightKg. -
vehicles[0]باmaxLoadبار مجاز ۱۰۰weightKg.
یک درخواست نمونه با تقاضاها و محدودیتهای بار را ببینید
{ "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" } } } ] } }
پاسخ نمونه
پاسخ، مسیر بهینه برای وسیله نقلیه را نشان میدهد. از آنجا که مجموع بار همه محمولهها از ظرفیت وسیله نقلیه بیشتر است، بهینهساز توالیای از برداشتها و تحویلها را ایجاد میکند تا اطمینان حاصل شود که loadLimits نقض نمیشوند.
پاسخ به درخواست را به همراه تقاضاها و محدودیتهای بار مشاهده کنید
{ "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 } } }
از آنجا که مجموع loadDemands سه محموله (50 + 10 + 80 = 140) loadLimits وسیله نقلیه (100) فراتر میرود، وسیله نقلیه نمیتواند همه محمولهها را به طور همزمان بارگیری کند. بهینهساز فقط مسیرهایی را در نظر میگیرد که shipment[0] و shipment[2] به طور همزمان در وسیله نقلیه نباشند، زیرا این محمولهها، محمولههایی هستند که با وزن ترکیبی خود از حد بار وسیله نقلیه فراتر میروند.
این مسیر دارای visits زیر است تا از حد مجاز بار وسیله نقلیه تجاوز نشود:
-
shipment[0]دریافت شد -
shipment[1]دریافت میشود -
shipment[0]تحویل داده شد -
shipment[1]تحویل داده شد -
shipment[2]دریافت میشود -
shipment[2]تحویل داده شد
بار وسیله نقلیه در طول مسیر تغییر میکند، که میتوانید آن را در آرایه transitions مشاهده کنید. برای مثال، transitions[2] وسیله نقلیهای را نشان میدهد که پس از دریافت دو محموله اول (50 + 10) باری به weightKg را حمل میکند.
ویژگی maxLoads در metrics نشان میدهد که حداکثر بار حملشده در هر نقطه از مسیر ۸۰ weightKg بوده است، که تأیید میکند راهحل با موفقیت در محدوده ۱۰۰ weightKg وسیله نقلیه باقی مانده است.
محدودیتهای بار نرم
مثال زیر نحوه استفاده از محدودیت بار نرم برای بهینهسازی مسیری با چندین وسیله نقلیه را نشان میدهد. این راهحل، محمولهها را بین دو وسیله نقلیه تقسیم میکند تا از جریمه هزینه ناشی از تجاوز از محدودیت بار نرم وسیله نقلیه جلوگیری شود.
درخواست نمونه
این درخواست اکنون شامل سه محمولهی صرفاً تحویلی و دو وسیلهی نقلیه با loadLimits و softMaxLoad یکسان است.
پارامترهای کلیدی برای این مثال عبارتند از:
- این سه محموله دارای
loadDemandsweightKg۱۴۰ کیلوگرم (۵۰- ۶۰ + ۳۰).
- دو وسیله نقلیه با
softMaxLoadبرابر با "100"weightKgوcostPerUnitAboveSoftMaxبرابر با 5.0 موجود است.
یک درخواست نمونه با محدودیت بار نرم را ببینید
{ "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" } ], "loadDemands": { "weightKg": { "amount": "50" } } }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s" } ], "loadDemands": { "weightKg": { "amount": "60" } } }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s" } ], "loadDemands": { "weightKg": { "amount": "30" } } } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerHour": 40.0, "costPerKilometer": 10.0, "loadLimits": { "weightKg": { "maxLoad": "150", "softMaxLoad": "100", "costPerUnitAboveSoftMax": 5.0 } } }, { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerHour": 40.0, "costPerKilometer": 10.0, "loadLimits": { "weightKg": { "maxLoad": "150", "softMaxLoad": "100", "costPerUnitAboveSoftMax": 5.0 } } } ] } }
پاسخ نمونه
اکنون پاسخ شامل دو مسیر است، یکی برای هر وسیله نقلیه. بهینهساز تعیین میکند که استفاده از هر دو وسیله نقلیه نسبت به استفاده از یک وسیله نقلیه و متحمل شدن جریمه محدودیت نرم، مقرون به صرفهتر است.
پاسخی به درخواست با محدودیت بار نرم افزاری مشاهده کنید
{ "routes": [ { "vehicleStartTime": "2023-01-13T16:00:00Z", "vehicleEndTime": "2023-01-13T16:13:31Z", "visits": [ { "startTime": "2023-01-13T16:03:53Z", "detour": "0s", "loadDemands": { "weightKg": { "amount": "-50" } } } ], "transitions": [ { "travelDuration": "233s", "travelDistanceMeters": 794, "waitDuration": "0s", "totalDuration": "233s", "startTime": "2023-01-13T16:00:00Z", "vehicleLoads": { "weightKg": { "amount": "50" } } }, { "travelDuration": "328s", "travelDistanceMeters": 1188, "waitDuration": "0s", "totalDuration": "328s", "startTime": "2023-01-13T16:08:03Z", "vehicleLoads": { "weightKg": {} } } ], "metrics": { "performedShipmentCount": 1, "travelDuration": "561s", "visitDuration": "250s", "totalDuration": "811s", "travelDistanceMeters": 1982, "maxLoads": { "weightKg": { "amount": "50" } } }, "routeCosts": { "model.vehicles.cost_per_kilometer": 19.82, "model.vehicles.cost_per_hour": 9.01 }, "routeTotalCost": 28.83 }, { "vehicleIndex": 1, "vehicleStartTime": "2023-01-13T16:00:00Z", "vehicleEndTime": "2023-01-13T16:21:43Z", "visits": [ { "shipmentIndex": 1, "startTime": "2023-01-13T16:05:54Z", "detour": "0s", "loadDemands": { "weightKg": { "amount": "-60" } } }, { "shipmentIndex": 2, "startTime": "2023-01-13T16:13:52Z", "detour": "473s", "loadDemands": { "weightKg": { "amount": "-30" } } } ], "transitions": [ { "travelDuration": "354s", "travelDistanceMeters": 1196, "waitDuration": "0s", "totalDuration": "354s", "startTime": "2023-01-13T16:00:00Z", "vehicleLoads": { "weightKg": { "amount": "90" } } }, { "travelDuration": "228s", "travelDistanceMeters": 808, "waitDuration": "0s", "totalDuration": "228s", "startTime": "2023-01-13T16:10:04Z", "vehicleLoads": { "weightKg": { "amount": "30" } } }, { "travelDuration": "221s", "travelDistanceMeters": 655, "waitDuration": "0s", "totalDuration": "221s", "startTime": "2023-01-13T16:18:02Z", "vehicleLoads": { "weightKg": {} } } ], "metrics": { "performedShipmentCount": 2, "travelDuration": "803s", "visitDuration": "500s", "totalDuration": "1303s", "travelDistanceMeters": 2659, "maxLoads": { "weightKg": { "amount": "90" } } }, "routeCosts": { "model.vehicles.cost_per_kilometer": 26.59, "model.vehicles.cost_per_hour": 14.48 }, "routeTotalCost": 41.07 } ], "metrics": { "aggregatedRouteMetrics": { "performedShipmentCount": 3, "travelDuration": "1364s", "visitDuration": "750s", "totalDuration": "2114s", "travelDistanceMeters": 4641, "maxLoads": { "weightKg": { "amount": "90" } } }, "usedVehicleCount": 2, "earliestVehicleStartTime": "2023-01-13T16:00:00Z", "latestVehicleEndTime": "2023-01-13T16:21:43Z", "totalCost": 69.90, "costs": { "model.vehicles.cost_per_kilometer": 46.41, "model.vehicles.cost_per_hour": 23.49 } } }
فیلدهای زیر نشان میدهند که بهینهساز چگونه محمولهها را بین دو وسیله نقلیه تقسیم میکند تا بارها را زیر حد مجاز ۱۰۰ weightKg نگه دارد.
- مسیر اول (
vehicleIndex: 0) محمولهweightKg۵۰ کیلوگرم را مدیریت میکند.maxLoadsآن "۵۰" است که کمتر از حد مجاز است. - مسیر دوم (
vehicleIndex: 1) محمولههایweightKg۶۰ و ۳۰ کیلوگرم را مدیریت میکند.maxLoadsآن "۹۰" است که پایینتر از حد مجاز است. - از آنجا که هیچکدام از وسایل نقلیه از حد مجاز خود تخطی نمیکنند،
routeCostsبرای هر دو مسیر هیچ جریمهای درcostPerUnitAboveSoftMaxنشان نمیدهد.