אפשר לפרק את המסלול של רכב, לאורך ציר הזמן, באופן הבא (אנחנו מניחים שיש n ביקורים):
| | | | | T[2], | | |
| Transition | Visit #0 | | | V[2], | | |
| #0 | aka | T[1] | V[1] | ... | V[n-1] | T[n] |
| aka T[0] | V[0] | | | V[n-2],| | |
| | | | | T[n-1] | | |
^ ^ ^ ^ ^ ^ ^ ^
vehicle V[0].start V[0].end V[1]. V[1]. V[n]. V[n]. vehicle
start (arrival) (departure) start end start end end
חשוב לדעת שיש הבדל בין:
- 'אירועים מדויקים', כמו תחילת הנסיעה וסיום הנסיעה ותחילת הביקור וסיום הביקור (כלומר הגעה ויציאה). הם מתרחשים בשנייה נתונה.
- 'מרווחי זמן', כמו הביקורים עצמם והמעבר בין הביקורים. לפעמים מרווחי הזמן יכולים להיות באורך אפס, כלומר להתחיל ולהסתיים באותה שנייה, אבל לרוב הם באורך חיובי.
משתנים:
- אם יש n ביקורים, יש n+1 מעברים.
- ביקור תמיד מוקף במעבר לפניו (באותו אינדקס) ובמעבר אחריו (האינדקס + 1).
- אחרי התנעת הרכב תמיד מופיע המעבר מס' 0.
- מעבר #n מופיע תמיד לפני סיום הרכב.
בהמשך, נסביר מה קורה במהלך Transition
ו-Visit
:
---+-------------------------------------+-----------------------------+-->
| TRANSITION[i] | VISIT[i] |
| | |
| * TRAVEL: the vehicle moves from | PERFORM the visit: |
| VISIT[i-1].departure_location to | |
| VISIT[i].arrival_location, which | * Spend some time: |
| takes a given travel duration | the "visit duration". |
| and distance | |
| | * Load or unload |
| * BREAKS: the driver may have | some quantities from the |
| breaks (e.g. lunch break). | vehicle: the "demand". |
| | |
| * WAIT: the driver/vehicle does | |
| nothing. This can happen for | |
| many reasons, for example when | |
| the vehicle reaches the next | |
| event's destination before the | |
| start of its time window | |
| | |
| * DELAY: *right before* the next | |
| arrival. E.g. the vehicle and/or | |
| driver spends time unloading. | |
| | |
---+-------------------------------------+-----------------------------+-->
^ ^ ^
V[i-1].end V[i].start V[i].end
לבסוף, כך אפשר לארגן את TRAVEL, breakS, DELAY ו-WAIT במהלך מעבר.
- הן לא חופפות.
- הערך של DELAY הוא ייחודי וחייב להיות תקופה רציפה של זמן ממש לפני הביקור הבא (או סיום הנסיעה ברכב). לכן, מספיק לדעת מהו משך ההשהיה כדי לדעת את שעת ההתחלה ושעת הסיום.
- קטעי ה-breakS הם רציפים ולא חופפים. התגובה מציינת את שעת ההתחלה ואת משך הזמן של כל הפסקה.
- TRAVEL ו-WAIT הם "ניתנים לחיזוי": אפשר להפריע להם כמה פעמים במהלך המעבר הזה. הלקוחות יכולים להניח שהנסיעות מתבצעות 'בהקדם האפשרי', וההגדרה 'המתנה' ממלאת את הזמן שנותר.
דוגמה (מורכבת):
TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
|| | | | | | | ||
|| T | B | T | | B | | D ||
|| r | r | r | W | r | W | e ||
|| a | e | a | a | e | a | l ||
|| v | a | v | i | a | i | a ||
|| e | k | e | t | k | t | y ||
|| l | | l | | | | ||
|| | | | | | | ||
--++-----------------------------------------------------------------++-->
ייצוג JSON |
---|
{ "vehicleIndex": integer, "vehicleLabel": string, "vehicleStartTime": string, "vehicleEndTime": string, "visits": [ { object ( |
שדות | |
---|---|
vehicleIndex |
הרכב שמבצע את המסלול, מזוהה לפי האינדקס שלו במקור |
vehicleLabel |
תווית הרכב שמבצע את המסלול הזה, שווה ל- |
vehicleStartTime |
השעה שבה הרכב מתחיל את המסלול. חותמת זמן בפורמט UTC 'Zulu' של RFC3339, עם רזולוציה של ננו-שנייה ועד תשע ספרות עשרוניות. דוגמאות: |
vehicleEndTime |
השעה שבה הרכב מסיים את המסלול. חותמת זמן בפורמט UTC 'Zulu' של RFC3339, עם רזולוציה של ננו-שנייה ועד תשע ספרות עשרוניות. דוגמאות: |
visits[] |
רצף מסודר של ביקורים שמייצג מסלול. הביקורים[i] הם הביקור ה-i במסלול. אם השדה הזה ריק, הרכב נחשב כלא בשימוש. |
transitions[] |
רשימה ממוינת של מעברים במסלול. |
hasTrafficInfeasibilities |
כאשר המדיניות
סביר להניח שהגעה אל next_visit תתרחש מאוחר יותר מחלון הזמן הנוכחי שלה בגלל האומדן המוגדל של זמן הנסיעה |
routePolyline |
הייצוג המקודד של הנתיב באמצעות קו פוליגוני. השדה הזה מאוכלס רק אם השדה |
breaks[] |
ההפסקות שתוזמנו לרכב שמבצע את המסלול הזה. הרצף |
metrics |
מדדים לגבי משך הזמן, המרחק והעומס של המסלול הזה. השדות של |
routeCosts |
העלות של המסלול, לפי פירוט בשדות הבקשה שקשורים לעלויות. המפתחות הם נתיבים של פרוטו, ביחס לקלט OptimizeToursRequest, למשל 'model.shipments.pickups.cost', והערכים הם העלות הכוללת שנוצרה על ידי שדה העלות התואם, שנצברה לאורך המסלול כולו. במילים אחרות, costs["model.shipments.pickups.cost"] הוא הסכום של כל עלויות האיסוף במסלול. כל העלויות שמוגדרות במודל מדווחות כאן בפירוט, למעט עלויות שקשורות למאפייני מעבר, שמדווחות רק באופן מצטבר נכון ל-2022. אובייקט שמכיל רשימה של |
routeTotalCost |
העלות הכוללת של המסלול. הסכום של כל העלויות במפת העלויות. |
כניסה
ביקור שבוצע במהלך מסלול. הביקור הזה תואם לאיסוף או למשלוח של Shipment
.
ייצוג ב-JSON |
---|
{
"shipmentIndex": integer,
"isPickup": boolean,
"visitRequestIndex": integer,
"startTime": string,
"loadDemands": {
string: {
object ( |
שדות | |
---|---|
shipmentIndex |
אינדקס של השדה |
isPickup |
אם הערך הוא True, הביקור תואם לאיסוף של |
visitRequestIndex |
אינדקס של |
startTime |
השעה שבה מתחיל הביקור. חשוב לדעת שהרכב עשוי להגיע למיקום הביקור לפני המועד הזה. הזמנים תואמים ל- חותמת זמן בפורמט UTC 'Zulu' של RFC3339, עם רזולוציה של ננו-שנייה ועד תשע ספרות עשרוניות. דוגמאות: |
loadDemands |
הביקוש הכולל לעומס על הביקורים כסכום המשלוח ובקשת הביקור אובייקט שמכיל רשימה של |
detour |
זמן עקיפה נוסף עקב המשלוח שנבדק במסלול לפני הביקור, וזמן ההמתנה הפוטנציאלי שנגרם בגלל חלונות הזמן. אם הביקור הוא משלוח, המעקף מחושב מהביקור המתאים באיסוף עצמי והוא שווה ל:
אחרת, הוא מחושב מהרכב
משך זמן בשניות עם עד תשע ספרות עשרוניות, שמסתיים ב-' |
shipmentLabel |
עותק של |
visitLabel |
עותק של |
injectedSolutionLocationToken |
אסימון אטום שמייצג מידע על מיקום הביקור. יכול להיות ששדה זה יאוכלס בביקורים של נתיבי התוצאות כאשר |
מעבר
מעבר בין שני אירועים במסלול. הצגת התיאור של ShipmentRoute
.
אם אין ברכב startLocation
או endLocation
, מדדי הנסיעה התואמים הם 0.
ייצוג ב-JSON |
---|
{ "travelDuration": string, "travelDistanceMeters": number, "trafficInfoUnavailable": boolean, "delayDuration": string, "breakDuration": string, "waitDuration": string, "totalDuration": string, "startTime": string, "routePolyline": { object ( |
שדות | |
---|---|
travelDuration |
משך הנסיעה במהלך המעבר. משך זמן בשניות עם עד תשע ספרות עשרוניות, שמסתיים ב-' |
travelDistanceMeters |
המרחק שעברתם במהלך המעבר. |
trafficInfoUnavailable |
כשמבקשים מידע על תנועה דרך |
delayDuration |
סכום משך הזמן של העיכובים שהוחלו על המעבר הזה. אם בכלל, העיכוב יתחיל בדיוק משך זמן בשניות עם עד תשע ספרות עשרוניות, שמסתיים ב-' |
breakDuration |
משך הזמן של ההפסקות במהלך המעבר, אם יש כאלה. פרטים על שעת ההתחלה והמשך של כל הפסקה נשמרים ב- משך זמן בשניות עם עד תשע ספרות עשרוניות, שמסתיים ב-' |
waitDuration |
משך הזמן של ההמתנה במהלך המעבר. משך ההמתנה תואם לזמן ההמתנה ללא פעילות ולא כולל את זמן ההפסקה. חשוב גם לזכור שזמן ההמתנה הזה עשוי להתחלק למספר מקטעים לא רציפים. משך זמן בשניות עם עד תשע ספרות עשרוניות, שמסתיים ב-' |
totalDuration |
משך המעבר הכולל, לצורך נוחות. הוא שווה ל-:
משך זמן בשניות עם עד תשע ספרות עשרוניות, שמסתיים ב-' |
startTime |
שעת ההתחלה של המעבר הזה. חותמת זמן בפורמט 'Zulu' בפורמט RFC3339 UTC, עם רזולוציה של ננו-שנייה ועד תשע ספרות אחרי הנקודה. דוגמאות: |
routePolyline |
הייצוג המקודד של המסלול המקודד במהלך המעבר. השדה הזה יאוכלס רק אם המדיניות |
vehicleLoads |
עומסי הרכב במהלך המעבר הזה, לכל סוג שמופיע ב- הטעינות במעבר הראשון הם הטעינות הראשוניות במסלול הרכב. לאחר כל ביקור, המערכת מוסיפה או מחסרת את ערך ה- אובייקט שמכיל רשימה של זוגות |
EncodedPolyline
הייצוג המקודד של קו מרובה. מידע נוסף על קידוד קווים פוליגונים זמין כאן: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.
ייצוג ב-JSON |
---|
{ "points": string } |
שדות | |
---|---|
points |
מחרוזת שמייצגת נקודות מקודדות של הקו הפוליגוני. |
הפסקה
נתונים שמייצגים את הביצוע של הפסקה.
ייצוג JSON |
---|
{ "startTime": string, "duration": string } |
שדות | |
---|---|
startTime |
שעת ההתחלה של ההפסקה. חותמת זמן בפורמט UTC 'Zulu' של RFC3339, עם רזולוציה של ננו-שנייה ועד תשע ספרות עשרוניות. דוגמאות: |
duration |
משך ההפסקה. משך זמן בשניות עם עד תשע ספרות עשרוניות, שמסתיים ב-' |