הערה להפקה
כדי לפשט את המדריך, השתמשנו ב-REST וב-JSON. עם זאת, בסביבת הייצור מומלץ להשתמש ב-gRPC ובספריות הלקוח כדי לשפר את הביצועים. מידע נוסף זמין במאמר ספריות הלקוח של Route Optimization API.
אחרי ששולחים את הבקשה בשליחת הבקשה הראשונה, הכלי להצעת אופטימיזציה מחזיר OptimizeToursResponse. התשובה הזו היא תוכנית המסלול שהנהג צריך לפעול לפיה. במדריך הזה מוסבר איך לקרוא אותו.
סיכום תוכנית המסלול
בתרחיש של מעון היום לכלבים, כלי האופטימיזציה מקצה את כלב ההרים השוויצרי ואת הצ'יוואווה לרכב המסחרי, ומדלג על הרועה הגרמני. תוכנית המסלול של הנהג:
- התחלת משמרת בשעה 7:55 במעון היום.
- אוספים את כלב ההרים הברנזי ליד מגדל קויט בשעה 08:20.
- אוספים את הצ'יוואווה בפארק South Sunset Playground בשעה 08:58.
- חוזרים למעון בשעה 9:24 ומחכים עד שחלון ההורדה נפתח בשעה 9:30.
- להוריד את כלב ההרים השוויצרי בשעה 9:30.
- להוריד את הצ'יוואווה ב-09:35.
- סיום המשמרת ב-09:40.
המסלול עולה 147.22$, כולל קנס של 100 $על דילוג על הרועה הגרמני.
כדי לבדוק את התוצאות, משווים את התשובה שקיבלתם לתשובה המלאה לדוגמה. יכול להיות שהתוצאות יהיו שונות במקצת, כי זמני הנסיעה והמרחקים תלויים בנתוני הכבישים הנוכחיים.
דוגמה לתשובה מלאה
{ "routes": [ { "vehicleStartTime": "2024-02-13T15:55:04Z", "vehicleEndTime": "2024-02-13T17:40:00Z", "visits": [ { "isPickup": true, "startTime": "2024-02-13T16:20:00Z", "detour": "0s", "shipmentLabel": "Bernese mountain dog", "visitType": "PICKUP_SHIPMENT" }, { "shipmentIndex": 1, "isPickup": true, "startTime": "2024-02-13T16:58:12Z", "detour": "2600s", "shipmentLabel": "Chihuahua", "visitType": "PICKUP_SHIPMENT" }, { "startTime": "2024-02-13T17:30:00Z", "detour": "2297s", "shipmentLabel": "Bernese mountain dog", "visitType": "DELIVER_SHIPMENT" }, { "shipmentIndex": 1, "startTime": "2024-02-13T17:35:00Z", "detour": "656s", "shipmentLabel": "Chihuahua", "visitType": "DELIVER_SHIPMENT" } ], "transitions": [ { "travelDuration": "1496s", "travelDistanceMeters": 7082, "waitDuration": "0s", "totalDuration": "1496s", "startTime": "2024-02-13T15:55:04Z" }, { "travelDuration": "1992s", "travelDistanceMeters": 16589, "waitDuration": "0s", "totalDuration": "1992s", "startTime": "2024-02-13T16:25:00Z" }, { "travelDuration": "1252s", "travelDistanceMeters": 7860, "waitDuration": "356s", "totalDuration": "1608s", "startTime": "2024-02-13T17:03:12Z" }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2024-02-13T17:35:00Z" }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2024-02-13T17:40:00Z" } ], "metrics": { "performedShipmentCount": 2, "travelDuration": "4740s", "waitDuration": "356s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "6296s", "travelDistanceMeters": 31531, "performedShipmentPenaltyCostSum": 2000 }, "routeCosts": { "model.vehicles.cost_per_hour": 47.22 }, "routeTotalCost": 47.22, "vehicleFullness": { "maxFullness": 0.3497777777777778, "activeSpan": 0.3497777777777778 } } ], "skippedShipments": [ { "index": 2, "label": "German shepherd", "penaltyCost": 100 } ], "metrics": { "aggregatedRouteMetrics": { "performedShipmentCount": 2, "travelDuration": "4740s", "waitDuration": "356s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "6296s", "travelDistanceMeters": 31531, "performedShipmentPenaltyCostSum": 2000 }, "usedVehicleCount": 1, "earliestVehicleStartTime": "2024-02-13T15:55:04Z", "latestVehicleEndTime": "2024-02-13T17:40:00Z", "totalCost": 147.22, "costs": { "model.vehicles.cost_per_hour": 47.22, "model.shipments.penalty_cost": 100 } } }
מבנה התשובה
OptimizeToursResponse כולל שני רכיבים עיקריים:
-
routes: תוכנית המסלול לכל רכב בצי, כולל הסדר והזמנים של כל איסוף ומשלוח. יש לכם מסחרית אחת, אז יש תוכנית מסלול אחת. -
metrics: סיכום של כל תוכנית המסלול, כולל העלות הכוללת, משך הזמן והמרחק.
מכיוון שהאופטימיזציה מדלגת על הרועה הגרמני, התשובה כוללת גם את skippedShipments.
בקטעים הבאים מוסבר איפה אפשר למצוא כל פרט בסיכום של תוכנית המסלול בתשובה.
איזה רכב נוסע באיזה מסלול?
האופטימיזציה יוצרת תוכנית מסלול (המערך routes) שתואמת לסדר של vehicles בבקשה.
השדה vehicleIndex מזהה כל רכב על סמך המיקום שלו, שמתחיל מ-0. במקרה של המסחרית, המיקום הוא 0. השדות vehicleStartTime ו-vehicleEndTime מורים לנהג מתי להתחיל ומתי לסיים את המשמרת.
Route Optimization API מחזיר חותמות זמן ב-UTC, שמסומנות בסיומת Z, בלי קשר להפרש בבקשה. כדי לקבל את השעה בסן פרנסיסקו, צריך להפחית 8 שעות. לרכב המסחרי, המשמרת נמשכת מ-7:55 עד 9:40, כמו שמוצג בדוגמת הקוד הבאה.
{
"routes": [
{
// "vehicleIndex": 0, // Omitted in actual JSON response because it's 0
"vehicleStartTime": "2024-02-13T15:55:04Z",
"vehicleEndTime": "2024-02-13T17:40:00Z",
...
}
]
...
}
מה סדר האיסוף וההורדה?
בכל מסלול, המערך visits מכיל את כל האיסופים והמשלוחים של הרכב שהוקצה בסדר כרונולוגי.
הערך של shipmentIndex בכל ביקור הוא המיקום של המשלוח בבקשה, החל מ-0: 0 הוא כלב ההרים השוויצרי ו-1 הוא הצ'יוואווה. בשדה shipmentLabel מוצגת התווית שהגדרתם לכל משלוח.
כדי להבחין בין איסוף לבין הורדה (או מסירה), אפשר לבדוק את השדות visitType או isPickup:
-
visitType: מגדיר במפורש את פעולת הביקור.- איסוף:
visitType="PICKUP_SHIPMENT" - משלוח:
visitType="DELIVER_SHIPMENT"
- איסוף:
-
isPickup: שדה עזר בוליאני.- איסוף:
isPickup=true - משלוח:
isPickup=false(לא נכלל ב-JSON)
- איסוף:
כדי לקבוע את רצף האירועים המדויק ואת זמן ההגעה הצפוי לכל מיקום, קוראים את המערך visits לפי הסדר. בטבלה הבאה מוצגת הפעולה של תוכנית הניתוב על סמך הסדר והערכים של השדות shipmentIndex, isPickup או visitType ו-startTime.
| רצף | ערך של shipmentIndex |
ערך של isPickup או visitType |
ערך של startTime (UTC) |
פעולה |
|---|---|---|---|---|
| ביקור ראשון | 0 (לא נכלל ב-JSON) | נכון או PICKUP_SHIPMENT |
2024-02-13T16:20:00Z | לאסוף את כלב ההרים השוויצרי בשעה 8:20. |
| ביקור שני | 1 | נכון או PICKUP_SHIPMENT |
2024-02-13T16:58:12Z | לאסוף את הצ'יוואווה בשעה 8:58. |
| ביקור שלישי | 0 (לא נכלל ב-JSON) | False (מושמט) או DELIVER_SHIPMENT |
2024-02-13T17:30:00Z | להוריד את כלב ההרים הברנזי במעון היום לכלבים בשעה 9:30. |
| ביקור רביעי | 1 | False (מושמט) או DELIVER_SHIPMENT |
2024-02-13T17:35:00Z | להוריד את הצ'יוואווה במעון לכלבים בשעה 9:35. |
בדוגמת הקוד הבאה אפשר לראות איך התשובה מספקת את הרצף הזה:
{
"routes": [
{
"visits": [
{
// "shipmentIndex": 0, // Omitted in actual JSON response because it's 0
"isPickup": true,
"startTime": "2024-02-13T16:20:00Z",
"shipmentLabel": "Bernese mountain dog",
"visitType": "PICKUP_SHIPMENT"
},
{
"shipmentIndex": 1,
"isPickup": true,
"startTime": "2024-02-13T16:58:12Z",
"shipmentLabel": "Chihuahua",
"visitType": "PICKUP_SHIPMENT"
},
{
// "shipmentIndex": 0, // Omitted in actual JSON response because it's 0
// "isPickup": false, // Omitted in actual JSON response because it's false
"startTime": "2024-02-13T17:30:00Z",
"shipmentLabel": "Bernese mountain dog",
"visitType": "DELIVER_SHIPMENT"
},
{
"shipmentIndex": 1,
// "isPickup": false, // Omitted in actual JSON response because it's false
"startTime": "2024-02-13T17:35:00Z",
"shipmentLabel": "Chihuahua",
"visitType": "DELIVER_SHIPMENT"
}
]
}
]
}
לכל ביקור יש גם visitRequestIndex, שהוא המיקום (החל מ-0) של אפשרות האיסוף או המסירה שהכלי לאופטימיזציה בחר למשלוח. לכל כלב בתרחיש הזה יש רק אפשרות אחת לאיסוף ואפשרות אחת להורדה, כך שהערך של visitRequestIndex הוא תמיד 0, והתגובה משמיטה אותו.
מה קורה בין הביקורים?
בכל מסלול, המערך transitions מפרט את פרטי הנסיעה בין הביקורים. למרות ש-visits ו-transitions הן רשימות נפרדות, הן משתלבות זו בזו לאורך זמן, באופן הבא:
transitions[0](נסיעה מההתחלה עד לביקור הראשון)visits[0](ביקור ראשון)transitions[1](נסיעה מהביקור הראשון לביקור השני)visits[1](ביקור שני)...visits[N-1](הביקור האחרון, כאשר N הוא המספר הכולל של הביקורים)transitions[N](נסיעה מהביקור האחרון עד לסיום)
כדי לעקוב אחרי ציר הזמן של המסלול, אפשר להסתכל על השדה startTime בשני המערכים. השדה startTime של מעבר הוא הזמן שבו הנהג מתחיל לנסוע, והשדה startTime של ביקור הוא הזמן שבו הנהג מתחיל את האיסוף או ההורדה.
בכל מעבר מוצגים זמן הנסיעה והמרחק הצפויים בין המיקומים.
בטבלה הבאה ממופים השדות transitions ו-visits לפעולות של המסלול הכרונולוגי בתרחיש של מעון היום לכלבים.
| רצף | שם השדה | ערך של startTime (UTC) |
פרטים | פעולה |
|---|---|---|---|---|
| המעבר הראשון | transitions[0] |
2024-02-13T15:55:04Z |
travelDuration: 1496stravelDistanceMeters: 7082 |
נוסעים 7 ק"מ במשך 25 דקות ממעון היום כדי לאסוף את כלב ההרים השוויצרי. המשמרת מתחילה בשעה 07:55. |
| ביקור ראשון | visits[0] |
2024-02-13T16:20:00Z |
shipmentIndex: 0 (לא נכלל ב-JSON)isPickup: True |
איסוף של כלב ההרים השוויצרי החל מהשעה 08:20. הביקור נמשך 5 דקות. |
| המעבר השני | transitions[1] |
2024-02-13T16:25:00Z |
travelDuration: 1992stravelDistanceMeters: 16589 |
נוסעים 17 ק"מ במשך 33 דקות ממגדל קויט כדי לאסוף את הצ'יוואווה החל מהשעה 08:25. |
| ביקור שני | visits[1] |
2024-02-13T16:58:12Z |
shipmentIndex: 1isPickup: True |
איסוף הצ'יוואווה החל מהשעה 08:58. הביקור נמשך 5 דקות. |
| המעבר השלישי | transitions[2] |
2024-02-13T17:03:12Z |
travelDuration: 1,252 שניותtravelDistanceMeters: 7,860waitDuration: 356 שניות |
נוסעים 8 ק"מ במשך 21 דקות מ-South Sunset Playground בחזרה למעון היום, החל מהשעה 09:03. מגיעים בשעה 09:24 וממתינים 6 דקות עד שחלון ההורדה נפתח. |
| ביקור שלישי | visits[2] |
2024-02-13T17:30:00Z |
shipmentIndex: 0 (לא נכלל ב-JSON)isPickup: False (לא נכלל ב-JSON) |
הורדת הכלב מסוג בובייה ברנז'ה במעון לכלבים החל מהשעה 9:30. משך הביקור: 5 דקות. |
| המעבר הרביעי | transitions[3] |
2024-02-13T17:35:00Z |
travelDuration: 0stravelDistanceMeters: 0 (מושמט ב-JSON) |
לא בנהיגה. מוכנים להוריד את הצ'יוואווה במעון ב-09:35. |
| ביקור רביעי | visits[3] |
2024-02-13T17:35:00Z |
shipmentIndex: 1isPickup: False (לא נכלל ב-JSON) |
להוריד את הצ'יוואווה במעון לכלבים החל מהשעה 9:35. הביקור נמשך 5 דקות. |
| המעבר החמישי | transitions[4] |
2024-02-13T17:40:00Z |
travelDuration: 0stravelDistanceMeters: 0 (לא נכלל ב-JSON) |
לא בנהיגה. הנהג מסיים את המשמרת בשעה 9:40. |
בדוגמת הקוד הבאה אפשר לראות איך התגובה מספקת את הרצף הזה ל-transitions[0] ול-transitions[1]:
{
"routes": [
{
"transitions": [
{
"travelDuration": "1496s",
"travelDistanceMeters": 7082,
"waitDuration": "0s",
"totalDuration": "1496s",
"startTime": "2024-02-13T15:55:04Z"
},
{
"travelDuration": "1992s",
"travelDistanceMeters": 16589,
"waitDuration": "0s",
"totalDuration": "1992s",
"startTime": "2024-02-13T16:25:00Z"
},
...
]
}
]
}
כמה עולה המסלול?
אתם יכולים לבדוק כמה שדות בתגובה, בהתאם לצורך שלכם בעלות של רכב ספציפי או בעלות הכוללת של כל צי הרכבים.
בטבלה הבאה מפורטות כל הדרכים שבהן אפשר למצוא את פרטי העלות בתשובה:
| הורה | פרמטר | היקף | תיאור |
|---|---|---|---|
ShipmentRoute |
routeCosts |
לכל מסלול | פירוט של רכיבי עלות ספציפיים (כמו עלות לשעה) של המסלול הספציפי הזה. |
routeTotalCost |
לכל מסלול | העלות הכוללת שחושבה למסלול הספציפי הזה. | |
Metrics |
totalCost |
סה"כ (כל המסלולים) | העלות הכוללת המצטברת של כל המסלולים בפתרון. |
costs |
סה"כ (כל המסלולים) | פירוט של רכיבי העלות המצטברים בכל המסלולים בפתרון. |
העלויות שמופיעות ב-routeCosts וב-costs משקפות את מגבלות העלות שציינתם בבקשה. למידע נוסף, קראו את המאמר מושג מפתח: מודל עלות.
בתרחיש הזה של מעון הכלבים, בגלל שדילגתם על משלוח, העלות לכל מסלול והעלות הכוללת המצטברת שונות. עלות המסלול כוללת רק את העלויות שמשויכות למסלול הספציפי הזה (שכר הנהג), ועלות הצבירה הכוללת כוללת גם את הקנס על המשלוח שדילגו עליו. בדוגמת הקוד הבאה אפשר לראות איפה הערכים האלה נמצאים בתגובה:
{
"routes": [
{
"vehicleStartTime": "2024-02-13T15:55:04Z",
"vehicleEndTime": "2024-02-13T17:40:00Z",
...
"routeCosts": {
"model.vehicles.cost_per_hour": 47.22
},
"routeTotalCost": 47.22
}
],
"metrics": {
"totalCost": 147.22,
"costs": {
"model.shipments.penalty_cost": 100,
"model.vehicles.cost_per_hour": 47.22
},
...
}
}
לפי תוכנית המסלול, הנהג מפעיל את הרכב מ-7:55 עד 9:40, כלומר כשעה ו-45 דקות (6,296 שניות). לפי התעריף שהגדרתם, 27 $לשעה, עלות המסלול היא 47.22$. מכיוון שהאופטימיזציה דילגה על המשלוח של הרועה הגרמני, היא מוסיפה עלות קנס של 100$, כך שהעלות הכוללת המצטברת היא 147.22$.
למה המערכת דילגה על משלוח?
האופטימייזר מפרט את כל המשלוחים שהוא לא מבצע במערך skippedShipments. הסיבה לדילוג על משלוח תלויה בהגדרה של penaltyCost:
- משלוחים חובה (ללא
penaltyCost): כלי האופטימיזציה אף פעם לא מדלג עליהם רק כי הם יקרים לביצוע. הוא מדלג על משלוח רק אם אי אפשר להתאים אותו לאף מסלול, למשל כי חלון הזמן שלו מתנגש עם משלוחים אחרים. - משלוחים אופציונליים (עם
penaltyCost): כלי האופטימיזציה יכול לדלג גם על המשלוחים האלה אם עלות הביצוע שלהם גבוהה מהקנס. אפשר להגדיר עלויות קנס שונות כדי לתעדף משלוחים מסוימים על פני אחרים.
בתרחיש הזה, חלון האיסוף של הרועה הגרמני מתנגש עם החלון של כלב ההרים השוויצרי. המרחק בין מגדל קויט לבין לנדס אנד הוא 25 דקות, ולכן הנהג לא יכול לבצע את שני האיסופים בטווח של 20 דקות. האופטימיזציה חייבת לדלג על אחד מהם. מכיוון שעלות הקנס של הרועה הגרמני נמוכה יותר (100$ לעומת 1,000 $ללקוח הרגיל), הכלי לאופטימיזציה מדלג עליו וצובר את הקנס בסך 100$.
בדוגמת הקוד הבאה מוצג האובייקט skippedShipments בתגובה:
{
...
"skippedShipments": [
{
"index": 2,
"label": "German shepherd",
"penaltyCost": 100
}
],
...
}
האובייקט skippedShipments בתשובה מכיל את השדות הבאים:
-
index: האינדקס מבוסס האפס של המשלוח בבקשה (2 למשלוח השלישי). -
label: התווית שציינתם בבקשה ("רועה גרמני"). -
penaltyCost: עלות הקנס שציינתם בבקשה, שה-API מוסיף לעלות הכוללת.
כדי למנוע מהכלי לאופטימיזציה לדלג על משלוח, צריך להקל על האילוץ שגורם להתנגשות. לדוגמה, אפשר לבקש מהבעלים של הרועה הגרמני חלון זמנים גמיש יותר לאיסוף, ואז לעדכן את timeWindows של האיסוף הזה בבקשה.
שדות התשובה בדוגמה
בטבלה הבאה מתוארים כל שדות התגובה שמוחזרים ב-OptimizeToursResponse של התרחיש לדוגמה. לא צריך להשתמש בכל שדה כדי להבין את תוכנית המסלול, אבל אפשר לנתח את השדות האלה כדי להחליט איך להתאים את OptimizeToursRequest לצרכים העסקיים. מידע נוסף זמין במאמר מחזור החיים של תוכנית המסלול.
אתם יכולים לסנן את התוכן לפי הורה או לפי חיפוש טקסט.
| הורה | פרמטר | סוג הנכס | תיאור |
|---|---|---|---|
OptimizeToursResponse |
routes |
מערך של אובייקטים (ShipmentRoute) |
השדה הזה מכיל את רשימת המסלולים שחושבו לכל רכב (אחד לכל רכב). בתרחיש הזה של מעון הכלבים, השדה הזה מכיל את תוכנית המסלול המפורטת של הרכב היחיד. |
metrics |
אובייקט (Metrics) |
הוא מכיל את המדדים הכוללים של הפתרון, שנאספו מכל המסלולים. בתרחיש הזה של מעון הכלבים, זהו סיכום העלויות ומשך הפעילות של היום. | |
skippedShipments |
מערך של אובייקטים (SkippedShipment) |
היא מכילה את רשימת המשלוחים שדילגו עליהם בפתרון. בתרחיש הזה, המערכת מדלגת על הכלב השלישי (רועה גרמני). | |
ShipmentRoute |
vehicleStartTime |
חותמת זמן | זה הזמן שבו הרכב מתחיל את המסלול שלו. בתרחיש הזה של מעון הכלבים, הנהג מתחיל לנסוע ברכב ההסעות בשעה 07:55. |
vehicleEndTime |
חותמת זמן | זה הזמן שבו הרכב מסיים את המסלול שלו. בתרחיש הזה של מעון הכלבים, הנהג מסיים את הנסיעה ברכב המסחרי בשעה 9:40. | |
visits |
מערך של אובייקטים (Visit) |
זו הרשימה המסודרת של האיסופים והמשלוחים במסלול. בתרחיש הזה של פנסיון לכלבים, זהו רצף האיסוף וההורדה של שני הכלבים. | |
transitions |
מערך של אובייקטים (Transition) |
זו הרשימה המסודרת של המרחק, זמן הנסיעה וזמן ההמתנה בין הביקורים. בתרחיש הזה של מעון הכלבים, מוצגים מרחק הנסיעה וזמן הנסיעה בין מגדל קויט, פארק השעשועים סאות' סאנסט והמעון. | |
metrics |
אובייקט (AggregatedMetrics) |
אלה המדדים הספציפיים למסלול היחיד הזה. בתרחיש של מעון היום לכלבים, אלה הנתונים הסטטיסטיים של הרכב הספציפי הזה. המדדים האלה מבוססים על העלויות שציינתם בבקשה. למידע נוסף, קראו את המאמר מושגי מפתח במודל העלות. | |
routeCosts |
אובייקט (מפה) | זהו פירוט של עלויות ספציפיות במסלול הזה. בתרחיש הזה של מעון הכלבים, מוצגת העלות שמחושבת לפי שכר הנהג בסך 27 $לשעה. | |
routeTotalCost |
מספר | זו העלות הכוללת של המסלול הספציפי הזה. בתרחיש הזה של מעון הכלבים, העלות הכוללת של המסלול של הרכב הזה היא 47.22. |
|
vehicleFullness |
אובייקט (VehicleFullness) |
זהו פירוט של מידת הקרבה של הרכב למגבלות התפעוליות שלו, כמו זמן, מרחק ועומס. בתרחיש הזה של מעון הכלבים, רק שעות ההתחלה והסיום של המשמרת מגבילות את הנהג, ולכן כלי האופטימיזציה מחשב את vehicleFullness בתור החלק של משך המסלול בפועל והזמן המקסימלי שזמין למשמרת של הנהג. |
|
Visit |
shipmentIndex |
מספר שלם | זהו האינדקס מבוסס האפס של המשלוח בבקשה המקורית. בתרחיש הזה של מעון הכלבים, הערך 0 מייצג את כלב ההרים הברנזי והערך 1 מייצג את הצ'יוואווה. |
isPickup |
בוליאני | הערך בשדה הזה הוא true אם הביקור הוא איסוף. בתרחיש של מעון הכלבים, הערך הוא true כשמגיעים לאסוף את הכלב, ו-false (או חסר) כשמגיעים להשאיר את הכלב במעון. | |
startTime |
חותמת זמן | זו שעת ההתחלה המשוערת של הביקור. בתרחיש של מעון היום לכלבים, זה קורה כשהנהג דופק בדלת. | |
detour |
משך הזמן | זהו הזמן הנוסף שהאופטימיזציה מוסיפה לנסיעה של המשלוח הספציפי הזה. סטייה היא ההבדל בין תוכנית המסלול בפועל לבין הנסיעה הישירה האידיאלית, אם לנהג אין משלוחים או משימות אחרות להשלים. בתרחיש הזה של מעון הכלבים, הביקור הראשון, שהוא איסוף הכלב מגזע ברנר זננהונד, כולל עיקוף של 0 כי הנהג נוסע ישירות ממעון הכלבים לאיסוף הזה. כדי לאסוף את הצ'יוואווה, זמן הנסיעה מתארך ב-43 דקות כי הנהג אוסף קודם את כלב ההרים הברנזי (ומבלה 5 דקות בהעמסה). |
|
shipmentLabel |
מחרוזת | זו התווית מהבקשה לכל משלוח. בתרחיש של מעון הכלבים, התוויות הן "צ'יוואווה" או "כלב הרים ברנזי". | |
visitType |
מחרוזת (Enum) | השדה הזה מציין את סוג הביקור, שיכול להיות PICKUP_SHIPMENT לאיסוף או DELIVER_SHIPMENT למשלוח. בתרחיש הזה, הערך הוא PICKUP_SHIPMENT או DELIVER_SHIPMENT. |
|
Transition |
travelDuration |
משך הזמן | זהו משך הנסיעה במהלך המעבר בין הביקורים. לדוגמה, בתרחיש הזה של מעון היום לכלבים, הנהג מבלה כ-25 דקות בנסיעה ממעון היום אל Coit Tower כדי לאסוף את כלב ההרים הברנזי. |
travelDistanceMeters |
מספר שלם | זה המרחק במטרים שהמשתמש עבר במהלך המעבר הזה. לדוגמה, בתרחיש של מעון היום לכלבים, הנהג נוסע 7 קילומטרים ממעון היום אל מגדל קויט כדי לאסוף את כלב ההרים הברנזי. | |
waitDuration |
משך הזמן | זה הזמן שבו הנהג ממתין לפני האיסוף או המשלוח הבא. בתרחיש הזה של מעון הכלבים, הערך הוא 6 דקות (356 שניות) למעבר השלישי, כי הנהג מגיע למעון לפני שחלון ההורדה נפתח בשעה 9:30. במעברים אחרים, הערך הוא 0. | |
totalDuration |
משך הזמן | זה משך הזמן הכולל של המעבר, כולל נסיעה והמתנה. לדוגמה, הנהג מבלה 25 דקות (25 דקות נסיעה ו-0 דקות המתנה) במעבר הראשון, ו-27 דקות (21 דקות נסיעה ו-6 דקות המתנה) במעבר השלישי בחזרה למעון. | |
startTime |
חותמת זמן | זה הזמן שבו הנסיעה מתחילה. הוא תואם לשעת הסיום של הביקור הקודם (או, במעבר הראשון, לשעת ההתחלה של הרכב). בתרחיש של מעון הכלבים, המעבר הראשון מתחיל בשעה 07:55 כשהנהג עוזב את המעון, והמעבר השני מתחיל בשעה 08:25 כשהנהג עוזב את מגדל קויט. | |
Metrics |
aggregatedRouteMetrics |
אובייקט (AggregatedMetrics) |
זהו סכום המדדים בכל המסלולים. בתרחיש הזה של מעון הכלבים, אלה המדדים הכוללים של הרכב היחיד שלכם. |
usedVehicleCount |
מספר שלם | זה מספר כלי הרכב שנעשה בהם שימוש בפתרון. בתרחיש הזה של מעון הכלבים, אתם משתמשים רק ברכב אחד. | |
earliestVehicleStartTime |
חותמת זמן | זו שעת ההתחלה המוקדמת ביותר מבין כל הרכבים. בתרחיש הזה של מעון יום לכלבים, המסלול של הרכב מתחיל בשעה 07:55. | |
latestVehicleEndTime |
חותמת זמן | זו שעת הסיום המאוחרת ביותר מבין כל הרכבים. בתרחיש הזה של מעון יום לכלבים, המסלול של הרכב מסתיים בשעה 9:40. | |
totalCost |
מספר | זו העלות הכוללת של הפתרון. בתרחיש הזה של מעון הכלבים, תוכנית המסלול כולה עולה 147.22 ליום (כולל שכר נהג בסך 47.22 וקנס על משלוח שדילגו עליו בסך 100). |
|
costs |
אובייקט (מפה) | זהו פירוט של העלות הכוללת לפי קטגוריה. בתרחיש הזה של מעון הכלבים, כלי האופטימיזציה חישב את עלות המסלול על סמך העלות לשעה ועלות הקנס על דילוג על הרועה הגרמני. | |
AggregatedMetrics |
performedShipmentCount |
מספר שלם | זה מספר המשלוחים שנותבו בהצלחה. בתרחיש הזה של מעון יום לכלבים, הנהג מסיע שני כלבים. |
travelDuration |
משך הזמן | זהו משך הזמן הכולל של הנסיעה. בתרחיש הזה של מעון הכלבים, הנהג נוסע במשך 79 דקות. | |
waitDuration |
משך הזמן | זהו משך הזמן הכולל של ההמתנה. בתרחיש הזה של מעון הכלבים, הנהג ממתין 6 דקות (356 שניות) במעון הכלבים עד שהחלון להורדת הכלבים נפתח. | |
delayDuration |
משך הזמן | זהו משך הזמן הנוסף שאתם מגדירים באמצעות מאפייני מעבר, כמו זמן ששמור לחנייה. בתרחיש הזה של מעון הכלבים, לא הגדרתם מאפייני מעבר בבקשה, ולכן הערך הזה הוא אפס. | |
breakDuration |
משך הזמן | זהו משך הזמן הכולל של ההפסקות. בתרחיש הזה של מעון הכלבים, אין הפסקות. | |
visitDuration |
משך הזמן | זהו משך הזמן הכולל שהוקדש לביצוע שירותים בביקורים. בתרחיש של הפנסיון לכלבים, משך הזמן הוא 20 דקות (5 דקות לכל ביקור, כפול 4 ביקורים). | |
totalDuration |
משך הזמן | זהו הסכום של כל רכיבי משך הזמן. בתרחיש הזה של מעון היום לכלבים, משך הזמן הכולל הוא 105 דקות (6,296 שניות). | |
travelDistanceMeters |
מספר שלם | זה המרחק הכולל של הנסיעה במטרים. בתרחיש הזה של מעון היום לכלבים, הנהג נוסע מרחק כולל של 31.5 ק"מ. | |
performedShipmentPenaltyCostSum |
כפול | זהו סכום עלויות הקנסות של כל המשלוחים שבוצעו. בתרחיש הזה, העלות היא 2000 כי הנהג אסף את הכלב מגזע בובייה ברנז'י ואת הצ'יוואווה (לכל אחד מהם יש עלות קנס של 1000). |
|
VehicleFullness |
maxFullness |
מספר | זהו יחס הניצול הגבוה ביותר בכל השדות של VehicleFullness. בתרחיש של מעון הכלבים, הערך הוא 0.35 כי הנהג מפעיל את הרכב רק במשך 105 דקות מכל משמרת הבוקר, שהוגדרה כ-5 שעות בבקשה. |
activeSpan |
מספר | זהו היחס בין אורך המשמרת הכולל של הנהג לבין שעות הפעילות של תוכנית המסלול. מספר נמוך יותר מציין שהנהג מבלה פחות זמן ביום העסקים בהפעלת הרכב. בתרחיש של מעון הכלבים, הערך הוא 0.35 כי הנהג מפעיל את הרכב במשך 105 דקות במהלך משמרת של 5 שעות. | |
SkippedShipment |
index |
מספר שלם | זהו האינדקס מבוסס האפס של המשלוח בבקשה המקורית. בתרחיש הזה, המספר 2 מייצג את הרועה הגרמני. |
label |
מחרוזת | זו התווית שציינתם למשלוח בבקשה. | |
penaltyCost |
מספר | זוהי עלות הקנס שאתם צוברים כשהאופטימיזציה מדלגת על המשלוח הזה. הוא תואם ל-penaltyCost שציינתם בבקשה. |