ShipmentRoute

ניתן לפרק את המסלול של כלי הרכב, לאורך ציר הזמן, באופן הבא (אנו מניחים שיש 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

לסיום, כך ניתן לארגן את הנסיעות, ההפסקות, ה-Shift וה-WAIT במהלך מעבר.

  • אין חפיפה ביניהן.
  • ה-OAuth הוא ייחודי וחייב להיות פרק זמן מתמשך שממש לפני הביקור הבא (או לפני הסיום של הרכב). לכן מספיק לדעת את משך ההשהיה כדי לדעת מהן שעות ההתחלה והסיום.
  • ה-breakS הם תקופות זמן רציפות שאינן חופפות. התשובה מציינת את שעת ההתחלה ואת משך הזמן של כל הפסקה.
  • נסיעות ו-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 (Visit)
    }
  ],
  "transitions": [
    {
      object (Transition)
    }
  ],
  "hasTrafficInfeasibilities": boolean,
  "routePolyline": {
    object (EncodedPolyline)
  },
  "breaks": [
    {
      object (Break)
    }
  ],
  "metrics": {
    object (AggregatedMetrics)
  },
  "routeCosts": {
    string: number,
    ...
  },
  "routeTotalCost": number
}
שדות
vehicleIndex

integer

רכב שמבצע את המסלול, מזוהה לפי האינדקס שלו במקור ShipmentModel.

vehicleLabel

string

תווית של כלי הרכב שמבצע את המסלול הזה, שווה ל-ShipmentModel.vehicles(vehicleIndex).label, אם צוין.

vehicleStartTime

string (Timestamp format)

השעה שבה הרכב מתחיל את המסלול.

חותמת זמן בפורמט "זולו" RFC3339 UTC, עם רזולוציה של ננו-שנייה ועד תשע ספרות עשרוניות. דוגמאות: "2014-10-02T15:01:23Z" ו-"2014-10-02T15:01:23.045123456Z".

vehicleEndTime

string (Timestamp format)

השעה שבה הרכב מסיים את המסלול.

חותמת זמן בפורמט "זולו" RFC3339 UTC, עם רזולוציה של ננו-שנייה ועד תשע ספרות עשרוניות. דוגמאות: "2014-10-02T15:01:23Z" ו-"2014-10-02T15:01:23.045123456Z".

visits[]

object (Visit)

רצף ביקורים מסודר שמייצג מסלול. ביקורים[i] הוא הביקור ה-i במסלול. אם השדה הזה ריק, הרכב ייחשב כרכב שלא בשימוש.

transitions[]

object (Transition)

רשימה מסודרת של המעברים במסלול.

hasTrafficInfeasibilities

boolean

כשהערך של OptimizeToursRequest.consider_road_traffic הוא True, השדה הזה מצביע על כך שצפוי חוסר עקביות בתזמוני מסלולים על סמך אומדנים של משך נסיעה המבוססים על תנועה. ייתכן שלא יהיה מספיק זמן להשלמת הנסיעה בהתאמה לתנועה, לעיכובים ולהפסקות בין הביקורים, לפני הביקור הראשון או אחרי הביקור האחרון, ועדיין עמידה בלוחות הזמנים של הביקורים וחלונות הזמן לרכב. לדוגמה,

  startTime(previous_visit) + duration(previous_visit) +
  travelDuration(previous_visit, next_visit) > startTime(next_visit)

סביר להניח שההגעה אל next_visit תתבצע מאוחר יותר מחלון הזמן הנוכחי, בגלל העלייה המשוערת בזמן הנסיעה travelDuration(previous_visit, next_visit) עקב עומס תנועה. בנוסף, יכול להיות שייאלצו ליצור חפיפה עם ביקור כתוצאה מעלייה באומדני זמן הנסיעה, ובגלל הגבלות על חלון הזמן של הביקורים או של ההפסקות.

routePolyline

object (EncodedPolyline)

ייצוג הקו הפוליגוני המקודד של המסלול. השדה הזה יאוכלס רק אם המדיניות OptimizeToursRequest.populate_polylines מוגדרת כ-True.

breaks[]

object (Break)

נקבעו הפסקות לרכב שמבצע את המסלול הזה. הרצף breaks מייצג מרווחי זמן, שכל אחד מהם מתחיל ב-startTime המתאים ונמשך duration שניות.

metrics

object (AggregatedMetrics)

מדדים של משך הזמן, המרחק והטעינה במסלול הזה. סיכום השדות של AggregatedMetrics מתבצע בכל ה-ShipmentRoute.transitions או ShipmentRoute.visits, בהתאם להקשר.

