ה-Route Optimization API מחזיר מסלולים לכלי רכב בבקשה המתאימה. המערכת מקצה משלוחים לכלי רכב, או עשויה לדלג עליהם, בהתאם למאפייני הבקשה.
להודעת OptimizeToursResponse (REST, gRPC) יש שני מאפיינים ראשיים ברמה העליונה:
routes[]הם המסלולים של כל רכב עם המשלוחים שהוקצו לו. כלRouteמכיל מדדים שמשקפים את המאפיינים של המסלול הספציפי הזה.metricsהם מדדים מצטברים של התגובה כולה, בכל כלי הרכב ותוכניות המסלולים. המדדים ברמה העליונה מכילים את אותם מאפיינים כמו המדדים לכל מסלול, והערכים שלהם מצטברים מכל המסלולים.
יכול להיות שחלק מהנכסים לא יאוכלסו תמיד, בהתאם לתוצאות האופטימיזציה:
skippedShipments[]מציגה משלוחים שלא מתבצעים על ידי אף כלי רכב. אפשר לדלג על משלוח אם אי אפשר לבצע אותו במסגרת האילוצים שצוינו, או אם העלות של ביצוע המשלוח חורגת מעלות העונש. לדוגמה, אםtimeWindowשל איסוף או מסירה של משלוח צר מאוד, יכול להיות שלא ניתן יהיה לבצע את הביקור במסגרת חלון הזמן הנדרש, או שהביקור לא יהיה משתלם מבחינה כלכלית.- השדה
validationErrors[]מציין שגיאות שגורמות לכך שהבקשה לא חוקית או שלא ניתן לפתור אותה כשהערך של השדהsolvingModeבבקשה מוגדר ל-VALIDATE_ONLY. במצבDEFAULT_SOLVEרגיל, שגיאות אימות יופיעו בהודעת שגיאה במקום בגוף התגובה. הערה:VALIDATE_ONLYפתרון מצב יכול לדווח על מספר שגיאות בו-זמנית, וזה שימושי לניפוי באגים מהיר של בקשות.
מאפייני מסלול
כל רשומה ב-routes[] היא הודעת ShipmentRoute (REST, gRPC). כל ShipmentRoute מייצג את הקצאת המסלול לרכב מסוים מהבקשה. מאפייני ShipmentRoute חשובים שקשורים ל-Vehicle התואם כוללים:
vehicleIndexהוא האינדקס שמתחיל באפס שלVehicleבהודעת הבקשה המתאימה. בתגובות ל-REST, המאפיין הזה מושמט כשהערך הוא אפס.vehicleStartTimeהוא המועד שבו הרכב חייב להתחיל את המסלול.vehicleEndTimeהוא השעה שבה הרכב צפוי לסיים את המסלול.
בתגובה, routes ייראה כך:
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
...
],
"transitions": [
...
],
"metrics": {
...
},
...
}
],
...
}
כל ShipmentRoute כולל רשימה ממוינת של visits שהרכב יסיים. כל Visit (REST, gRPC) מייצג VisitRequest (REST, gRPC) מהבקשה המתאימה. בין המאפיינים החשובים של Visit:
shipmentIndexהוא האינדקס שמתחיל באפס של המשלוח שהביקור הזה שייך אליו בבקשה המתאימה.- הערך של
isPickupהוא true כשמדובר בביקור לאיסוף, ו-false כשמדובר בביקור למשלוח. התשובות של ה-REST משמיטים את המאפיין הזה כשהערך הוא false. visitRequestIndexהוא האינדקס שמתחיל בספרה אפס של ה-VisitRequestמ-Shipment.pickupsאו מ-Shipment.deliveriesבבקשה המתאימה ש-Visitמייצג. בתשובות ל-REST, המאפיין הזה מושמט כשהערך שלו הוא אפס.startTimeהיא השעה שבה הביקור צפוי להתחיל.loadDemandsממפה את סוג העומס לכמות העומס שנדרשת כדי להשלים את ה-Visit. הסכומים של עומסי המשאיות הם שליליים בביקורים לצורך מסירה, והם מייצגים את העומס שהוסרה מהרכב.
דוגמה ל-Visit:
{
"routes": [
{
...
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
...
],
},
...
],
...
}
כל ShipmentRoute כולל רשימה מסודרת של transitions שמייצגים נסיעה בין visits ברכב נתון. מאפיינים חשובים של הודעות Transition (REST, gRPC) כוללים:
startTimeהוא הזמן שבו הרכב יתחיל לבצע את המעבר.travelDurationהוא משך הזמן שבו הרכב צריך לנסוע כדי להשלים את המעבר.travelDistanceMetersהוא המרחק במטרים שהרכב צריך לנסוע כדי להשלים את המעבר.trafficInfoUnavailableמציין אם נתוני התנועה זמינים למעבר.- הערך
waitDurationמייצג את זמן ההמתנה של הרכב לפני שהוא יכול להתחיל אתVisitהבא. יכול להיות שהעלות הזו נובעת מstart_timeשלVisitהבא. totalDurationהוא משך הזמן הכולל של המעבר, כולל זמני הנסיעה, ההמתנה, ההפסקה והעיכוב.- השדה
vehicleLoadsממפה את סוג העומס לכמות העומס שרוכב על הרכב במהלך המעבר הזה.
דוגמה ל-Transition:
{
"routes": [
{
...
"transitions": [
...
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
...
],
...
}
],
...
}
למידע נוסף על הקשר בין vists ל-transitions, ראו אופטימיזציה של הזמנות איסוף ומשלוח ומאמרי העזרה של ShipmentRoute (REST, gRPC). מידע נוסף על המאפיינים routePolyline ו-routeToken בהודעה Transition זמין במאמר קווים פוליגונליים של מעבר ואסימוני מסלול.
מאפייני המדדים
ההודעה Metrics (REST, gRPC) מסכם את כל הפתרון.
אלה כמה מהמאפיינים החשובים של Metrics:
totalCostהיא העלות הכוללת שנצברה במהלך השלמת המסלולים. מידע נוסף על עלויות זמין במאמר פרמטרים של מודל עלות.usedVehicleCountהוא המספר הכולל של כלי הרכב שבהם נעשה שימוש בפתרון. יכול להיות שיהיו רכבים עם מסלולים ריקים אם האופטימיזטור יקבע שהשימוש בהם לא נחוץ.skippedMandatoryShipmentCountהוא מספר המשלוחים שדילגתם עליהם והם 'חובה'. במשלוח חובה לא מצויןpenaltyCostשחל אם המשלוח מושמט. עדיין תוכלו לדלג על משלוחים חובה אם הביצועים שלהם לא ישיגו את היעדים במסגרת האילוצים שצוינו. מידע נוסף על עלויות זמין במאמר פרמטרים של מודל עלות.
מדדים נוספים מדווחים כהודעות AggregatedMetrics (REST, gRPC). סוג ההודעה AggregatedMetrics משמש לנכס Metrics.aggregatedRouteMetrics ולנכס ShipmentRoute.metrics, כאשר Metrics.aggregatedRouteMetrics מכיל מדדים שנצברו מכל ה-ShipmentRoute ב-OptimizeToursResponse. כל נכס ShipmentRoute.metrics מכיל מדדים לגבי ShipmentRoute הספציפי הזה.
בין המאפיינים החשובים של AggregatedMetrics:
performedShipmentCountהוא מספר המשלוחים שבוצעו על ידי כלי רכב לאורך כל המסלולים שלהם.travelDurationהוא משך הזמן הכולל שבו כלי הרכב נמצאים בתנועה במהלך השלמת המסלולים שלהם.waitDurationהוא משך הזמן הכולל שבו כלי הרכב ממתינים בזמן השלמת המסלולים שלהם.delayDurationהוא זמן העיכוב הכולל של כלי הרכב. בדרך כלל הערך הוא אפס, אלא אם נעשה שימוש ב-TransitionAttributesבבקשה.breakDurationהוא משך הזמן הכולל שכלי הרכב מבלים בהפסקות במהלך השלמת המסלולים שלהם.visitDurationהוא משך הזמן הכולל שבו כלי הרכב מבצעים ביקורים במסגרת המסלולים שלהם. זהו למעשה הסכום של כל הערכים שלVisitRequest.durationעבורVisitRequestשתואם ל-Visitשהוקצה לרכב הרלוונטי.totalDurationהוא משך הזמן הכולל שנדרש כדי להשלים את המסלולים של כלי הרכב.travelDistanceMetersהוא המרחק הכולל שכלי הרכב עברו במהלך הנסיעה במסלולים שלהם.maxLoadsממפה את סוגי העומסים לכמות העומס המקסימלית שכלי הרכב נושאים בכל נקודה במסלולים שלהם.
דוגמה להודעת Metrics:
{
"routes": [
...
],
"metrics": {
"aggregatedRouteMetrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"usedVehicleCount": 1,
"earliestVehicleStartTime": "2024-02-13T00:00:00Z",
"latestVehicleEndTime": "2024-02-13T00:38:42Z",
"totalCost": 18.603,
"costs": {
"model.vehicles.cost_per_kilometer": 18.603
}
}
}
דוגמה מלאה
דוגמה מלאה לתגובה לבקשה מ-יצירת בקשה:
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
{
"startTime": "2024-02-13T00:19:31Z",
"detour": "0s"
}
],
"transitions": [
{
"travelDuration": "0s",
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2024-02-13T00:00:00Z"
},
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
{
"travelDuration": "1151s",
"travelDistanceMeters": 9599,
"waitDuration": "0s",
"totalDuration": "1151s",
"startTime": "2024-02-13T00:19:31Z"
}
],
"metrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"routeCosts": {
"model.vehicles.cost_per_kilometer": 18.603
},
"routeTotalCost": 18.603
}
],
"metrics": {
"aggregatedRouteMetrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"usedVehicleCount": 1,
"earliestVehicleStartTime": "2024-02-13T00:00:00Z",
"latestVehicleEndTime": "2024-02-13T00:38:42Z",
"totalCost": 18.603,
"costs": {
"model.vehicles.cost_per_kilometer": 18.603
}
}
}