אפשר לפרק את המסלול של כלי רכב לאורך ציר הזמן באופן הבא (אנחנו מניחים שיש 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 במהלך מעבר.
- הם לא חופפים.
- העיכוב הוא ייחודי וחייב להיות תקופה רצופה של זמן ממש לפני הביקור הבא (או סיום השימוש ברכב). לכן, מספיק לדעת את משך העיכוב כדי לדעת את שעת ההתחלה ושעת הסיום שלו.
- ההפסקות הן פרקי זמן רצופים שלא חופפים. בתגובה מצוינים שעת ההתחלה ומשך הזמן של כל הפסקה.
- הפעולות 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 |
השעה שבה הרכב מתחיל את המסלול שלו. הפורמט הוא RFC 3339, והפלט שנוצר תמיד יהיה בפורמט Z עם 0, 3, 6 או 9 ספרות אחרי הנקודה. אפשר להשתמש גם בהיסטים אחרים, לא רק ב-Z. דוגמאות: |
vehicleEndTime |
השעה שבה הרכב מסיים את המסלול. הפורמט הוא RFC 3339, והפלט שנוצר תמיד יהיה בפורמט Z עם 0, 3, 6 או 9 ספרות אחרי הנקודה. אפשר להשתמש גם בהיסטים אחרים, לא רק ב-Z. דוגמאות: |
visits[] |
רצף מסודר של ביקורים שמייצג מסלול. visits[i] הוא הביקור ה-i במסלול. אם השדה הזה ריק, הרכב נחשב כלא בשימוש. |
transitions[] |
רשימה מסודרת של מעברים במסלול. |
hasTrafficInfeasibilities |
אם הערך של ההגעה ל-next_visit צפויה לקרות מאוחר יותר מחלון הזמן הנוכחי שלה בגלל העלייה בהערכת זמן הנסיעה |
routePolyline |
ייצוג מקודד של הקו הפוליגוני של המסלול. השדה הזה יאוכלס רק אם השדה |
breaks[] |
הפסקות שמתוזמנות לרכב שמבצע את המסלול הזה. הרצף |
metrics |
מדדי משך, מרחק ועומס במסלול הזה. השדות של |
vehicleFullness |
השדה ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד. |
routeCosts |
עלות המסלול, מחולקת לפי שדות בקשה שקשורים לעלות. המפתחות הם נתיבי פרוטו, ביחס לקלט OptimizeToursRequest, לדוגמה, 'model.shipments.pickups.cost', והערכים הם העלות הכוללת שנוצרה על ידי שדה העלות המתאים, שנצברה לאורך המסלול כולו. במילים אחרות, העלות [costs["model.shipments.pickups.cost"]] היא סכום כל העלויות של האיסופים לאורך המסלול. כל העלויות שמוגדרות במודל מדווחות כאן בפירוט, למעט עלויות שקשורות ל-TransitionAttributes, שמדווחות רק באופן מצטבר החל מ-2022/01. |
routeTotalCost |
העלות הכוללת של המסלול. סכום כל העלויות במפת העלויות. |
כניסה
ביקור שמתבצע במהלך מסלול. הביקור הזה תואם לאיסוף עצמי או למשלוח של Shipment.
| ייצוג ב-JSON |
|---|
{ "shipmentIndex": integer, "isPickup": boolean, "visitRequestIndex": integer, "startTime": string, "loadDemands": { string: { object ( |
| שדות | |
|---|---|
shipmentIndex |
האינדקס של השדה |
isPickup |
אם הערך הוא True, הביקור תואם לאיסוף של |
visitRequestIndex |
אינדקס של |
startTime |
השעה שבה הביקור מתחיל. שימו לב שהרכב עשוי להגיע למיקום הביקור לפני הזמן הזה. השעות תואמות ל הפורמט הוא RFC 3339, והפלט שנוצר תמיד יהיה בפורמט Z עם 0, 3, 6 או 9 ספרות אחרי הנקודה. אפשר להשתמש גם בהיסטים אחרים, לא רק ב-Z. דוגמאות: |
loadDemands |
הביקוש הכולל לטעינת הביקור כסכום של המשלוח ובקשת הביקור |
detour |
זמן נוסף לעיקוף בגלל המשלוחים שבוקרו במסלול לפני הביקור ובגלל זמן ההמתנה הפוטנציאלי שנובע מחלונות הזמן. אם הביקור הוא מסירה, הסטייה מחושבת מביקור האיסוף התואם והיא שווה ל: אחרת, הוא מחושב מתוך |
shipmentLabel |
עותק של |
visitLabel |
עותק של |
visitType |
אופציונלי. מציין את סוג הביקור. ההגדרה הזו מחליפה את השדה |
injectedSolutionLocationToken |
טוקן אטום שמייצג מידע על מיקום הביקור. יכול להיות שהשדה הזה יאוכלס בביקורים של מסלולי התוצאות אם הערך של ניסיוני: פרטים נוספים זמינים בכתובת https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request. |
VisitType
מציין אם הביקור הוא איסוף, משלוח או ביקור ב-Stop. הביקורים בתחנה משמשים רק כשאופטימיזציה של נסיעות בכמה אמצעי תחבורה מופעלת.
| טיפוסים בני מנייה (enum) | |
|---|---|
VISIT_TYPE_UNSPECIFIED |
סוג הביקור לא צוין. |
PICKUP_SHIPMENT |
ביקור תואם לאיסוף משלוח. |
DELIVER_SHIPMENT |
ביקור תואם למשלוח. |
מעבר
מעבר בין שני אירועים במסלול. אפשר לעיין בתיאור של 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 |
שעת ההתחלה של המעבר הזה. הפורמט הוא RFC 3339, והפלט שנוצר תמיד יהיה בפורמט Z עם 0, 3, 6 או 9 ספרות אחרי הנקודה. אפשר להשתמש גם בהיסטים אחרים, לא רק ב-Z. דוגמאות: |
routePolyline |
ייצוג מקודד של קו פוליגוני של המסלול שבו הרכב נסע במהלך המעבר. השדה הזה יאוכלס רק אם השדה |
routeToken |
פלט בלבד. טוקן אטום שאפשר להעביר אל Navigation SDK כדי לשחזר את המסלול במהלך הניווט, ובמקרה של שינוי מסלול, לכבד את הכוונה המקורית כשנוצר המסלול. צריך להתייחס לטוקן הזה כאל blob אטום. אל תשוו את הערך שלו בין בקשות, כי הוא עשוי להשתנות גם אם השירות מחזיר את אותו מסלול בדיוק. השדה הזה יאוכלס רק אם השדה |
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 |
שעת ההתחלה של ההפסקה. הפורמט הוא RFC 3339, והפלט שנוצר תמיד יהיה בפורמט Z עם 0, 3, 6 או 9 ספרות אחרי הנקודה. אפשר להשתמש גם בהיסטים אחרים, לא רק ב-Z. דוגמאות: |
duration |
משך ההפסקה. |
VehicleFullness
VehicleFullness הוא מדד שמחשב את מידת התפוסה של כלי רכב. כל שדה VehicleFullness הוא בין 0 ל-1, והוא מחושב כיחס בין שדה מדד עם מכסה (לדוגמה, AggregatedMetrics.travel_distance_meters) לבין המגבלה הקשורה של כלי הרכב (לדוגמה, Vehicle.route_distance_limit), אם היא קיימת. אחרת, יחס המלאות לא מוגדר. אם המגבלה היא 0, הערך בשדה הוא 1. הערה: כשמסלול נתון להגבלות תנועה, יכול להיות שחלק מיחסי המילוי הגולמיים יעלו על 1.0, למשל אם הרכב חורג ממגבלת המרחק שלו. במקרים כאלה, אנחנו מגבילים את ערכי המלאות ל-1.0.
| ייצוג ב-JSON |
|---|
{ "maxFullness": number, "distance": number, "travelDuration": number, "activeDuration": number, "maxLoad": number, "activeSpan": number } |
| שדות | |
|---|---|
maxFullness |
הערך המקסימלי של כל שאר השדות בהודעה הזו. |
distance |
היחס בין |
travelDuration |
היחס בין [AggregatedMetrics.travel_duration_seconds][] לבין |
activeDuration |
היחס בין [AggregatedMetrics.total_duration_seconds][] לבין |
maxLoad |
היחס המקסימלי בין כל סוגי [AggregatedMetrics.max_load][] והערכים התואמים שלהם |
activeSpan |
היחס (vehicleEndTime – vehicleStartTime) / (latestVehicleEndTime – earliestVehicleStartTime) של רכב נתון. אם המכנה לא מופיע, הפונקציה משתמשת במקום זאת ב-( |