ShipmentModel

מודל משלוח מכיל קבוצה של משלוחים שסט של כלי רכב צריכים לבצע, תוך צמצום העלות הכוללת, שהיא הסכום של:

  • עלות הניתוב של כלי הרכב (סכום העלות הכוללת לזמן, העלות לזמן נסיעה ועלות קבועה של כל כלי הרכב).
  • את הסנקציות על משלוח שלא בוצעו.
  • העלות של משך הזמן הכולל של המשלוחים
ייצוג JSON
{
  "shipments": [
    {
      object (Shipment)
    }
  ],
  "vehicles": [
    {
      object (Vehicle)
    }
  ],
  "globalStartTime": string,
  "globalEndTime": string,
  "globalDurationCostPerHour": number,
  "durationDistanceMatrices": [
    {
      object (DurationDistanceMatrix)
    }
  ],
  "durationDistanceMatrixSrcTags": [
    string
  ],
  "durationDistanceMatrixDstTags": [
    string
  ],
  "transitionAttributes": [
    {
      object (TransitionAttributes)
    }
  ],
  "shipmentTypeIncompatibilities": [
    {
      object (ShipmentTypeIncompatibility)
    }
  ],
  "shipmentTypeRequirements": [
    {
      object (ShipmentTypeRequirement)
    }
  ],
  "precedenceRules": [
    {
      object (PrecedenceRule)
    }
  ],
  "maxActiveVehicles": integer
}
שדות
shipments[]

object (Shipment)

קבוצת משלוחים שצריך לבצע במודל.

vehicles[]

object (Vehicle)

קבוצת כלי רכב שיכולים לשמש לביצוע ביקורים.

globalStartTime

string (Timestamp format)

זמני התחלה וסיום גלובליים של המודל: שעות מחוץ לטווח הזה לא יכולות להיחשב כחוקיות.

טווח הזמן של המודל חייב להיות קצר משנה. כלומר, הטווח של globalEndTime והglobalStartTime חייב להיות בטווח של 31536,000 שניות זה מזה.

כשמשתמשים בשדות cost_per_*hour, כדאי להגדיר את החלון הזה למרווח זמן קטן יותר כדי לשפר את הביצועים (למשל, אם יוצרים מודל של יום אחד, צריך להגדיר את מגבלות הזמן הגלובליות לאותו יום). אם לא מגדירים את השדה, המערכת תשתמש בערך ברירת המחדל 00:00:00 UTC, 1 בינואר 1970 (כלומר, שניות: 0, ננו-שניות: 0).

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

globalEndTime

string (Timestamp format)

אם לא מגדירים ערך, המערכת תשתמש בערך ברירת המחדל 00:00:00 UTC, 1 בינואר 1971 (כלומר, שניות: 31536000, ננו-שניות: 0).

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

globalDurationCostPerHour

number

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

durationDistanceMatrices[]

object (DurationDistanceMatrix)

מציינת את המטריצות של משך הזמן והמרחק שבהן נעשה שימוש במודל. אם השדה הזה ריק, המערכת תשתמש במקום זאת במפות Google או במרחקים גיאודזיים, בהתאם לערך של השדה useGeodesicDistances. אם השדה לא ריק, הערך של useGeodesicDistances לא יכול להיות True וגם durationDistanceMatrixSrcTags או durationDistanceMatrixDstTags לא יכולים להיות ריקים.

דוגמאות לשימוש:

  • יש שני מיקומים: locA ו-locB.
  • כלי רכב אחד מתחיל את המסלול במקום אחד ומסתיים במיקום הזה.
  • בקשת ביקור אחת לאיסוף במיקום locB.
