تحتوي رسالة 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
التكلفة المتكبّدة بسبب تخطّي الشحن. - تمثّل السمة
Shipment.VisitRequest.cost
تكلفة عملية استلام أو تسليم معيّنة، وتُستخدَم في المقام الأول للسماح بإجراء مفاضلات في التكلفة بين خيارات متعددة للاستلام أو التسليم لشحنة واحدة.
تستخدِم مَعلمات تكلفة Shipment
الوحدات غير المحدَّدة بالحجم نفسها المستخدَمة في مَعلمات تكلفة Vehicle
. إذا تجاوزت التكلفة المتكبّدة لإكمال Shipment
تكلفة العقوبة، لن يتم تضمين
Shipment
في أي مسار Vehicle
، بل سيظهر بدلاً من ذلك في قائمة
skipped_shipments
في رسالة الرد.
ShipmentModel
خصائص التكلفة
تتضمّن رسالة ShipmentModel
(REST وgRPC) سمة تكلفة واحدة، وهي globalDurationCostPerHour
. يتم تكبد هذه التكلفة بناءً على إجمالي الوقت
المطلوب حتى تكمل المركبات ShipmentRoute
. يؤدي زيادة قيمة
globalDurationCostPerHour
إلى منح الأولوية لإكمال جميع الشحنات في وقت أبكر.
سمات تكلفة الاستجابة في ميزة "تحسين المسار"
تحتوي رسالة 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
يتم تناول القيود بالتفصيل
في قيود فترة استلام وتسليم الطلبات.