routeCosts

map (key: string, value: number)

עלות המסלול, בחלוקה לפי שדות בקשה הקשורים לעלות. המפתחות הם נתיבים של תבניות אב, ביחס לקלט OptimizeToursRequest, למשל "model.shipments.pickups.cost". הערכים הם העלות הכוללת שנוצרה על ידי שדה העלות המתאים, שנצבר לאורך כל המסלול. במילים אחרות, העלויות ["model.shipments.pickups.cost"] הן הסכום של כל עלויות האיסוף לאורך המסלול. כל העלויות שמוגדרות במודל מדווחות כאן בפירוט, חוץ מהעלויות שקשורות למאפייני מעבר, שמדווחות רק באופן מצטבר החל מ-1 בינואר 2022.

אובייקט שמכיל רשימה של "key": value זוגות. לדוגמה: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

routeTotalCost

number

העלות הכוללת של המסלול. סכום כל העלויות במפת העלויות.

כניסה

ביקור שבוצע במהלך מסלול. הביקור הזה מתייחס לאיסוף או למשלוח של Shipment.

ייצוג JSON
{
  "shipmentIndex": integer,
  "isPickup": boolean,
  "visitRequestIndex": integer,
  "startTime": string,
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "detour": string,
  "shipmentLabel": string,
  "visitLabel": string
}
שדות
shipmentIndex

integer

אינדקס השדה shipments במקור ShipmentModel.

isPickup

boolean

אם הערך הוא true, הביקור תואם לאיסוף של Shipment. אחרת, זה תואם למשלוח.

visitRequestIndex

integer

אינדקס של VisitRequest בשדה האיסוף או המשלוח של Shipment (מידע נוסף: isPickup).

startTime

string (Timestamp format)

השעה שבה הביקור מתחיל. חשוב לדעת שהרכב עשוי להגיע מוקדם יותר למיקום הביקור. השעות תואמות לShipmentModel.

חותמת זמן בפורמט "זולו" RFC3339 UTC, עם רזולוציה של ננו-שנייה ועד תשע ספרות עשרוניות. דוגמאות: "2014-10-02T15:01:23Z" ו-"2014-10-02T15:01:23.045123456Z".

loadDemands

map (key: string, value: object (Load))

הביקוש הכולל לעומס על הביקורים, כסך המשלוח ובקשת הביקור loadDemands. הערכים שליליים אם הביקור הוא מסירה. הדיווח על דרישות מתבצע לגבי אותם סוגים כמו בעמודה Transition.loads (אפשר לעיין בשדה הזה).

אובייקט שמכיל רשימה של "key": value זוגות. לדוגמה: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

detour

string (Duration format)

זמן עוקף נוסף עקב המשלוחים שבהם ביקרו במסלול לפני הביקור וזמני ההמתנה האפשריים עקב חלונות זמן. אם הביקור הוא משלוח, המעקף מחושב לפי הביקור התואם לאיסוף והוא שווה ל:

startTime(delivery) - startTime(pickup)
- (duration(pickup) + travel duration from the pickup location
to the delivery location).

אחרת, הוא מחושב מהרכב startLocation ושווה ל:

startTime - vehicleStartTime - travel duration from
the vehicle's `startLocation` to the visit.

משך זמן בשניות עם עד תשע ספרות עשרוניות, המסתיים ב-'s'. דוגמה: "3.5s".

shipmentLabel

string

עותק של Shipment.label המתאים, אם צוין ב-Shipment.

visitLabel

string

עותק של VisitRequest.label המתאים, אם צוין ב-VisitRequest.

מעבר

מעבר בין שני אירועים במסלול. מידע נוסף מופיע בתיאור של ShipmentRoute.

אם אין לרכב startLocation או endLocation, מדדי הנסיעה המתאימים הם 0.

ייצוג JSON
{
  "travelDuration": string,
  "travelDistanceMeters": number,
  "trafficInfoUnavailable": boolean,
  "delayDuration": string,
  "breakDuration": string,
  "waitDuration": string,
  "totalDuration": string,
  "startTime": string,
  "routePolyline": {
    object (EncodedPolyline)
  },
  "vehicleLoads": {
    string: {
      object (VehicleLoad)
    },
    ...
  }
}
שדות
travelDuration

string (Duration format)

משך הנסיעה בתקופת המעבר.

משך זמן בשניות עם עד תשע ספרות עשרוניות, המסתיים ב-'s'. דוגמה: "3.5s".

travelDistanceMeters

number

המרחק שעברת במהלך המעבר.

trafficInfoUnavailable

boolean

