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