تحتوي رسالة 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
يتم تناول القيود بالتفصيل
في قيود فترة استلام وتسليم الطلبات.