כשיש בקשה לקבלה של תנועת גולשים דרך OptimizeToursRequest.consider_road_traffic ולא ניתן לאחזר את נתוני התנועה של Transition, הערך הבוליאני מוגדר כ-true. מצב זה עשוי להיות זמני (שיבושים נדירים בשרתי התנועה בזמן אמת) או קבוע (אין נתונים לגבי המיקום הזה).

delayDuration

string (Duration format)

סך משכי השהייה שחלו על המעבר הזה. אם רלוונטי, ההשהיה תתחיל בדיוק delayDuration שניות לפני האירוע הבא (ביקור או סיום הרכב). TransitionAttributes.delay.

משך זמן בשניות עם עד תשע ספרות עשרוניות, המסתיים ב-'s'. דוגמה: "3.5s".

breakDuration

string (Duration format)

משך הזמן של ההפסקות שהתרחשו במהלך המעבר, אם יש כאלה. הפרטים לגבי שעת ההתחלה ומשך הזמן של כל הפסקה נשמרים ב-ShipmentRoute.breaks.

משך זמן בשניות עם עד תשע ספרות עשרוניות, המסתיים ב-'s'. דוגמה: "3.5s".

waitDuration

string (Duration format)

משך ההמתנה למעבר הזה. משך ההמתנה תואם לזמן ללא פעילות והוא לא כולל את זמן ההפסקה. כמו כן, חשוב לזכור שזמן ההמתנה הזה עשוי להתפצל לכמה פרקי זמן שאינם עוקבים.

משך זמן בשניות עם עד תשע ספרות עשרוניות, המסתיים ב-'s'. דוגמה: "3.5s".

totalDuration

string (Duration format)

משך הזמן הכולל של המעבר, לנוחותך. הוא שווה ל:

  • הביקור הבא startTime (או vehicleEndTime אם זה המעבר האחרון) – startTime של המעבר הזה;
  • אם הערך של ShipmentRoute.has_traffic_infeasibilities הוא False, הערך הבא כולל בנוסף: 'totalDuration = travelDuration + pausedDuration
  • breakDuration + waitDuration`.

משך זמן בשניות עם עד תשע ספרות עשרוניות, המסתיים ב-'s'. דוגמה: "3.5s".

startTime

string (Timestamp format)

שעת ההתחלה של המעבר.

חותמת זמן בפורמט "זולו" RFC3339 UTC, עם רזולוציה של ננו-שנייה ועד תשע ספרות עשרוניות. דוגמאות: "2014-10-02T15:01:23Z" ו-"2014-10-02T15:01:23.045123456Z".

routePolyline

object (EncodedPolyline)

ייצוג הקו הפוליגוני המקודד של המסלול שעבר במהלך המעבר. השדה הזה יאוכלס רק אם המדיניות populateTransitionPolylines מוגדרת כ-True.

vehicleLoads

map (key: string, value: object (VehicleLoad))

ניתן לטעון את הרכב במהלך המעבר הזה לכל סוג שמופיע ברכב הזה מסוג Vehicle.load_limits, או לכל סוג שסוג המשלוח שלו הוא Shipment.load_demands בחלק מהמשלוחים שבוצעו במסלול הזה.

הטעינות במהלך המעבר הראשון הן הטעינות ההתחלתיות של מסלול הרכב. לאחר מכן, אחרי כל ביקור, המערכת מוסיפה או מחסירה את הערך של loadDemands עבור הביקור כדי לקבל את הטעינות של המעבר הבא, בהתאם לסוג הביקור (איסוף או משלוח).

אובייקט שמכיל רשימה של "key": value זוגות. לדוגמה: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

EncodedPolyline

הייצוג המקודד של קו פוליגוני. מידע נוסף על קידוד פוליגונים זמין כאן: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.

ייצוג JSON
{
  "points": string
}
שדות
points

string

מחרוזת שמייצגת נקודות מקודדות של הקו הפוליגוני.

הפסקה

נתונים שמייצגים את ביצוע ההפסקה.

ייצוג JSON
{
  "startTime": string,
  "duration": string
}
שדות
startTime

string (Timestamp format)

שעת ההתחלה של ההפסקה.

חותמת זמן בפורמט "זולו" RFC3339 UTC, עם רזולוציה של ננו-שנייה ועד תשע ספרות עשרוניות. דוגמאות: "2014-10-02T15:01:23Z" ו-"2014-10-02T15:01:23.045123456Z".

duration

string (Duration format)

משך ההפסקה.

משך זמן בשניות עם עד תשע ספרות עשרוניות, המסתיים ב-'s'. דוגמה: "3.5s".