تحتوي الرسالة OptimizeToursRequest
(REST، gRPC) على عدد من الخصائص المتعلقة بالتكاليف. تمثّل مَعلمات التكلفة هذه معًا نموذج التكلفة للطلب. يشتمل نموذج التكلفة على العديد من أهداف التحسين العالية المستوى للطلب، مثل:
- تحديد أولوية
Vehicle
للمسارات الأسرع على المسارات الأقصر أو العكس - تحديد ما إذا كانت تكلفة تسليم
Shipment
تستحق قيمة إكمالShipment
- إجراء عمليات الاستلام والتسليم خلال فترات زمنية محدّدة فقط عندما يكون ذلك فعّالاً من حيث التكلفة
الاطّلاع على مثال على طلب يتضمّن التكاليف
{ "model": { "globalStartTime": "2023-01-13T16:00:00-08:00", "globalEndTime": "2023-01-14T16:00:00-08:00", "shipments": [ { "deliveries": [ { "arrivalLocation": { "latitude": 37.789456, "longitude": -122.390192 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 100.0 }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 5.0 }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 50.0 } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerHour": 40.0, "costPerKilometer": 10.0 } ] } }
Vehicle
خصائص التكلفة
تحتوي رسالة Vehicle
(REST وgRPC) على عدة سمات للتكلفة:
Vehicle.cost_per_hour
: تمثّل تكلفة تشغيل مركبة في الساعة، بما في ذلك أوقات النقل والانتظار والزيارة والاستراحة.-
Vehicle.cost_per_kilometer
: تمثّل التكلفة لكل كيلومتر تقطعه المركبة. Vehicle.cost_per_traveled_hour
: تمثّل تكلفة تشغيل مركبة أثناء النقل فقط، باستثناء أوقات الانتظار والزيارة والاستراحة.
تسمح مَعلمات التكلفة هذه لأداة التحسين بإجراء مقايضة بين الوقت والمسافة المقطوعة. تظهر التكاليف التي تتكبّدها المسارات المحسَّنة في رسالة الرد على النحو التالي: metrics.costs
كلما زادت قيمة costPerHour
، يحاول المحسِّن العثور على مسارات أسرع قد لا تكون الأقصر. في هذا المثال، تبيّن أنّ أسرع مسار هو الأقصر، لذا فإنّ التغييرات في مَعلمات التكلفة ليس لها تأثير كبير.
Shipment
خصائص التكلفة
تحتوي رسالة Shipment
(REST، gRPC) أيضًا على عدة مَعلمات متعلقة بالتكلفة:
- تمثّل
Shipment.penalty_cost
التكلفة التي يتم تكبّدها عند تخطّي الشحنة. يؤدي عدم ضبط المَعلمةpenalty_cost
لشحنة إلى جعل الشحنة إلزامية، ما يعني أنّه لن يتم تخطّي الشحنة إلا إذا تعذّر إكمالها بسبب القيود المحدّدة. - تمثّل السمة
Shipment.VisitRequest.cost
تكلفة عملية استلام أو توصيل محدّدة، وتُستخدَم بشكل أساسي لإتاحة المقارنة بين تكاليف خيارات استلام أو توصيل متعدّدة لشحنة واحدة.
تستخدِم معلَمات التكلفة Shipment
وحدات بلا أبعاد مماثلة لمعلَمات التكلفة Vehicle
. إذا كانت التكلفة المتكبّدة لإكمال Shipment
تتجاوز تكلفة العقوبة، لن يتم تضمين Shipment
في أي مسار Vehicle
، بل سيظهر في قائمة skipped_shipments
في رسالة الرد.
ShipmentModel
خصائص التكلفة
تتضمّن رسالة ShipmentModel
(REST وgRPC) سمة تكلفة واحدة، وهي globalDurationCostPerHour
. يتم تكبّد هذه التكلفة استنادًا إلى إجمالي الوقت المطلوب من جميع المركبات لإكمال ShipmentRoute
. تؤدي زيادة
globalDurationCostPerHour
إلى إعطاء الأولوية لإكمال جميع الشحنات في وقت أقرب.
خصائص تكلفة استجابة Route Optimization
تحتوي رسالة OptimizeToursResponse
(REST وgRPC) على خصائص التكلفة
التي تمثّل التكاليف المتكبّدة في عملية إكمال ShipmentRoute
.
تمثّل الخاصيتان metrics.costs
وmetrics.totalCost
عدد وحدات التكلفة التي تم تكبّدها على مستوى جميع المسارات في الاستجابة. يتضمّن كل إدخال routes
السمتَين routeCosts
وrouteTotalCosts
اللتين تمثّلان تكاليف هذا المسار المحدّد.
الاطّلاع على ردّ على طلب المثال مع التكاليف
{ "routes": [ { "vehicleStartTime": "2023-01-14T00:00:00Z", "vehicleEndTime": "2023-01-14T00:28:22Z", "visits": [ { "isPickup": true, "startTime": "2023-01-14T00:00:00Z", "detour": "0s" }, { "shipmentIndex": 2, "isPickup": true, "startTime": "2023-01-14T00:02:30Z", "detour": "150s" }, { "startTime": "2023-01-14T00:08:55Z", "detour": "150s" }, { "shipmentIndex": 2, "startTime": "2023-01-14T00:21:21Z", "detour": "572s" } ], "transitions": [ { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:00:00Z" }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:02:30Z" }, { "travelDuration": "235s", "travelDistanceMeters": 795, "waitDuration": "0s", "totalDuration": "235s", "startTime": "2023-01-14T00:05:00Z" }, { "travelDuration": "496s", "travelDistanceMeters": 1893, "waitDuration": "0s", "totalDuration": "496s", "startTime": "2023-01-14T00:13:05Z" }, { "travelDuration": "171s", "travelDistanceMeters": 665, "waitDuration": "0s", "totalDuration": "171s", "startTime": "2023-01-14T00:25:31Z" } ], "metrics": { "performedShipmentCount": 2, "travelDuration": "902s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "800s", "totalDuration": "1702s", "travelDistanceMeters": 3353 }, "routeCosts": { "model.vehicles.cost_per_kilometer": 33.53, "model.vehicles.cost_per_hour": 18.911111111111111 }, "routeTotalCost": 52.441111111111113 } ], "skippedShipments": [ { "index": 1 } ], "metrics": { "aggregatedRouteMetrics": { "performedShipmentCount": 2, "travelDuration": "902s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "800s", "totalDuration": "1702s", "travelDistanceMeters": 3353 }, "usedVehicleCount": 1, "earliestVehicleStartTime": "2023-01-14T00:00:00Z", "latestVehicleEndTime": "2023-01-14T00:28:22Z", "totalCost": 57.441111111111113, "costs": { "model.vehicles.cost_per_kilometer": 33.53, "model.vehicles.cost_per_hour": 18.911111111111111, "model.shipments.penalty_cost": 5 } } }
في مثال الردّ، تكون metrics.costs
ذات المستوى الأعلى هي:
{
"metrics": {
...
"costs": {
"model.vehicles.cost_per_hour": 18.911111111111111,
"model.vehicles.cost_per_kilometer": 33.53,
"model.shipments.penalty_cost": 5
}
}
}
تمثّل القيمة model.shipments.penalty_cost
التكلفة المتكبّدة بسبب عمليات الشحن التي تم تخطّيها. تعرض السمة skippedShipments
الشحنات التي تم تخطّيها.
في هذا المثال، يتم تخطّي model.shipments[1]
فقط في طلب المثال.
تبلغ تكلفة المخالفة في model.shipments[1]
5 وحدات، وهو ما يتطابق مع المفتاح
model.shipments.penalty_cost
في نموذج الردّ. إنّ قيمة الشحنة المنخفضة
penaltyCost
مقارنةً بقيمة Vehicle
البالغة 40.0 costPerHour
و10.0
costPerKilometer
تجعل تخطّي الشحنة أكثر فعالية من حيث التكلفة من إكمالها.
موضوع متقدّم: التكاليف والقيود المرنة
تمثّل العديد من خصائص رسائل OptimizeToursRequest
(REST وgRPC) قيودًا مرنة، وهي قيود تتكبّد تكلفة عند عدم استيفائها.
على سبيل المثال، تتضمّن قيود المركبة LoadLimit
(REST، gRPC) السمتَين softMaxLoad
وcostPerUnitAboveSoftMax
. ويؤدي ذلك إلى تكلفة تتناسب مع وحدات التحميل التي تتجاوز softMaxLoad
، ما يسمح بتجاوز الحدّ فقط إذا كان ذلك منطقيًا من ناحية التكلفة.
وبالمثل، تحتوي قيود TimeWindow
(REST وgRPC) على السمتَين soft_start_time
وsoft_end_time
، مع السمتَين cost_per_hour_before_soft_start_time
وcost_per_hour_after_soft_end_time
المقابلتَين اللتين يتم تحمّلهما استنادًا إلى مدى حدوث الحدث المقيد مبكرًا أو متأخرًا مقارنةً بـ TimeWindow
.
كما هو الحال مع جميع مَعلمات نموذج التكلفة، يتم التعبير عن تكاليف القيود المرنة بوحدات غير بعدية مماثلة لمَعلمات التكلفة الأخرى.
يتم تناول قيود LoadLimit
بالتفصيل في مقالة
متطلبات التحميل والحدود. يتم تناول قيود TimeWindow
بالتفصيل
في قيود الفترة الزمنية للاستلام والتسليم.