ההודעה 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
הנמוך של המשלוח בהשוואה לגרסאות 40.0 costPerHour
ו-10.0 של Vehicle
, ולכן משתלם יותר לדלג על המשלוח מאשר להשלים אותו.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
מופיע בקטע Load Demands and Limits (ביקוש ומגבלות). פירוט האילוצים על TimeWindow
מפורט בקטע מגבלות על חלון זמן האיסוף והמסירה.