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