يوضّح هذا الدليل loadDemands
وloadLimits
وطريقة ارتباطهما بكل منهما.
آخر.
كما هو موضّح في قيود فترة الاستلام والتسليم،
تحتوي رسالة OptimizeToursRequest
(REST، gRPC) على عدد من
الخصائص التي تحدد القيود على المشكلة التي يتم تحسينها. متعددة
تمثّل سمات OptimizeToursRequest
قيود التحميل.
للمركبات والشحنات خصائص مادية يجب وضعها في الاعتبار عند التخطيط لمسار.
- المركبات: تحدّد السمة
loadLimits
الحد الأقصى للحِمل الذي التي يمكن للمركبة التعامل معها. الاطّلاع على رسالةVehicle
(REST، gRPC) التوثيق. - الشحنات: تحدّد السمة
loadDemands
حجم التحميل على الشحنة. الاطّلاع على رسالةShipment
(REST، gRPC) التوثيق.
يتيح هذان الشرطان معًا للمحسّن وتعيين الشحنات للمركبات بشكل مناسب بطريقة تتطابق على أفضل نحو سعة الأسطول ومتطلبات الشحن.
تتناول بقية هذا المستند loadLimits
وloadDemands
بالتفصيل.
طلبات التحميل والحدود: الأنواع
أنت تعبِّر عن كل قيد من قيود الطلب على التحميل والحدّ الأقصى من حيث النوع.
يمكنك تقديم مجموعتك الخاصة من أنواع التحميل، مثل الأمثلة التالية:
- الوزن
- الحجم
- القياسات الخطية
- أسماء السلع أو المعدّات التي يتم نقلها
يستخدم هذا الدليل weightKg
كنوع من الأمثلة.
يستخدِم كل من Shipment.loadDemands
وVehicle.loadLimits
منظِّمات البروتوكولات المؤقتة
النوع map
، مع مفاتيح 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
للنقل بين الشحنة والمركبة. يمكنك الاطّلاع على
مركبات المركبة في رسالة OptimizeToursResponse
(REST،
إدخال gRPC)routes.transitions
لمركبة معيّنة. التسلسل هو
التالي:
- يتم تحديد سعة الحمولة المطلوبة للشحن على أنّها
loadDemand
. - حيث يتم استلام الشحنة بواسطة المركبة المخصصة
تزيد قيمة
vehicleLoads
بمقدارloadDemand
للشحن. هذا النمط يتم تمثيل عملية النقل بعلامة موجبvisits.loadDemands
في الردّ. . - تُسلِّم المركبة الشحنة وتنخفض قيمة السيارة في
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]
هو 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
.
هناك عدة استخدامات لقيود التحميل البسيط، مثل:
- موازنة الشحنات عبر مركبات أكثر من الحد الأدنى اللازم عندما يكون تنفيذ ذلك فعّالاً من حيث التكلفة
- والتعبير عن تفضيل السائق في ما يتعلق بعدد العناصر التي يمكنه أن يتناسب معها الاستلام أو التسليم على مسار معيّن
- تحميل المركبات دون الحد الأقصى للقدرة المادية للحدّ من الاستهلاك تقليل تكاليف الصيانة
يمكن استخدام قيود حدود التحميل الثابت والخفيف معًا. على سبيل المثال، قد يبدو قد يعبر حد الحمولة عن الحد الأقصى لوزن البضائع التي يمكن للمركبة حملها بأمان أو الحد الأقصى لعدد العناصر التي تلائم أي مركبة في وقت واحد، في حين قد يكون حد التحميل الأولي هو الحد الأقصى للوزن أو عدد العناصر التي قد تفرض ضريبة قدرة السائق على استيعاب كل شيء في السيارة.