ההודעה OptimizeToursRequest (REST, gRPC) מכילה מספר מאפיינים שקשורים לעלויות. ביחד, פרמטרי העלות האלה מייצגים את מודל העלויות של הבקשה. מודל העלויות מתעד רבות ממטרות האופטימיזציה ברמה הגבוהה של הבקשה, כמו:
- העדפה של מסלולים מהירים יותר
Vehicleעל פני מסלולים קצרים יותר, או להיפך - החלטה אם העלות של מסירת
Shipmentשווה לערך של השלמתShipment - ביצוע איסופים ומשלוחים בחלונות זמן רק אם זה משתלם מבחינה כלכלית
Vehicle.costPerHour נחשבת זהה ליחידת עלות אחת שהוקצתה ל-Vehicle.costPerKilometer ולכל פרמטר עלות אחר ב-ShipmentModel. כל משתמש ב-Route Optimization מגדיר את המשמעות של יחידת עלות על סמך תרחיש השימוש שלו.
דוגמה לבקשה עם עלויות
{ "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 מפורטות במאמר הגבלות על חלונות זמן לאיסוף ולמשלוח.