ההודעה 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
מוסברות בפירוט במאמר Load Demands and Limits. TimeWindow
מפורטות במאמר הגבלות על חלונות זמן לאיסוף ולמשלוח.