تحتوي الرسالة 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 للشحنة مقارنةً بمعدل 40.0 costPerHour و10.0 costPerKilometer لـ Vehicle يجعل تخطي الشحنة أكثر فعالية من حيث التكلفة بدلاً من إكمالها.
موضوع متقدّم: التكاليف والقيود غير الصارمة
تمثّل العديد من خصائص رسائل 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 بالتفصيل في قيود نافذة وقت الاستلام والتسليم.