ההודעה 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
s.
המאפיינים 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
מפורטים בפירוט במגבלות של חלונות זמן איסוף ואספקה.