تحتوي رسالة 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]
فقط في نموذج الطلب.
تم تطبيق تكلفة عقوبة على 5 وحدات في model.shipments[1]
، ما يتطابق مع إجمالي مفتاح 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
بالتفصيل في القيود المفروضة على فترة الاستلام والتسليم.