model {
  vehicles { startTags: "locA"  endTags: "locA" }
  shipments { pickups { tags: "locB" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixDstTags: "locA"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • יש שלושה מיקומים: locA,‏ locB ו-locC.
  • רכב אחד מתחיל את המסלול ב-locA ומסתיים ב-locB באמצעות המטריצה 'fast'.
  • רכב אחד מתחיל את המסלול ב-locB ומסתיים ב-locB באמצעות המטריצה 'איטי'.
  • רכב אחד שמתחיל את המסלול ב-locB ומסתיים ב-locB, באמצעות המטריצה 'מהיר'.
  • בקשת ביקור אחת לאיסוף באתר locC.
model {
  vehicles { startTags: "locA" endTags: "locB" startTags: "fast" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "slow" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "fast" }
  shipments { pickups { tags: "locC" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixSrcTags: "locC"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrixDstTags: "locC"
  durationDistanceMatrices {
    vehicleStartTag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  durationDistanceMatrices {
    vehicleStartTag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
durationDistanceMatrixSrcTags[]

string

תגים המגדירים את המקורות של מטריצות משך הזמן והמרחק; durationDistanceMatrices(i).rows(j) מגדיר משכי זמן ומרחקים מביקורים באמצעות התג durationDistanceMatrixSrcTags(j) לביקורים אחרים במטריצה i.

התגים תואמים ל-VisitRequest.tags או ל-Vehicle.start_tags. VisitRequest או Vehicle נתון חייב להתאים לתג אחד בלבד בשדה הזה. לתשומת ליבכם: תג המקור, תג היעד ותג המטריצה של Vehicle עשויים להיות זהים. באופן דומה, תגי המקור ותג היעד של VisitRequest עשויים להיות זהים. כל התגים צריכים להיות שונים, ולא יכולים להיות מחרוזות ריקות. אם השדה הזה לא ריק, durationDistanceMatrices לא יכול להיות ריק.

durationDistanceMatrixDstTags[]

string

תגים שמגדירים את היעדים של מטריצות משך הזמן והמרחק. durationDistanceMatrices(i).rows(j).durations(k) (resp. הפונקציה durationDistanceMatrices(i).rows(j).meters(k)) מגדירה את משך (המרחק) של הנסיעה מביקורים עם התג durationDistanceMatrixSrcTags(j) לביקורים עם התג durationDistanceMatrixDstTags(k) במטריצה i.

התגים תואמים ל-VisitRequest.tags או ל-Vehicle.start_tags. VisitRequest או Vehicle נתון חייב להתאים בדיוק לתג אחד בשדה הזה. שימו לב: ייתכן שתג המקור, תג היעד ותג המטריצה של Vehicle יהיו זהים. באופן דומה, ייתכן שתג המקור ותג היעד של VisitRequest יהיו זהים. כל התגים צריכים להיות שונים ולא להיות מחרוזות ריקות. אם השדה הזה לא ריק, השדה durationDistanceMatrices לא יכול להיות ריק.

transitionAttributes[]

object (TransitionAttributes)

מאפייני מעבר שנוספו למודל.

shipmentTypeIncompatibilities[]

object (ShipmentTypeIncompatibility)

קבוצות של shipment_types לא תואמים (ראו ShipmentTypeIncompatibility).

shipmentTypeRequirements[]

object (ShipmentTypeRequirement)

מערכי של דרישות shipmentType (ראו ShipmentTypeRequirement).

precedenceRules[]

object (PrecedenceRule)

קבוצת כללים של קדימות שיש לאכיפה במודל.

maxActiveVehicles

integer

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

משלוח

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

ייצוג JSON
{
  "displayName": string,
  "pickups": [
    {
      object (VisitRequest)
    }
  ],
  "deliveries": [
    {
      object (VisitRequest)
    }
  ],
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "allowedVehicleIndices": [
    integer
  ],
  "costsPerVehicle": [
    number
  ],
  "costsPerVehicleIndices": [
    integer
  ],
  "pickupToDeliveryAbsoluteDetourLimit": string,
  "pickupToDeliveryTimeLimit": string,
  "shipmentType": string,
  "label": string,
  "ignore": boolean,
  "penaltyCost": number,
  "pickupToDeliveryRelativeDetourLimit": number
}
שדות
displayName

string

שם התצוגה שהמשתמש הגדיר למשלוח. הוא יכול להכיל עד 63 תווים ויכול להשתמש בתווי UTF-8.

pickups[]

object (VisitRequest)

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

deliveries[]

object (VisitRequest)

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

loadDemands

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

יש לטעון את הדרישות של המשלוח (לדוגמה, משקל, נפח, מספר המשטחים וכו'). המפתחות במפה צריכים להיות מזהים שמתארים את סוג העומס המתאים, רצוי שגם יחד עם היחידות. לדוגמה: 'weight_kg', 'volume_gallons', 'pallet_count' וכו'. אם מפתח מסוים לא מופיע במפה, העומס התואם נחשב כ-null.

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

allowedVehicleIndices[]

integer

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

costsPerVehicle[]

number

מציינת את העלות שתחול כשהמשלוח נמסר על ידי כל רכב. אם צוין, הוא צריך להכיל EITHER:

  • את אותו מספר רכיבים כמו costsPerVehicleIndices. costsPerVehicle[i] תואם לרכב costsPerVehicleIndices[i] של הדגם.
  • אותו מספר רכיבים כמו מספר כלי הרכב בדגם. הרכיב ה-i תואם לרכב מס' i של הדגם.

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

costsPerVehicleIndices[]

integer

מדדים של כלי הרכב שעליהם חל costsPerVehicle. אם השדה לא ריק, הוא צריך להכיל אותו מספר רכיבים כמו costsPerVehicle. אסור לציין אינדקס רכב יותר מפעם אחת. אם רכב מסוים מוחרג מ-costsPerVehicleIndices, העלות שלו היא אפס.

pickupToDeliveryAbsoluteDetourLimit

string (Duration format)

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

לדוגמה, צריך להזין את משך הזמן הקצר ביותר כדי לעבור מחלופה לאיסוף שנבחרה ישירות לחלופה שנבחרה. לאחר מכן, ההגדרה pickupToDeliveryAbsoluteDetourLimit אוכפת:

startTime(delivery) - startTime(pickup) <=
t + pickupToDeliveryAbsoluteDetourLimit

אם ציינתם מגבלות יחסיות ומגבלות מוחלטות על אותו משלוח, המערכת תשתמש במגבלה המגבילה יותר לכל צמד אפשרי של איסוף/מסירה. החל מאוקטובר 2017, יש תמיכה במסלולי עקיפה רק כשמשך הנסיעה לא תלוי בסוג הרכב.

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

pickupToDeliveryTimeLimit

string (Duration format)

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

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

shipmentType

string

מחרוזת לא ריקה שצוינה בה 'סוג' של המשלוח. אפשר להשתמש בתכונה הזו כדי להגדיר אי-תאימות או דרישות בין shipment_types (ראו shipmentTypeIncompatibilities ו-shipmentTypeRequirements בקובץ ShipmentModel).

שונה מ-visitTypes שמצוין לביקור יחיד: כל האיסופים/המסירות ששייכים לאותו משלוח משתפים את אותו shipmentType.

label

string

תווית למשלוח הזה. התווית הזו מדווחת בתגובה בשדה shipmentLabel של ShipmentRoute.Visit התואם.

ignore

boolean

אם הערך הוא True, אפשר לדלג על המשלוח הזה, אבל לא להחיל penaltyCost.

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

מותר להתעלם משליחה שמתבצעת ב-injectedFirstSolutionRoutes או ב-injectedSolutionConstraint. הפתרון מסיר מהמסלול את הביקורים הקשורים לאיסוף או למסירה. precedenceRules שמתייחסים למשלוחים שנדחו.

penaltyCost

number

אם המשלוח לא יושלם, העונש הזה יתווסף לעלות הכוללת של הנתיבים. משלוח נחשב כסגור אם מתבצעת ביקור באחת מהאפשרויות לאיסוף ולמסירה. העלות עשויה לבוא לידי ביטוי באותה יחידה שמשמשת את כל השדות האחרים הקשורים לעלות במודל, והיא חייבת להיות חיובית.

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

pickupToDeliveryRelativeDetourLimit

number

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

לדוגמה, נניח ש-t הוא הזמן הקצר ביותר שנדרש כדי לעבור מאפשרות האיסוף שנבחרה ישירות לאפשרות המסירה שנבחרה. לאחר מכן, ההגדרה pickupToDeliveryRelativeDetourLimit אוכפת:

startTime(delivery) - startTime(pickup) <=
std::ceil(t * (1.0 + pickupToDeliveryRelativeDetourLimit))

אם ציינתם מגבלות יחסיות ומגבלות מוחלטות על אותו משלוח, המערכת תשתמש במגבלה המגבילה יותר לכל צמד אפשרי של איסוף/מסירה. החל מאוקטובר 2017, יש תמיכה במסלולי עקיפה רק כשמשך הנסיעה לא תלוי בסוג הרכב.

VisitRequest

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

ייצוג ב-JSON
{
  "arrivalLocation": {
    object (LatLng)
  },
  "arrivalWaypoint": {
    object (Waypoint)
  },
  "departureLocation": {
    object (LatLng)
  },
  "departureWaypoint": {
    object (Waypoint)
  },
  "tags": [
    string
  ],
  "timeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "duration": string,
  "cost": number,
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "visitTypes": [
    string
  ],
  "label": string,
  "avoidUTurns": boolean
}
שדות
arrivalLocation

object (LatLng)

המיקום הגיאוגרפי שאליו מגיע הרכב במהלך ביצוע ה-VisitRequest הזה. אם למודל המשלוח יש מטריצות של משך זמן ומרחק, אסור לציין את arrivalLocation.

arrivalWaypoint

object (Waypoint)

ציון הדרך שאליו הרכב מגיע במהלך ביצוע VisitRequest הזה. אם מודל המשלוח כולל מטריצות של משך הזמן, אי אפשר לציין arrivalWaypoint.

departureLocation

object (LatLng)

המיקום הגיאוגרפי שאליו הרכב יוצא אחרי השלמת VisitRequest. אפשר להשמיט אותה אם היא זהה ל-arrivalLocation. אם מודל המשלוח כולל מטריצות של משך הזמן, אי אפשר לציין departureLocation.

departureWaypoint

object (Waypoint)

נקודת הציון שממנה הרכב יוצא אחרי השלמת ה-VisitRequest הזה. אפשר להשמיט אותו אם הוא זהה ל-arrivalWaypoint. אם מודל המשלוח כולל מטריצות של משך הזמן, אי אפשר לציין departureWaypoint.

tags[]

string

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

timeWindows[]

object (TimeWindow)

חלונות זמן שמגבילים את שעת ההגעה לביקור. הערה: יכול להיות שהרכב יצא מחוץ לחלון הזמן להגעה ליעד. כלומר שעת ההגעה ומשך הטיסה לא חייבים להיות בתוך חלון זמן. אם הרכב יגיע לפני TimeWindow.start_time, יכול להיות שתצטרכו להמתין.

כאשר חסר TimeWindow, הרכב יכול לבצע את הביקור הזה בכל שלב.

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

אפשר להגדיר את costPerHourAfterSoftEndTime ו-softEndTime רק אם יש חלון זמן אחד.

duration

string (Duration format)

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

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

cost

number

עלות השירות של בקשת הביקור הזו במסלול לרכב. כך אפשר לשלם עלויות שונות לכל אחת מהאפשרויות החלופיות לאיסוף או למשלוח של משלוח. העלות הזו חייבת להיות באותה יחידה של Shipment.penalty_cost, והיא לא יכולה להיות שלילית.

loadDemands

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

טעינת הדרישות של בקשת הביקור הזו. זה בדיוק כמו השדה Shipment.load_demands, אבל הוא חל רק על השדה VisitRequest הזה ולא על כל הShipment. הדרישות המפורטות כאן מתווספות לדרישות שמפורטות בShipment.load_demands.

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

visitTypes[]

string

מציין את סוגי הביקור. ייתכן שהפעולה הזו תקצה את הזמן הנוסף שנדרש לרכב כדי להשלים את הביקור הזה (ראו Vehicle.extra_visit_duration_for_visit_type).

סוג יכול להופיע רק פעם אחת.

label

string

תווית של VisitRequest. התווית הזו מדווחת בתשובה כ-visitLabel ב-ShipmentRoute.Visit המתאים.

avoidUTurns

boolean

ההגדרה קובעת אם יש להימנע מפניות פרסה במסלולי נהיגה במיקום הזה. הימנעות מסיבובי פרסה היא האפשרות הטובה ביותר ולא מובטחת הימנעות מלאה. התכונה הזו ניסיונית וההתנהגות עשויה להשתנות.

LatLng

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

ייצוג ב-JSON
{
  "latitude": number,
  "longitude": number
}
שדות
latitude

number

קו הרוחב במעלות. הוא חייב להיות בטווח [-90.0, +90.0].

longitude

number

קו האורך במעלות. הוא חייב להיות בטווח [-180.0, +180.0].

נקודת ציון

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

ייצוג ב-JSON
{
  "sideOfRoad": boolean,

  // Union field location_type can be only one of the following:
  "location": {
    object (Location)
  },
  "placeId": string
  // End of list of possible types for union field location_type.
}
שדות
sideOfRoad

boolean

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

שדה איחוד location_type. דרכים שונות לייצוג מיקום. location_type יכול להיות רק אחת מהאפשרויות הבאות:
location

object (Location)

נקודה שמצוינת באמצעות קואורדינטות גיאוגרפיות, כולל כותרת אופציונלית.

placeId

string

מזהה המקום של נקודת העניין המשויך לציון הדרך.

מיקום

כולל מיקום (נקודה גיאוגרפית וכותרת אופציונלית).

ייצוג JSON
{
  "latLng": {
    object (LatLng)
  },
  "heading": integer
}
שדות
latLng

object (LatLng)

הקואורדינטות הגיאוגרפיות של ציון הדרך.

heading

integer

כותרת המצפן המשויכת לכיוון זרימת התנועה. הערך הזה משמש לציון הצד של הכביש שבו יתבצע האיסוף וההחזרה. ערכי הכיוון יכולים להיות מ-0 עד 360, כאשר 0 מציין כיוון צפון, 90 מציין כיוון מזרח וכו'.

TimeWindow

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

גבולות קשיחים של חלון הזמן, startTime ו-endTime, אוכפים את השעה המוקדמת ביותר ואת השעה המאוחרת ביותר של האירוע, כך ש-startTime <= event_time <= endTime. הגבול התחתון של חלון הזמן הרך, softStartTime, מבטא העדפה שהאירוע יתרחש בתאריך softStartTime או אחריו, על ידי צבירת עלות ביחס לפרק הזמן לפני האירוע softStartTime. כדי להביע עדיפות שהאירוע יתרחש ב-softEndTime או לפני כן, המערכת מחייבת עלות שפרופורציונלית לזמן שחולף אחרי softEndTime עד שהאירוע מתרחש. הגבול העליון של חלון הזמן הרך, softEndTime, הוא הערך הזה. הערכים של startTime,‏ endTime,‏ softStartTime ו-softEndTime צריכים לעמוד במגבלות הזמן הגלובליות (ראו ShipmentModel.global_start_time ו-ShipmentModel.global_end_time) ולעמוד בדרישות הבאות:

  0 <= `startTime` <= `endTime` and
  0 <= `startTime` <= `softStartTime` and
  0 <= `softEndTime` <= `endTime`.
ייצוג JSON
{
  "startTime": string,
  "endTime": string,
  "softStartTime": string,
  "softEndTime": string,
  "costPerHourBeforeSoftStartTime": number,
  "costPerHourAfterSoftEndTime": number
}
שדות
startTime

string (Timestamp format)

שעת ההתחלה של חלון הזמן הקבוע. אם לא צוין ערך, הוא יוגדר ל-ShipmentModel.global_start_time.

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

endTime

string (Timestamp format)

שעת הסיום של החלון הקופץ. אם לא צוין ערך, הוא יוגדר ל-ShipmentModel.global_end_time.

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

softStartTime

string (Timestamp format)

שעת ההתחלה הרכה של חלון הזמן.

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

softEndTime

string (Timestamp format)

שעת הסיום הרכה של חלון הזמן.

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

costPerHourBeforeSoftStartTime

number

עלות לשעה שתתווסף לעלויות אחרות במודל אם האירוע מתרחש לפני האירוע softStartTime, שמחושבת כך:

   max(0, softStartTime - t.seconds)
                          * costPerHourBeforeSoftStartTime / 3600,
t being the time of the event.

העלות הזו חייבת להיות חיובית, ואפשר להגדיר את השדה רק אם הוגדר ערך softStartTime.

costPerHourAfterSoftEndTime

number

עלות לשעה שתתווסף לעלויות אחרות במודל אם האירוע מתרחש אחרי softEndTime, שמחושבת כך:

   max(0, t.seconds - softEndTime.seconds)
                    * costPerHourAfterSoftEndTime / 3600,
t being the time of the event.

העלות הזו חייבת להיות חיובית, וניתן להגדיר את השדה רק אם softEndTime הוגדר.

כלי רכב

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

ייצוג JSON
{
  "displayName": string,
  "travelMode": enum (TravelMode),
  "startLocation": {
    object (LatLng)
  },
  "startWaypoint": {
    object (Waypoint)
  },
  "endLocation": {
    object (LatLng)
  },
  "endWaypoint": {
    object (Waypoint)
  },
  "startTags": [
    string
  ],
  "endTags": [
    string
  ],
  "startTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "endTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "unloadingPolicy": enum (UnloadingPolicy),
  "loadLimits": {
    string: {
      object (LoadLimit)
    },
    ...
  },
  "costPerHour": number,
  "costPerTraveledHour": number,
  "costPerKilometer": number,
  "fixedCost": number,
  "usedIfRouteIsEmpty": boolean,
  "routeDurationLimit": {
    object (DurationLimit)
  },
  "travelDurationLimit": {
    object (DurationLimit)
  },
  "routeDistanceLimit": {
    object (DistanceLimit)
  },
  "extraVisitDurationForVisitType": {
    string: string,
    ...
  },
  "breakRule": {
    object (BreakRule)
  },
  "label": string,
  "ignore": boolean,
  "travelDurationMultiple": number
}
שדות
displayName

string

שם הרכב שהוגדר על ידי המשתמש. השם יכול להכיל עד 63 תווים, וניתן להשתמש בתווים בתקן UTF-8.

travelMode

enum (TravelMode)

מצב הנסיעה שמשפיע על הכבישים שבהם הרכב יכול לנסוע ועל המהירות שלו. מידע נוסף זמין במאמר travelDurationMultiple.

startLocation

object (LatLng)

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

startWaypoint

object (Waypoint)

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

endLocation

object (LatLng)

מיקום גיאוגרפי שבו הרכב מסתיים אחרי שהושלמה VisitRequest האחרונה שלו. אם לא מציינים זאת, ShipmentRoute של הרכב מסתיים מיד לאחר השלמת VisitRequest הזמן האחרון. אם למודל המשלוח יש מטריצות של משך זמן ומרחק, אי אפשר לציין endLocation.

endWaypoint

object (Waypoint)

נקודת ציון שמייצגת מיקום גיאוגרפי שבו הרכב מסתיים אחרי שהסתיים VisitRequest האחרונים. אם לא צוין endWaypoint וגם לא endLocation, ShipmentRoute של הרכב יסתיים מיד אחרי שהVisitRequest האחרון שלו יושלם. אם למודל המשלוח יש מטריצות של משך זמן ומרחק, אסור לציין את endWaypoint.

startTags[]

string

מציין תגים שמצורפים לתחילת המסלול של הרכב.

אסור להזין מחרוזות ריקות או כפולות.

endTags[]

string

ציון תגים שמצורפים לסוף המסלול של הרכב.

אסור להשתמש במחרוזות ריקות או כפולות.

startTimeWindows[]

object (TimeWindow)

חלונות זמן שבמהלכם הרכב עשוי לצאת ממיקום ההתחלה. הם צריכים להיות בתוך מגבלות הזמן הגלובליות (ראו שדות ShipmentModel.global_*). אם לא צוינו, אין הגבלה מלבד מגבלות הזמן הגלובליות האלה.

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

אפשר להגדיר את costPerHourAfterSoftEndTime ואת softEndTime רק אם יש חלון זמן אחד.

endTimeWindows[]

object (TimeWindow)

חלונות זמן שבהם הרכב עשוי להגיע למיקום הסיום שלו. הם חייבים להיות במסגרת מגבלות הזמן הגלובליות (עיינו בשדות ShipmentModel.global_*). אם לא צוינו, אין הגבלה מלבד מגבלות הזמן הגלובליות האלה.

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

אפשר להגדיר את costPerHourAfterSoftEndTime ו-softEndTime רק אם יש חלון זמן אחד.

unloadingPolicy

enum (UnloadingPolicy)

מדיניות פריקה שחלה על הרכב.

loadLimits

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

הקיבולת של הרכב (משקל, נפח, מספר המשטחים, למשל). המפתחות במפה הם המזהים של סוג העומס, בהתאם למפתחות של השדה Shipment.load_demands. אם מפתח מסוים לא מופיע במפה הזו, הקיבולת המתאימה נחשבת לא מוגבלת.

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

costPerHour

number

עלויות הרכב: כל העלויות צריכות להתווסף זו לזו, והן חייבות להיות באותה יחידה כמו Shipment.penalty_cost.

העלות לשעה של מסלול הרכב. העלות הזו חלה על הזמן הכולל במסלול, והיא כוללת את זמן הנסיעה, זמן ההמתנה וזמן הביקור. שימוש ב-costPerHour במקום ב-costPerTraveledHour בלבד עלול להוביל לזמן אחזור ארוך יותר.

costPerTraveledHour

number

עלות לשעה של נסיעה במסלול הרכב. העלות הזו חלה רק על זמן הנסיעה במסלול (כלומר, שדווח ב-ShipmentRoute.transitions), ולא כוללת את זמן ההמתנה ואת זמן הביקור.

costPerKilometer

number

עלות לקילומטר ממסלול הרכב. העלות הזו חלה על המרחק שמדווח ב-ShipmentRoute.transitions, ולא חלה על מרחק כלשהו שעבר באופן משתמע מ-arrivalLocation ל-departureLocation של VisitRequest יחיד.

fixedCost

number

החלה של עלות קבועה אם הרכב הזה משמש לטיפול במשלוח.

usedIfRouteIsEmpty

boolean

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

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

אחרת, היא לא נוסעת מנקודת ההתחלה ועד למיקום הסיום שלה, ולא תוזמנו breakRule או עיכובי רכב (מTransitionAttributes). במקרה כזה, ShipmentRoute של הרכב לא מכיל מידע מלבד אינדקס הרכב ותווית הרכב.

routeDurationLimit

object (DurationLimit)

המגבלה חלה על משך הזמן הכולל של המסלול של הרכב. ב-OptimizeToursResponse נתון, משך המסלול של רכב הוא ההפרש בין vehicleEndTime לבין vehicleStartTime.

travelDurationLimit

object (DurationLimit)

המגבלה חלה על משך הנסיעה במסלול של הרכב. ב-OptimizeToursResponse נתון, משך הנסיעה במסלול הוא הסכום של כל הערכים של transitions.travel_duration.

routeDistanceLimit

object (DistanceLimit)

המגבלה חלה על המרחק הכולל של המסלול של הרכב. ב-OptimizeToursResponse נתון, מרחק המסלול הוא הסכום של כל transitions.travel_distance_meters שלו.

extraVisitDurationForVisitType

map (key: string, value: string (Duration format))

מציין מפה ממחרוזות מסוג visitTypes ועד לפרקי הזמן. משך הזמן הוא זמן בנוסף ל-VisitRequest.duration שיילקח בביקורים עם visitTypes שצוין. משך הביקור הנוסף הזה מוסיף עלות אם מציינים את הערך costPerHour. מפתחות (כמו visitTypes) לא יכולים להיות מחרוזות ריקות.

אם לבקשת הביקור יש כמה סוגים, לכל סוג יתווסף משך זמן במפה.

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

breakRule

object (BreakRule)

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

label

string

מציינת תווית לרכב הזה. התווית הזו מדווחת בתשובה כ-vehicleLabel של ה-ShipmentRoute התואם.

ignore

boolean

אם הערך הוא True, הערך של usedIfRouteIsEmpty חייב להיות False, והרכב הזה יישאר לא בשימוש.

אם המשלוח מתבצע על ידי רכב שנדחה ב-injectedFirstSolutionRoutes, הוא יידלג בפתרון הראשון, אבל ניתן לבצע אותו בתגובה.

אם משלוח מתבצע על ידי רכב שנדחה ב-injectedSolutionConstraint, וכל איסוף או מסירה קשורים מוגבלים להישאר ברכב (כלומר, לא הושהו לרמה RELAX_ALL_AFTER_THRESHOLD), הם יושמטו בתגובה. אם המשלוח כולל שדה allowedVehicleIndices לא ריק והמערכת מתעלמת מכל כלי הרכב שמותר להשתמש בו, המערכת תדלג עליו בתשובה.

travelDurationMultiple

number

מציינת גורם הכפלה שיכול להאריך או לקצר את זמני הנסיעה של הרכב הזה. לדוגמה, אם ההגדרה הזו תהיה 2.0, המשמעות היא שהרכב הזה איטי יותר ומשך הנסיעה שלו הוא פי שניים מזה של כלי רכב רגילים. המספר הזה לא משפיע על משך הביקורים. אם מציינים את costPerHour או את costPerTraveledHour, יש לכך השפעה על העלות. הערך הזה צריך להיות בטווח [0.001, 1000.0]. אם לא מגדירים את הערך, הרכב נחשב לרכב רגיל והמכפיל הזה נחשב ל-1.0.

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

מידע נוסף זמין בקטע extraVisitDurationForVisitType בהמשך.

TravelMode

אמצעי הגעה שאפשר להשתמש בהם ברכב.

הקבוצות האלה צריכות להיות קבוצת משנה של מצבי הנסיעה המועדפים ב-API של המסלולים בפלטפורמה של מפות Google, מידע נוסף זמין בכתובת: https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode.

טיפוסים בני מנייה (enum)
TRAVEL_MODE_UNSPECIFIED מצב נסיעה לא מוגדר, שווה ערך ל-DRIVING.
DRIVING אמצעי התחבורה שמתאים למסלול נסיעה (רכב, ...).
WALKING מצב נסיעה שתואם למסלול הליכה.

UnloadingPolicy

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

משלוחים אחרים יכולים להתרחש בכל מקום במסלול, ללא קשר ל-unloadingPolicy.

טיפוסים בני מנייה (enum)
UNLOADING_POLICY_UNSPECIFIED מדיניות פריקה לא צוינה. המשלוח חייב להתבצע רק אחרי האיסוף המתאים.
LAST_IN_FIRST_OUT המשלוחים צריכים להתבצע בסדר הפוך לאיסופים
FIRST_IN_FIRST_OUT המשלוחים צריכים להיות באותה הזמנה כמו באיסוף עצמי

LoadLimit

הגדרת מגבלת עומס שחלה על רכב, למשל: "המשאית הזו יכולה לשאת עד 3,500 ק"ג". loadLimits.

ייצוג ב-JSON
{
  "softMaxLoad": string,
  "costPerUnitAboveSoftMax": number,
  "startLoadInterval": {
    object (Interval)
  },
  "endLoadInterval": {
    object (Interval)
  },
  "maxLoad": string
}
שדות
softMaxLoad

string (int64 format)

מגבלה רכה של העומס. costPerUnitAboveSoftMax.

costPerUnitAboveSoftMax

number

אם העומס יהיה גבוה מ-softMaxLoad לאורך המסלול של הרכב הזה, תחול עליו הפסד העלות הבא (רק פעם אחת לכל רכב): (עומס – softMaxLoad) * costPerUnitAboveSoftMax. כל העלויות צריכות להתווסף, והן חייבות להיות באותה יחידה כמו Shipment.penalty_cost.

startLoadInterval

object (Interval)

מרווח הזמן המקובל לטעינה של הרכב בתחילת המסלול.

endLoadInterval

object (Interval)

מרווח הטעינה המקובל של הרכב בסוף המסלול.

maxLoad

string (int64 format)

כמות הטעינה המקסימלית הקבילה.

מרווח

מרווח בין סכומי העומסים הקבילים.

ייצוג ב-JSON
{
  "min": string,
  "max": string
}
שדות
min

string (int64 format)

עומס מינימלי מקובל. מספר זה חייב להיות 0 ומעלה. אם מציינים את שניהם, הערך של min חייב להיות ≤ max.

max

string (int64 format)

עומס מקסימלי מקובל. הערך חייב להיות ≥ 0. אם לא צוין ערך, העומס המקסימלי לא מוגבל על ידי ההודעה הזו. אם מציינים את שניהם, הערך של min חייב להיות ≤ max.

DurationLimit

מגבלה שמגדירה את משך הזמן המקסימלי של מסלול של כלי רכב. היא יכולה להיות קשה או רכה.

כשמוגדר שדה של רף softmax, יש להגדיר יחד גם את הסף המקסימלי הרך וגם את העלות שמשויכת אליו.

ייצוג ב-JSON
{
  "maxDuration": string,
  "softMaxDuration": string,
  "quadraticSoftMaxDuration": string,
  "costPerHourAfterSoftMax": number,
  "costPerSquareHourAfterQuadraticSoftMax": number
}
שדות
maxDuration

string (Duration format)

מגבלה קשיחה שמגבילה את משך הזמן ל-maxDuration לכל היותר.

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

softMaxDuration

string (Duration format)

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

אם softMaxDuration מוגדר, הערך שלו חייב להיות לא שלילי. אם גם maxDuration מוגדר, הערך של softMaxDuration חייב להיות קטן מ-maxDuration.

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

quadraticSoftMaxDuration

string (Duration format)

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

אם quadraticSoftMaxDuration מוגדר, הערך שלו חייב להיות לא שלילי. אם מגדירים גם את הערך maxDuration, הערך של quadraticSoftMaxDuration צריך להיות קטן מ-maxDuration וההפרש לא יכול להיות גדול מיום אחד:

maxDuration - quadraticSoftMaxDuration <= 86400 seconds

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

costPerHourAfterSoftMax

number

העלות לשעה שנצברת אם מגיעים לסף softMaxDuration. העלות הנוספת היא 0 אם משך הזמן נמוך מהסף. אחרת, העלות תלויה במשך הזמן באופן הבא:

  costPerHourAfterSoftMax * (duration - softMaxDuration)

העלות חייבת להיות לא שלילית.

costPerSquareHourAfterQuadraticSoftMax

number

העלות לשעה בריבוע אם חלה הפרה של הסף של quadraticSoftMaxDuration.

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

  costPerSquareHourAfterQuadraticSoftMax *
  (duration - quadraticSoftMaxDuration)^2

העלות חייבת להיות לא שלילית.

DistanceLimit

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

אם מוגדרת מגבלה רכה, צריך להגדיר גם את softMaxMeters וגם את costPerKilometerAboveSoftMax, והם לא יכולים להיות שליליים.

ייצוג ב-JSON
{
  "maxMeters": string,
  "softMaxMeters": string,
  "costPerKilometerAboveSoftMax": number
}
שדות
maxMeters

string (int64 format)

מגבלה קשיחה שמגבילה את המרחק ל-maxMeters לכל היותר. המגבלה חייבת להיות לא שלילית.

softMaxMeters

string (int64 format)

מגבלה רכה שלא אוכפת מגבלת מרחק מקסימלית, אבל מופרת אותה, תוביל לעלות שנוספת לעלויות אחרות שמוגדרות במודל, עם אותה יחידה.

אם softMaxMeters מוגדר, הערך שלו חייב להיות קטן מ-maxMeters ולא שלילי.

costPerKilometerAboveSoftMax

number

העלות לקילומטר תחויב אם המרחק חורג מהמגבלה softMaxMeters. העלות הנוספת היא 0 אם המרחק מתחת למגבלה, אחרת הנוסחה לחישוב העלות היא:

  (distanceMeters - softMaxMeters) / 1000.0 *
  costPerKilometerAboveSoftMax.

העלות חייבת להיות לא שלילית.

BreakRule

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

  • במהלך הנסיעה בין שני ביקורים (כולל את הזמן לפני או מיד אחרי הביקור, אבל לא באמצע הביקור), ובמקרה כזה הוא יאריך את זמן ההובלה התואם בין הביקורים.
  • או לפני הפעלת הרכב (לא ניתן להפעיל את הרכב באמצע הפסקה), במקרה כזה הוא לא משפיע על מועד הפעלת הרכב.
  • או אחרי סיום הנסיעה (כלומר, עם שעת הסיום של הרכב).
ייצוג ב-JSON
{
  "breakRequests": [
    {
      object (BreakRequest)
    }
  ],
  "frequencyConstraints": [
    {
      object (FrequencyConstraint)
    }
  ]
}
שדות
breakRequests[]

object (BreakRequest)

רצף של הפסקות. הצגת ההודעה BreakRequest.

frequencyConstraints[]

object (FrequencyConstraint)

בכפוף לFrequencyConstraint עשויה לחול. כולם צריכים לעמוד בדרישות של הBreakRequest של הBreakRule הזה. פרטים נוספים זמינים בFrequencyConstraint.

BreakRequest

צריך לדעת מראש את רצף ההפסקות (כלומר, המספר והסדר שלהן) שחלים על כל רכב. הערכים החוזרים של BreakRequest מגדירים את הרצף הזה, בסדר שבו הם חייבים להתרחש. חלונות הזמן שלהם (earliestStartTime / latestStartTime) עשויים להיות חופפים, אבל הם צריכים להיות תואמים להזמנה (אפשרות זו מסומנת).

ייצוג ב-JSON
{
  "earliestStartTime": string,
  "latestStartTime": string,
  "minDuration": string
}
שדות
earliestStartTime

string (Timestamp format)

חובה. גבול תחתון (כולל) לתחילת ההפסקה.

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

latestStartTime

string (Timestamp format)

חובה. הגבול העליון (כולל) של תחילת ההפסקה.

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

minDuration

string (Duration format)

חובה. משך הזמן המינימלי של ההפסקה. חייב להיות חיובי.

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

FrequencyConstraint

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

{
   minBreakDuration { seconds: 3600 }         # 1 hour.
   maxInterBreakDuration { seconds: 39600 }  # 11 hours (12 - 1 = 11).
}

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

בפועל, FrequencyConstraint עשוי לחול על הפסקות לא רצופות. למשל, לוח הזמנים הבא מבוסס על הדוגמה 'שעה בכל 12 שעות':

  04:00 vehicle start
   .. performing travel and visits ..
  09:00 1 hour break
  10:00 end of the break
   .. performing travel and visits ..
  12:00 20-min lunch break
  12:20 end of the break
   .. performing travel and visits ..
  21:00 1 hour break
  22:00 end of the break
   .. performing travel and visits ..
  23:59 vehicle end
ייצוג JSON
{
  "minBreakDuration": string,
  "maxInterBreakDuration": string
}
שדות
minBreakDuration

string (Duration format)

חובה. משך ההפסקה המינימלי לאילוץ הזה. מספר חיובי. הצגת התיאור של FrequencyConstraint.

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

maxInterBreakDuration

string (Duration format)

חובה. פרק הזמן המקסימלי המותר בכל מרווח זמן במסלול שלא כולל לפחות הפסקה חלקית של duration >= minBreakDuration. חייב להיות חיובי.

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

DurationDistanceMatrix

מציינת מטריצת משך הזמן והמרחק ממיקומי היעד ונקודות ההתחלה של הרכבים לביקור ובמיקומי היעד של הרכבים.

ייצוג ב-JSON
{
  "rows": [
    {
      object (Row)
    }
  ],
  "vehicleStartTag": string
}
שדות
rows[]

object (Row)

מציין את השורות של מטריצות משך הזמן והמרחק. הוא צריך לכלול מספר רכיבים כמו ShipmentModel.duration_distance_matrix_src_tags.

vehicleStartTag

string

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

כל התחלה של כלי רכב חייבת להתאים למטריצה אחת בלבד, כלומר, אחד מהשדות startTags שלה חייב להתאים ל-vehicleStartTag של מטריצה (ולמטריצה הזו בלבד).

בכל המטריצות צריך להיות vehicleStartTag שונה.

שורה

מציין שורה במטריצה של משך הזמן והמרחק.

ייצוג ב-JSON
{
  "durations": [
    string
  ],
  "meters": [
    number
  ]
}
שדות
durations[]

string (Duration format)

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

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

meters[]

number

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

TransitionAttributes

מציין מאפיינים של מעברים בין שני ביקורים רצופים במסלול. כמה TransitionAttributes עשויים לחול על אותו מעבר: במקרה כזה, כל העלויות הנוספות מצטברות, והאילוץ או המגבלה המחמירים ביותר חלים (לפי הסמנטיקה הטבעית "AND").

ייצוג ב-JSON
{
  "srcTag": string,
  "excludedSrcTag": string,
  "dstTag": string,
  "excludedDstTag": string,
  "cost": number,
  "costPerKilometer": number,
  "distanceLimit": {
    object (DistanceLimit)
  },
  "delay": string
}
שדות
srcTag

string

תגים שמגדירים את קבוצת המעברים (src->dst) שעליהם המאפיינים האלה חלים.

ביקור במקור או התחלת נסיעה ברכב תואמים אם השדה VisitRequest.tags או Vehicle.start_tags מכיל את הערך srcTag או לא מכיל את הערך excludedSrcTag (בהתאם לשדה מבין שני השדות האלה שהוא לא ריק).

excludedSrcTag

string

srcTag. בדיוק אחד מהערכים srcTag ו-excludedSrcTag לא יכול להיות ריק.

dstTag

string

ביקור ביעד או סיום נסיעה תואמים אם השדה VisitRequest.tags או Vehicle.end_tags שלהם מכיל את הערך dstTag או לא מכיל את הערך excludedDstTag (בהתאם לשדה מבין שני השדות האלה שהוא לא ריק).

excludedDstTag

string

dstTag. בדיוק אחד מהשדות dstTag ו-excludedDstTag חייב להיות לא ריק.

cost

number

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

costPerKilometer

number

מציינת עלות לקילומטר שחלה על מרחק הנסיעה בזמן ביצוע המעבר. הוא מצטבר לכל Vehicle.cost_per_kilometer שצוין ברכב.

distanceLimit

object (DistanceLimit)

מציינת מגבלה על המרחק שהמשתמש עובר במהלך ביצוע המעבר הזה.

נכון ל-2021/06, אפשר להשתמש רק במגבלות רכות.

delay

string (Duration format)

מציינת עיכוב שחל במהלך ביצוע המעבר.

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

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

ShipmentTypeIncompatibility

מציין אי-תאימות בין משלוחים בהתאם ל-shipmentType שלהם. הצגת משלוחים לא תואמים באותו מסלול מוגבלת על סמך מצב אי-התאימות.

ייצוג JSON
{
  "types": [
    string
  ],
  "incompatibilityMode": enum (IncompatibilityMode)
}
שדות
types[]

string

רשימת סוגים לא תואמים. שתי משלוחים עם shipment_types שונה מאלה שרשומים הם 'לא תואמים'.

incompatibilityMode

enum (IncompatibilityMode)

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

IncompatibilityMode

מצבים שמגדירים את האופן שבו מוצגות משלוחים לא תואמים באותו מסלול.

טיפוסים בני מנייה (enum)
INCOMPATIBILITY_MODE_UNSPECIFIED מצב אי-תאימות לא מוגדר. אין להשתמש בערך הזה אף פעם.
NOT_PERFORMED_BY_SAME_VEHICLE במצב הזה, אף פעם לא ניתן לשתף את אותו רכב בין שתי משלוחים עם סוגים לא תואמים.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

לשני משלוחים שאינם תואמים למצב חוסר התאימות של NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY:

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

ShipmentTypeRequirement

מציין את הדרישות בין משלוחים על סמך shipmentType שלהם. הפרטים הספציפיים של הדרישה מוגדרים על ידי מצב הדרישה.

ייצוג ב-JSON
{
  "requiredShipmentTypeAlternatives": [
    string
  ],
  "dependentShipmentTypes": [
    string
  ],
  "requirementMode": enum (RequirementMode)
}
שדות
requiredShipmentTypeAlternatives[]

string

רשימה של סוגי משלוח חלופיים שנדרשים על ידי dependentShipmentTypes.

dependentShipmentTypes[]

string

לכל משלוחים מסוג מסוים בשדה dependentShipmentTypes נדרש לפחות משלוח אחד מסוג requiredShipmentTypeAlternatives באותו מסלול.

הערה: אסור ליצור שרשראות של דרישות שבהן shipmentType תלויה בעצמה.

requirementMode

enum (RequirementMode)

המצב הוחל על הדרישה.

RequirementMode

מצבים שמגדירים את המראה של משלוחים תלויים במסלול.

טיפוסים בני מנייה (enum)
REQUIREMENT_MODE_UNSPECIFIED מצב דרישה לא מוגדר. אין להשתמש בערך הזה אף פעם.
PERFORMED_BY_SAME_VEHICLE במצב הזה, כל המשלוחים ה"תלויים" חייבים לחלוק את אותו רכב כמו לפחות אחד מהמשלוחים "הדרושים" שלהם.
IN_SAME_VEHICLE_AT_PICKUP_TIME

במצב IN_SAME_VEHICLE_AT_PICKUP_TIME, בכל משלוח 'תלוי' צריך להיות לפחות משלוח 'נדרש' אחד ברכב בזמן האיסוף.

לכן, לאיסוף משלוח 'תלוי' צריך להיות:

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

PrecedenceRule

כלל קדימות בין שני אירועים (כל אירוע הוא איסוף או מסירה של משלוח): האירוע 'השני' צריך להתחיל offsetDuration לפחות אחרי תחילת האירוע 'הראשון'.

כמה סדרי עדיפויות יכולים להתייחס לאותו אירוע (או לאירועים קשורים), למשל: "האיסוף של B מתרחש אחרי המסירה של A" ו"האיסוף של C מתרחש אחרי האיסוף של B".

בנוסף, קדימות חלות רק כאשר מבצעים את שני המשלוחים ומתעלמים ממנה.

ייצוג JSON
{
  "firstIsDelivery": boolean,
  "secondIsDelivery": boolean,
  "offsetDuration": string,
  "firstIndex": integer,
  "secondIndex": integer
}
שדות
firstIsDelivery

boolean

מציין אם האירוע 'ראשון' הוא העברה.

secondIsDelivery

boolean

מציין אם האירוע 'השני' הוא מסירה.

offsetDuration

string (Duration format)

ההיסט בין האירוע 'ראשון' לבין האירוע 'שני'. היא יכולה להיות שלילית.

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

firstIndex

integer

אינדקס המשלוח של האירוע 'ראשון'. חובה לציין את השדה הזה.

secondIndex

integer

אינדקס המשלוח של האירוע 'Second' (שני). חובה לציין את השדה הזה.