ניתן לפרק נתיב בכלי רכב, לאורך ציר הזמן, כך (אנחנו מניחים שיש 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 במהלך מעבר.
- אין חפיפה ביניהם.
- משך העיכוב הוא ייחודי וחייב להיות פרק זמן רציף לפני הביקור הבא (או סיום הנסיעה). לכן, מספיק לדעת מהו משך ההשהיה כדי לדעת את שעת ההתחלה ושעת הסיום.
- קטעי ה-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 |
השעה שבה הרכב מתחיל את המסלול. חותמת זמן ב-RFC3339 UTC 'Zulu' בפורמט של רזולוציה של ננו-שנייה ועד תשע ספרות עשרוניות. דוגמאות: |
vehicleEndTime |
השעה שבה הרכב מסיים את המסלול. חותמת זמן ב-RFC3339 UTC 'Zulu' בפורמט של רזולוציה של ננו-שנייה ועד תשע ספרות עשרוניות. דוגמאות: |
visits[] |
רצף מסודר של ביקורים שמייצג מסלול. ביקורים[i] הוא הביקור ה-i במסלול. אם השדה הזה ריק, הרכב נחשב לא בשימוש. |
transitions[] |
רשימה ממוינת של מעברים במסלול. |
hasTrafficInfeasibilities |
כאשר המדיניות
ההגעה אל next_visit ככל הנראה תתרחש מאוחר יותר מחלון הזמן הנוכחי שלה, עקב אומדן זמן הנסיעה המוגדל |
routePolyline |
הייצוג המקודד של הנתיב באמצעות קו פוליגוני. השדה הזה יאוכלס רק אם המדיניות |
breaks[] |
נקבעו הפסקות זמניות בשירות של הרכב שמבצע את המסלול הזה. הרצף |
metrics |
מדדים לגבי משך הזמן, המרחק והעומס של המסלול הזה. השדות של |
routeCosts |
עלות המסלול, בחלוקה לפי שדות בקשות שקשורים לעלות. המפתחות הם נתיבי פרוטו, ביחס לקלט OptimizeToursRequest, למשל. 'model.shipments.pickups.cost', והערכים שם הם העלות הכוללת שנוצרה על ידי שדה העלות התואם, שמצטברת לאורך כל המסלול. במילים אחרות, העלויות["model.shipments.pickups.cost"] הן הסכום של כל עלויות האיסוף לאורך המסלול. כל העלויות שמוגדרות במודל מדווחות כאן בפירוט, למעט עלויות שקשורות למאפייני מעבר, שמדווחות רק באופן מצטבר נכון ל-2022. אובייקט שמכיל רשימה של |
routeTotalCost |
העלות הכוללת של המסלול. הסכום של כל העלויות במפת העלויות. |
כניסה
ביקור שבוצע במהלך מסלול. הביקור הזה תואם לאיסוף או למשלוח של Shipment
.
ייצוג JSON |
---|
{
"shipmentIndex": integer,
"isPickup": boolean,
"visitRequestIndex": integer,
"startTime": string,
"loadDemands": {
string: {
object ( |
שדות | |
---|---|
shipmentIndex |
אינדקס של השדה |
isPickup |
אם הערך הוא True, הביקור תואם לאיסוף של |
visitRequestIndex |
אינדקס של |
startTime |
השעה שבה מתחיל הביקור. לתשומת ליבכם: יכול להיות שהרכב יגיע במועד מוקדם יותר במיקום הביקור. הזמנים תואמים ל- חותמת זמן ב-RFC3339 UTC 'Zulu' בפורמט של רזולוציה של ננו-שנייה ועד תשע ספרות עשרוניות. דוגמאות: |
loadDemands |
הביקוש הכולל לעומס על הביקורים כסכום המשלוח ובקשת הביקור אובייקט שמכיל רשימה של |
detour |
זמן נוסף למעקף בגלל הביקורים במסלול לפני הביקור וזמני ההמתנה הפוטנציאליים כתוצאה מחלונות הזמן. אם הביקור הוא משלוח, המעקף מחושב מהביקור המתאים באיסוף עצמי והוא שווה ל:
אחרת, הוא מחושב מהרכב
משך זמן בשניות עם עד תשע ספרות עשרוניות, שמסתיים ב-' |
shipmentLabel |
עותק של |
visitLabel |
עותק של |
מעבר
מעבר בין שני אירועים במסלול. הצגת התיאור של 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 |
שעת ההתחלה של המעבר. חותמת זמן ב-RFC3339 UTC 'Zulu' בפורמט של רזולוציה של ננו-שנייה ועד תשע ספרות עשרוניות. דוגמאות: |
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 |
שעת ההתחלה של ההפסקה. חותמת זמן ב-RFC3339 UTC 'Zulu' בפורמט של רזולוציה של ננו-שנייה ועד תשע ספרות עשרוניות. דוגמאות: |
duration |
משך ההפסקה. משך זמן בשניות עם עד תשע ספרות עשרוניות, שמסתיים ב-' |