Package google.maps.routeoptimization.v1

אינדקס

RouteOptimization

שירות לאופטימיזציה של מסלולי רכבים.

תוקף של סוגי שדות מסוימים:

  • google.protobuf.Timestamp
    • השעות הן בזמן יוניקס: מספר השניות מאז 1970-01-01T00:00:00+00:00.
    • השניות צריכות להיות בטווח [0, 253402300799], כלומר בטווח [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • הערך של nanos חייב להיות לא מוגדר או מוגדר כ-0.
  • google.protobuf.Duration
    • השניות צריכות להיות בטווח [0, 253402300799], כלומר בטווח [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • הערך של nanos חייב להיות לא מוגדר או מוגדר כ-0.
  • google.type.LatLng
    • קו הרוחב חייב להיות בטווח [‎-90.0, 90.0].
    • קו האורך חייב להיות בטווח [‎-180.0, 180.0].
    • לפחות אחד מהערכים של קו הרוחב וקו האורך חייב להיות שונה מאפס.
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

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

ה-method הזו היא פעולה ממושכת (LRO). הקלט לאופטימיזציה (הודעות OptimizeToursRequest) והפלט (הודעות OptimizeToursResponse) נקראים מ-Cloud Storage ונכתבים אליו בפורמט שהמשתמשים מציינים. בדומה ל-method‏ OptimizeTours, כל OptimizeToursRequest מכיל ShipmentModel ומחזיר OptimizeToursResponse שמכיל שדות ShipmentRoute, שהם קבוצת מסלולים שכלי הרכב צריכים לבצע כדי לצמצם את העלות הכוללת.

המשתמש יכול לדגום את operations.get כדי לבדוק את הסטטוס של ה-LRO:

אם הערך בשדה done של ה-LRO הוא false, לפחות בקשה אחת עדיין נמצאת בתהליך עיבוד. יכול להיות שבקשות אחרות הושלמו בהצלחה והתוצאות שלהן זמינות ב-Cloud Storage.

אם השדה done של ה-LRO הוא true, כל הבקשות עובדו. התוצאות של כל הבקשות שעובדו בהצלחה יהיו זמינות ב-Cloud Storage. אם בקשה נכשלה, התוצאות שלה לא יהיו זמינות ב-Cloud Storage. אם השדה error של ה-LRO מוגדר, הוא מכיל את השגיאה מאחת מהבקשות שנכשלו.

היקפי הרשאות

נדרש היקף ההרשאות הבא של OAuth:

  • https://www.googleapis.com/auth/cloud-platform
הרשאות IAM

נדרשת הרשאת IAM הבאה במשאב parent:

  • routeoptimization.operations.create

מידע נוסף מופיע במאמרי העזרה בנושא IAM.

OptimizeTours

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

שליחת OptimizeToursRequest שמכילה ShipmentModel והחזרת OptimizeToursResponse שמכילה ShipmentRoute, שהם קבוצה של מסלולים שכלי הרכב צריכים לבצע כדי לצמצם את העלות הכוללת.

מודל ShipmentModel מורכב בעיקר מShipment שצריך לבצע ומVehicle שאפשר להשתמש בהם כדי להעביר את הShipment. ה-ShipmentRoute מקצים Shipment ל-Vehicle. באופן ספציפי יותר, הם מקצים סדרה של Visit לכל רכב, כאשר Visit תואם ל-VisitRequest, שהוא איסוף או מסירה של Shipment.

המטרה היא להקצות ShipmentRoute ל-Vehicle באופן שיצמצם את העלות הכוללת, כשהעלות מורכבת מרכיבים רבים שמוגדרים ב-ShipmentModel.

היקפי הרשאות

נדרש היקף ההרשאות הבא של OAuth:

  • https://www.googleapis.com/auth/cloud-platform
הרשאות IAM

נדרשת הרשאת IAM הבאה במשאב parent:

  • routeoptimization.locations.use

מידע נוסף מופיע במאמרי העזרה בנושא IAM.

OptimizeToursLongRunning

rpc OptimizeToursLongRunning(OptimizeToursRequest) returns (Operation)

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

ה-long-running operation (LRO) שיוחזר יכלול שם בפורמט <parent>/operations/<operation_id>, ואפשר יהיה להשתמש בו כדי לעקוב אחרי התקדמות החישוב. סוג השדה metadata הוא OptimizeToursLongRunningMetadata. אם הפעולה תצליח, סוג השדה response יהיה OptimizeToursResponse.

היקפי הרשאות

נדרש היקף ההרשאות הבא של OAuth:

  • https://www.googleapis.com/auth/cloud-platform
הרשאות IAM

נדרשת הרשאת IAM הבאה במשאב parent:

  • routeoptimization.operations.create

מידע נוסף מופיע במאמרי העזרה בנושא IAM.

OptimizeToursUri

rpc OptimizeToursUri(OptimizeToursUriRequest) returns (Operation)

זוהי וריאציה של השיטה OptimizeToursLongRunning שמיועדת לאופטימיזציות עם ערכי זמן קצוב לתפוגה גדולים וגדלים גדולים של קלט/פלט.

הלקוח מציין את ה-URI של ה-OptimizeToursRequest שמאוחסן ב-Google Cloud Storage, והשרת כותב את ה-OptimizeToursResponse ל-URI של Google Cloud Storage שהלקוח ציין.

השיטה הזו עדיפה על השיטה OptimizeTours לאופטימיזציות שנמשכות יותר מכמה דקות, ולגדלי קלט/פלט שגדולים מ-8MB, אבל אפשר להשתמש בה גם לאופטימיזציות קצרות וקטנות יותר.

ה-long-running operation (LRO) שיוחזר יכלול שם בפורמט <parent>/operations/<operation_id>, ואפשר יהיה להשתמש בו כדי לעקוב אחרי התקדמות החישוב. סוג השדה metadata הוא OptimizeToursUriMetadata. אם הפעולה תצליח, סוג השדה response יהיה OptimizeToursUriResponse.

היקפי הרשאות

נדרש היקף ההרשאות הבא של OAuth:

  • https://www.googleapis.com/auth/cloud-platform
הרשאות IAM

נדרשת הרשאת IAM הבאה במשאב parent:

  • routeoptimization.operations.create

מידע נוסף מופיע במאמרי העזרה בנושא IAM.

AggregatedMetrics

מדדים נצברים של ShipmentRoute (או של OptimizeToursResponse) בכל הרכיבים של Transition ו/או Visit (או בכל הרכיבים של ShipmentRoute).

שדות
performed_shipment_count

int32

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

travel_duration

Duration

משך הנסיעה הכולל במסלול או בפתרון.

wait_duration

Duration

משך ההמתנה הכולל במסלול או בפתרון.

delay_duration

Duration

משך העיכוב הכולל במסלול או בפתרון.

break_duration

Duration

משך ההפסקה הכולל במסלול או בפתרון.

visit_duration

Duration

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

total_duration

Duration

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

[ShipmentRoute.vehicle_end_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_end_time] - [ShipmentRoute.vehicle_start_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_start_time]
travel_distance_meters

double

מרחק הנסיעה הכולל של מסלול או פתרון.

max_loads

map<string, VehicleLoad>

העומס המקסימלי שהושג לאורך כל המסלול (או הפתרון), לכל אחת מהכמויות במסלול הזה (או הפתרון), מחושב כערך המקסימלי בכל Transition.vehicle_loads (או ShipmentRoute.metrics.max_loads.

performed_mandatory_shipment_count

int32

מספר המשלוחים שבוצעו בפועל.

ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד.

performed_shipment_penalty_cost_sum

double

סכום ה-Shipment.penalty_cost של המשלוחים שבוצעו.

ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד.

BatchOptimizeToursMetadata

בסוג הזה אין שדות.

מטא-נתונים של פעולות לשיחות BatchOptimizeToursRequest.

BatchOptimizeToursRequest

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

שדות
parent

string

חובה. פרויקט היעד והמיקום שבו מתבצעת הקריאה.

פורמט:

  • projects/{project-id}
  • projects/{project-id}/locations/-

ערכי {location-id} אזוריים לא נתמכים.

model_configs[]

AsyncModelConfig

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

AsyncModelConfig

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

שדות
display_name

string

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

input_config

InputConfig

חובה. מידע על מודל הקלט.

output_config

OutputConfig

חובה. פרטי מיקום הפלט הרצוי.

BatchOptimizeToursResponse

בסוג הזה אין שדות.

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

BreakRule

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

  • במהלך הנסיעה בין שני ביקורים (כולל הזמן מיד לפני או מיד אחרי ביקור, אבל לא באמצע ביקור), ובמקרה כזה הוא מאריך את זמן ההובלה המתאים בין הביקורים,
  • או לפני תחילת הנסיעה של הרכב (יכול להיות שהרכב לא יתחיל לנסוע באמצע הפסקה), ובמקרה כזה היא לא משפיעה על שעת ההתחלה של הרכב.
  • או אחרי שעת הסיום של הרכב (כנ"ל, עם שעת הסיום של הרכב).
שדות
break_requests[]

BreakRequest

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

frequency_constraints[]

FrequencyConstraint

יכול להיות שיחולו כמה FrequencyConstraint. כל התנאים צריכים להתקיים ב-BreakRequest של ה-BreakRule הזה. FrequencyConstraint.

BreakRequest

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

שדות
earliest_start_time

Timestamp

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

latest_start_time

Timestamp

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

min_duration

Duration

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

FrequencyConstraint

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

{
   min_break_duration { seconds: 3600 }         # 1 hour.
   max_inter_break_duration { 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
שדות
min_break_duration

Duration

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

max_inter_break_duration

Duration

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

DataFormat

פורמטים של נתונים לקובצי קלט ופלט.

טיפוסים בני מנייה (enum)
DATA_FORMAT_UNSPECIFIED ערך לא חוקי, הפורמט לא יכול להיות UNSPECIFIED.
JSON JavaScript Object Notation.
PROTO_TEXT פורמט טקסט של מאגרי אחסון לפרוטוקולים. אפשר לעיין בכתובת https://protobuf.dev/reference/protobuf/textformat-spec/

DistanceLimit

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

אם מגדירים מגבלה גמישה, צריך להגדיר גם את soft_max_meters וגם את cost_per_kilometer_above_soft_max, והערכים שלהם לא יכולים להיות שליליים.

שדות
max_meters

int64

מגבלה קשיחה שמגבילה את המרחק ל-max_meters לכל היותר. הסף חייב להיות מספר חיובי.

soft_max_meters

int64

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

אם מגדירים את soft_max_meters, הערך צריך להיות קטן מ-max_meters ולא שלילי.

cost_per_kilometer_below_soft_max

double

העלות לקילומטר שנצברה, עד soft_max_meters, לפי הנוסחה:

  min(distance_meters, soft_max_meters) / 1000.0 *
  cost_per_kilometer_below_soft_max.

העלות הזו לא נתמכת ב-route_distance_limit.

cost_per_kilometer_above_soft_max

double

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

  (distance_meters - soft_max_meters) / 1000.0 *
  cost_per_kilometer_above_soft_max.

העלות לא יכולה להיות שלילית.

GcsDestination

המיקום ב-Google Cloud Storage שבו ייכתבו קובצי הפלט.

שדות
uri

string

חובה. URI של Google Cloud Storage.

GcsSource

המיקום ב-Google Cloud Storage שממנו ייקרא קובץ הקלט.

שדות
uri

string

חובה. ‫URI של אובייקט ב-Google Cloud Storage בפורמט gs://bucket/path/to/object.

InjectedSolutionConstraint

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

שדות
routes[]

ShipmentRoute

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

skipped_shipments[]

SkippedShipment

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

constraint_relaxations[]

ConstraintRelaxation

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

ConstraintRelaxation

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

שדות
relaxations[]

Relaxation

כל ההקלות באילוצי הביקורים שיחולו על ביקורים במסלולים עם כלי רכב ב-vehicle_indices.

vehicle_indices[]

int32

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

אינדקס הרכב ממופה כמו ShipmentRoute.vehicle_index, אם interpret_injected_solutions_using_labels נכון (ראו הערה fields).

הירגעות

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

‫relaxations(i).level מציין את רמת ההקלה באילוצים שחלה על ביקור #j, שעומד בתנאים הבאים:

  • route.visits(j).start_time >= relaxations(i).threshold_time וגם
  • j + 1 >= relaxations(i).threshold_visit_count

באופן דומה, שעת ההתחלה של הרכב מוקדמת ל-relaxations(i).level אם היא עומדת בתנאים הבאים:

  • vehicle_start_time >= relaxations(i).threshold_time וגם
  • ‫relaxations(i).threshold_visit_count == 0 וסוף הרכב מורחב ל-relaxations(i).level אם הוא עומד בתנאים הבאים:
  • vehicle_end_time >= relaxations(i).threshold_time וגם
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

כדי להחיל רמת הקלה אם ביקור עומד בתנאי threshold_visit_count או בתנאי threshold_time, צריך להוסיף שני relaxations עם אותו level: אחד שמוגדר בו רק threshold_visit_count והשני שמוגדר בו רק threshold_time. אם ביקור עומד בתנאים של כמה relaxations, חלה הרמה הכי פחות מחמירה. כתוצאה מכך, מנקודת ההתחלה של הרכב ועד לנקודת הסיום שלו, דרך הביקורים במסלול לפי הסדר, רמת ההקלה הופכת לקלה יותר: כלומר, רמת ההקלה לא פוחתת ככל שהמסלול מתקדם.

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

שדות
level

Level

רמת ההקלה באילוצים שחלה כשהתנאים ב-threshold_time או אחריו וגם לפחות threshold_visit_count מתקיימים.

threshold_time

Timestamp

השעה שבה או שאחריה אפשר להחיל את ההקלה level.

threshold_visit_count

int32

מספר הביקורים שבהם או שאחריהם אפשר להחיל את ההקלה level. אם הערך של threshold_visit_count הוא 0 (או לא מוגדר), יכול להיות שהערך של level יחול ישירות בתחילת הרכב.

אם הערך הוא route.visits_size() + 1, יכול להיות שהערך של level יחול רק על החלק האחורי של הרכב. אם הוא גדול מ-route.visits_size() + 1, המדיניות level לא חלה בכלל על המסלול הזה.

רמה

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

הספירה הבאה היא בסדר עולה של הקלות.

טיפוסים בני מנייה (enum)
LEVEL_UNSPECIFIED

רמת ברירת המחדל המשתמעת של הקלה: לא מקלים על אף אילוץ, כלומר כל הביקורים מוגבלים באופן מלא.

אסור להשתמש בערך הזה באופן מפורש ב-level.

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

InputConfig

צריך לציין קלט ל-[BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours].

שדות
data_format

DataFormat

חובה. פורמט נתוני הקלט.

שדה של איחוד source. חובה. הערך source יכול להיות רק אחד מהבאים:
gcs_source

GcsSource

מיקום ב-Google Cloud Storage. האובייקט חייב להיות אובייקט יחיד (קובץ).

מיקום

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

שדות
lat_lng

LatLng

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

heading

int32

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

OptimizeToursLongRunningMetadata

בסוג הזה אין שדות.

מטא-נתונים של פעולות לשיחות OptimizeToursLongRunning.

OptimizeToursRequest

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

שדות
parent

string

חובה. פרויקט או מיקום יעד לביצוע שיחה.

פורמט:

  • projects/{project-id}
  • projects/{project-id}/locations/-

ערכי {location-id} אזוריים לא נתמכים.

timeout

Duration

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

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

model

ShipmentModel

מודל המשלוח שצריך לפתור.

solving_mode

SolvingMode

כברירת מחדל, מצב הפתרון הוא DEFAULT_SOLVE (0).

search_mode

SearchMode

מצב החיפוש ששימש לפתרון הבקשה.

injected_first_solution_routes[]

ShipmentRoute

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

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

הפתרון צריך לעמוד בכמה הנחות בסיסיות לגבי תוקף:

  • בכל המסלולים, הערך של vehicle_index חייב להיות בטווח ולא להיות כפול.
  • בכל הביקורים, הערכים של shipment_index ו-visit_request_index חייבים להיות בטווח.
  • אפשר להפנות למשלוח רק במסלול אחד.
  • האיסוף של משלוח מסוג איסוף-מסירה חייב להתבצע לפני המסירה.
  • מותר לבצע רק חלופה אחת של איסוף או חלופה אחת של מסירה של משלוח.
  • בכל המסלולים, הזמנים עולים (כלומר, vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time).
  • אפשר לבצע משלוח רק ברכב שמותר להשתמש בו. כלי רכב מותר אם Shipment.allowed_vehicle_indices ריק או אם vehicle_index שלו כלול ב-Shipment.allowed_vehicle_indices.

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

injected_solution_constraint

InjectedSolutionConstraint

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

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

refresh_details_routes[]

ShipmentRoute

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

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

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

אסור להשתמש בשדה הזה יחד עם injected_first_solution_routes או injected_solution_constraint.

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

interpret_injected_solutions_using_labels

bool

אם הערך הוא True:

הפרשנות הזו חלה על השדות injected_first_solution_routes,‏ injected_solution_constraint ו-refresh_details_routes. אפשר להשתמש בו כשאינדקסים של משלוחים או כלי רכב בבקשה השתנו מאז שהפתרון נוצר, אולי כי משלוחים או כלי רכב הוסרו מהבקשה או נוספו אליה.

אם הערך הוא True, תוויות בקטגוריות הבאות יכולות להופיע לכל היותר פעם אחת בקטגוריה שלהן:

אם vehicle_label בפתרון שהוזרק לא תואם לרכב בבקשה, המסלול התואם יוסר מהפתרון יחד עם הביקורים שלו. אם shipment_label בפתרון שהוזרק לא תואם למשלוח של בקשה, הביקור התואם יוסר מהפתרון. אם SkippedShipment.label בפתרון שהוזרק לא תואם למשלוח בבקשה, ה-SkippedShipment יוסר מהפתרון.

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

הערה: מי שמבצע את הקריאה צריך לוודא שכל Vehicle.label (או Shipment.label) מזהה באופן ייחודי ישות של רכב (או משלוח) שנעשה בה שימוש בשתי הבקשות הרלוונטיות: הבקשה הקודמת שהפיקה את ה-OptimizeToursResponse שנעשה בו שימוש בפתרון שהוזרק, והבקשה הנוכחית שכוללת את הפתרון שהוזרק. בדיקות הייחודיות שמתוארות למעלה לא מספיקות כדי להבטיח שהדרישה הזו תתקיים.

consider_road_traffic

bool

כדאי להביא בחשבון את אומדן התנועה כשמחשבים את השדות ShipmentRoute, ‏ Transition.travel_duration, ‏ Visit.start_time ו-vehicle_end_time, כשמגדירים את השדה ShipmentRoute.has_traffic_infeasibilities וכשמחשבים את השדה OptimizeToursResponse.total_cost.

populate_polylines

bool

אם הערך הוא True, קווים פוליגוניים יאוכלסו בתגובות מסוג ShipmentRoute.

populate_transition_polylines

bool

אם הערך הוא True, קווים פוליגוניים וטוקנים של מסלולים יאוכלסו בתגובה ShipmentRoute.transitions.

allow_large_deadline_despite_interruption_risk

bool

אם המדיניות מוגדרת, לבקשה יכול להיות מועד אחרון (ראו https://grpc.io/blog/deadlines) של עד 60 דקות. אחרת, המועד האחרון המקסימלי הוא 30 דקות בלבד. חשוב לזכור שבבקשות לטווח ארוך יש סיכון גדול יותר (אבל עדיין קטן) להפרעה.

use_geodesic_distances

bool

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

label

string

תווית שאפשר להשתמש בה כדי לזהות את הבקשה הזו, שדווחה ב-OptimizeToursResponse.request_label.

geodesic_meters_per_second

double

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

max_validation_errors

int32

מגבילה את מספר שגיאות האימות שמוחזרות. השגיאות האלה בדרך כלל מצורפות למטען ייעודי (payload) של שגיאת INVALID_ARGUMENT בתור פרטי שגיאת BadRequest‏ (https://cloud.google.com/apis/design/errors#error_details)), אלא אם solving_mode=VALIDATE_ONLY: ראו את השדה OptimizeToursResponse.validation_errors. ברירת המחדל היא 100 והמקסימום הוא 10,000.

SearchMode

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

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

SolvingMode

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

טיפוסים בני מנייה (enum)
DEFAULT_SOLVE פותרים את המודל. יכול להיות שיופיעו אזהרות ב-[OptimizeToursResponse.validation_errors][google.cloud.optimization.v1.OptimizeToursResponse.validation_errors].
VALIDATE_ONLY רק מאמת את המודל בלי לפתור אותו: מאכלס כמה שיותר OptimizeToursResponse.validation_errors.
DETECT_SOME_INFEASIBLE_SHIPMENTS

מאכלס רק את OptimizeToursResponse.validation_errors או את OptimizeToursResponse.skipped_shipments, ולא פותר בפועל את שאר הבקשה (status ו-routes לא מוגדרים בתגובה). אם זוהו בעיות ב-injected_solution_constraint מסלולים, הן מאוכלסות בשדה OptimizeToursResponse.validation_errors והשדה OptimizeToursResponse.skipped_shipments נשאר ריק.

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

TRANSFORM_AND_RETURN_REQUEST

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

ניסיוני: פרטים נוספים זמינים בכתובת https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request.

OptimizeToursResponse

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

שדות
routes[]

ShipmentRoute

מסלולים שמחושבים לכל רכב. המסלול ה-i תואם לרכב ה-i במודל.

request_label

string

עותק של OptimizeToursRequest.label, אם צוינה תווית בבקשה.

skipped_shipments[]

SkippedShipment

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

validation_errors[]

OptimizeToursValidationError

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

processed_request

OptimizeToursRequest

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

ניסיוני: פרטים נוספים זמינים בכתובת https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request.

metrics

Metrics

מדדי משך זמן, מרחק ושימוש בפתרון הזה.

מדדים

מדדים כלליים, שנאספו מכל המסלולים.

שדות
aggregated_route_metrics

AggregatedMetrics

זהו נתון נצבר מהמסלולים. כל מדד הוא הסכום (או הערך המקסימלי, במקרה של עומסים) של כל השדות של ShipmentRoute.metrics עם אותו שם.

skipped_mandatory_shipment_count

int32

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

used_vehicle_count

int32

מספר כלי הרכב שנעשה בהם שימוש. הערך: אם מסלול הרכב ריק והערך של Vehicle.used_if_route_is_empty הוא True, הרכב נחשב כרכב בשימוש.

earliest_vehicle_start_time

Timestamp

שעת ההתחלה המוקדמת ביותר של רכב בשימוש, שמחושבת כערך המינימלי של ShipmentRoute.vehicle_start_time בכל הרכבים בשימוש.

latest_vehicle_end_time

Timestamp

שעת הסיום המאוחרת ביותר של רכב משומש, שמחושבת כערך המקסימלי של ShipmentRoute.vehicle_end_time בכל הרכבים המשומשים.

costs

map<string, double>

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

total_cost

double

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

OptimizeToursUriMetadata

בסוג הזה אין שדות.

מטא-נתונים של פעולות לשיחות OptimizeToursUri.

OptimizeToursUriRequest

בקשה שמשמשת את השיטה OptimizeToursUri.

שדות
parent

string

חובה. פרויקט או מיקום יעד לביצוע שיחה.

פורמט:

  • projects/{project-id}
  • projects/{project-id}/locations/-

ערכי {location-id} אזוריים לא נתמכים.

input

Uri

חובה. ה-URI של האובייקט ב-Cloud Storage שמכיל את ה-OptimizeToursRequest.

output

Uri

חובה. ה-URI של האובייקט ב-Cloud Storage שיכיל את ה-OptimizeToursResponse.

OptimizeToursUriResponse

תשובה שהוחזרה על ידי ה-method‏ OptimizeToursUri.

שדות
output

Uri

אופציונלי. ה-URI של האובייקט ב-Cloud Storage שמכיל את ה-OptimizeToursResponse, מקודד כ-JSON או כ-textproto. אם האובייקט קודד כ-JSON, הסיומת של שם האובייקט תהיה .json. אם האובייקט קודד כ-textproto, הסיומת של שם האובייקט תהיה .txtpb.

אפשר להשתמש ב-crc32_checksum של המשאב כדי לוודא שהתוכן של המשאב לא השתנה.

OptimizeToursValidationError

תיאור של שגיאה או אזהרה שנתקלו בהן במהלך האימות של OptimizeToursRequest.

שדות
code

int32

שגיאת אימות מוגדרת על ידי הצמד (code, display_name) שתמיד מופיע.

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

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

יציבות: code ו-display_name צריכים להיות יציבים מאוד. עם זאת, יכול להיות שעם הזמן יופיעו קודים ושמות חדשים לתצוגה, ובעקבות זאת בקשה (לא חוקית) מסוימת תניב צמד (code, display_name) שונה, כי השגיאה החדשה הסתירה את השגיאה הישנה. לדוגמה, ראו "MULTIPLE ERRORS".

display_name

string

השם המוצג של השגיאה.

fields[]

FieldReference

הקשר של שגיאה יכול לכלול 0, 1 (ברוב המקרים) או יותר שדות. לדוגמה, כדי להתייחס לרכב מספר 4 ולאיסוף הראשון של משלוח מספר 2, אפשר להשתמש בקוד הבא:

fields { name: "vehicles" index: 4}
fields { name: "shipments" index: 2 sub_field {name: "pickups" index: 0} }

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

error_message

string

מחרוזת קריאה לאנשים שמתארת את השגיאה. יש מיפוי של 1:1 בין code לבין error_message (כשהקוד הוא לא UNSPECIFIED).

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

offending_values

string

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

FieldReference

מציין את ההקשר של שגיאת האימות. FieldReference תמיד מתייחס לשדה נתון בקובץ הזה, והוא פועל לפי אותו מבנה היררכי. לדוגמה, אפשר לציין את רכיב מס' 2 של start_time_windows של רכב מס' 5 באמצעות:

name: "vehicles" index: 5 sub_field { name: "end_time_windows" index: 2 }

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

שדות
name

string

שם השדה, למשל "vehicles".

sub_field

FieldReference

שדה משנה בתצורה של רקורסיה, אם צריך.

שדה של איחוד index_or_key.

הערך index_or_key יכול להיות רק אחד מהבאים:

index

int32

האינדקס של השדה אם הוא חוזר.

key

string

מפתח אם השדה הוא מפה.

OutputConfig

מציינים יעד לתוצאות של [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours].

שדות
data_format

DataFormat

חובה. פורמט הנתונים של הפלט.

שדה של איחוד destination. חובה. הערך destination יכול להיות רק אחד מהבאים:
gcs_destination

GcsDestination

המיקום ב-Google Cloud Storage שבו ייכתב הפלט.

RouteModifiers

מכיל קבוצה של תנאים אופציונליים שצריך לעמוד בהם כשמחשבים מסלולים של כלי רכב. השדה הזה דומה לשדה RouteModifiers ב-Routes Preferred API של הפלטפורמה של מפות Google. מידע נוסף זמין בכתובת: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.

שדות
avoid_tolls

bool

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

avoid_highways

bool

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

avoid_ferries

bool

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

avoid_indoor

bool

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

משלוח

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

שדות
display_name

string

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

pickups[]

VisitRequest

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

deliveries[]

VisitRequest

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

load_demands

map<string, Load>

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

allowed_vehicle_indices[]

int32

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

costs_per_vehicle[]

double

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

  • אותו מספר של רכיבים כמו ב-costs_per_vehicle_indices. ‫costs_per_vehicle[i] תואם לרכב costs_per_vehicle_indices[i] של המודל.
  • מספר הרכיבים צריך להיות זהה למספר כלי הרכב במודל. הרכיב ה-i תואם לרכב מספר i של המודל.

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

costs_per_vehicle_indices[]

int32

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

pickup_to_delivery_absolute_detour_limit

Duration

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

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

start_time(delivery) - start_time(pickup) <=
t + pickup_to_delivery_absolute_detour_limit

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

pickup_to_delivery_time_limit

Duration

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

shipment_type

string

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

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

label

string

מציין תווית למשלוח הזה. התווית הזו מדווחת בתגובה ב-shipment_label של ה-ShipmentRoute.Visit המתאים.

ignore

bool

אם הערך הוא True, המערכת מדלגת על המשלוח הזה, אבל לא מחילה penalty_cost.

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

מותר להתעלם ממשלוח שמבוצע ב-injected_first_solution_routes או ב-injected_solution_constraint. פותר הבעיות מסיר את הביקורים הקשורים לאיסוף או למסירה מהמסלול שמבוצע. precedence_rules שמתייחסים למשלוחים שהמערכת מתעלמת מהם.

penalty_cost

double

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

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

pickup_to_delivery_relative_detour_limit

double

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

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

start_time(delivery) - start_time(pickup) <=
std::ceil(t * (1.0 + pickup_to_delivery_relative_detour_limit))

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

טעינה

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

שדות
amount

int64

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

VisitRequest

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

שדות
arrival_location

LatLng

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

arrival_waypoint

Waypoint

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

departure_location

LatLng

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

departure_waypoint

Waypoint

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

tags[]

string

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

time_windows[]

TimeWindow

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

אם לא מצוין TimeWindow, הרכב יכול לבצע את הביקור בכל שלב.

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

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

duration

Duration

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

cost

double

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

load_demands

map<string, Load>

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

visit_types[]

string

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

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

label

string

מציינת תווית ל-VisitRequest הזה. התווית הזו מדווחת בתגובה בתור visit_label ב-ShipmentRoute.Visit המתאים.

avoid_u_turns

bool

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

ניסיוני: פרטים נוספים זמינים בכתובת https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request.

ShipmentModel

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

  • עלות הניתוב של כלי הרכב (סכום העלות לזמן הכולל, העלות לזמן הנסיעה והעלות הקבועה לכל כלי הרכב).
  • קנסות על משלוחים שלא בוצעו.
  • עלות המשלוחים לכל משך הזמן של המבצע
שדות
shipments[]

Shipment

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

vehicles[]

Vehicle

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

objectives[]

Objective

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

ניסיוני: פרטים נוספים זמינים בכתובת https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request.

global_start_time

Timestamp

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

טווח הזמן של המודל חייב להיות פחות משנה, כלומר ההפרש בין global_end_time ל-global_start_time חייב להיות פחות מ-31,536,000 שניות.

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

global_end_time

Timestamp

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

global_duration_cost_per_hour

double

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

duration_distance_matrices[]

DurationDistanceMatrix

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

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

  • יש שני מיקומים: מיקום א' ומיקום ב'.
  • רכב אחד שמתחיל את המסלול ב-locA ומסיים אותו ב-locA.
  • בקשה אחת לאיסוף במיקום ב'.
model {
  vehicles { start_tags: "locA"  end_tags: "locA" }
  shipments { pickups { tags: "locB" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_dst_tags: "locA"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrices {
    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, באמצעות המטריצה "slow".
  • רכב אחד שמתחיל את המסלול ב-locB ומסיים אותו ב-locB, באמצעות המטריצה "fast".
  • בקשה אחת לאיסוף במיקום C.
model {
  vehicles { start_tags: "locA" end_tags: "locB" start_tags: "fast" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "slow" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "fast" }
  shipments { pickups { tags: "locC" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_src_tags: "locC"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrix_dst_tags: "locC"
  duration_distance_matrices {
    vehicle_start_tag: "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
    }
  }
  duration_distance_matrices {
    vehicle_start_tag: "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
    }
  }
}
duration_distance_matrix_src_tags[]

string

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

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

duration_distance_matrix_dst_tags[]

string

תגים שמגדירים את היעדים של מטריצות משך הזמן ומטריצות המרחקים; duration_distance_matrices(i).rows(j).durations(k) (בהתאמה, duration_distance_matrices(i).rows(j).meters(k)) מגדיר את משך הנסיעה (או המרחק) מביקורים עם התג duration_distance_matrix_src_tags(j) לביקורים עם התג duration_distance_matrix_dst_tags(k) במטריצה i.

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

transition_attributes[]

TransitionAttributes

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

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

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

shipment_type_requirements[]

ShipmentTypeRequirement

קבוצות של דרישות shipment_type (ראו ShipmentTypeRequirement).

precedence_rules[]

PrecedenceRule

קבוצה של כללי קדימות שצריך לאכוף במודל.

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

max_active_vehicles

int32

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

DurationDistanceMatrix

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

שדות
rows[]

Row

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

vehicle_start_tag

string

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

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

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

שורה

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

שדות
durations[]

Duration

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

meters[]

double

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

מטרה

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

ניסיוני: פרטים נוספים זמינים בכתובת https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request.

שדות
type

Type

סוג היעד.

weight

double

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

סוג

סוג היעד שימופה לקבוצת עלויות.

טיפוסים בני מנייה (enum)
DEFAULT כדי להבטיח פתרון סביר, המערכת תשתמש בקבוצת עלויות שמוגדרת כברירת מחדל. הערה: אפשר להשתמש ביעד הזה בפני עצמו, אבל הוא גם תמיד יתווסף עם משקל 1.0, כבסיס, ליעדים שצוינו על ידי המשתמש, אם הוא עדיין לא קיים.
MIN_DISTANCE יעדי MIN. לצמצם את המרחק הכולל.
MIN_WORKING_TIME צמצום זמן העבודה הכולל, בחישוב של כל הרכבים.
MIN_TRAVEL_TIME כמו למעלה, אבל עם התמקדות בזמן הנסיעה בלבד.
MIN_NUM_VEHICLES לצמצם את מספר כלי הרכב שבהם משתמשים.

PrecedenceRule

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

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

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

שדות
first_is_delivery

bool

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

second_is_delivery

bool

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

offset_duration

Duration

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

first_index

int32

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

second_index

int32

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

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

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

  • הם לא חופפים.
  • הערך של DELAY הוא ייחודי וחייב להיות פרק זמן רציף ממש לפני הביקור הבא (או סיום הנסיעה של הרכב). לכן, מספיק לדעת את משך העיכוב כדי לדעת את שעת ההתחלה והסיום שלו.
  • ההפסקות הן פרקי זמן רציפים שלא חופפים. התשובה מציינת את שעת ההתחלה ואת משך הזמן של כל הפסקה.
  • הפעולות 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     |       |           |         |         ||
  ||     |       |           |       |           |         |         ||
--++-----------------------------------------------------------------++-->
שדות
vehicle_index

int32

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

vehicle_label

string

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

vehicle_start_time

Timestamp

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

vehicle_end_time

Timestamp

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

visits[]

Visit

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

transitions[]

Transition

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

has_traffic_infeasibilities

bool

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

  start_time(previous_visit) + duration(previous_visit) +
  travel_duration(previous_visit, next_visit) > start_time(next_visit)

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

route_polyline

EncodedPolyline

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

breaks[]

Break

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

metrics

AggregatedMetrics

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

vehicle_fullness

VehicleFullness

שדה VehicleFullness לחישוב מידת הקרבה של המדדים המוגבלים למגבלות הרכב המתאימות. השדות שלו הם יחסים בין שדה מדד מוגבל (למשל AggregatedMetrics.travel_distance_meters) לבין מגבלת הרכב הקשורה (למשל Vehicle.route_distance_limit).

ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד.

route_costs

map<string, double>

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

route_total_cost

double

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

הפסקה

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

שדות
start_time

Timestamp

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

duration

Duration

משך ההפסקה.

EncodedPolyline

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

שדות
points

string

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

מעבר

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

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

שדות
travel_duration

Duration

משך הנסיעה במהלך המעבר הזה.

travel_distance_meters

double

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

traffic_info_unavailable

bool

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

delay_duration

Duration

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

break_duration

Duration

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

wait_duration

Duration

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

total_duration

Duration

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

  • הביקור הבא start_time (או vehicle_end_time אם זה המעבר האחרון) – start_time של המעבר הזה;
  • אם הערך של ShipmentRoute.has_traffic_infeasibilities הוא False, מתקיים גם התנאי הבא: total_duration = travel_duration + delay_duration
  • break_duration + wait_duration`.
start_time

Timestamp

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

route_polyline

EncodedPolyline

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

route_token

string

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

vehicle_loads

map<string, VehicleLoad>

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

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

VehicleLoad

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

שדות
amount

int64

כמות המטען ברכב, לפי הסוג הנתון. יחידת העומס מצוינת בדרך כלל לפי הסוג. Transition.vehicle_loads.

כניסה

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

שדות
shipment_index

int32

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

is_pickup

bool

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

visit_request_index

int32

האינדקס של VisitRequest בשדה האיסוף או המסירה של Shipment (ראו is_pickup).

start_time

Timestamp

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

load_demands

map<string, Load>

העומס הכולל של הביקור הוא הסכום של המשלוח ובקשת הביקור load_demands. הערכים שליליים אם הביקור הוא מסירה. הדרישות מדווחות לאותם סוגים כמו Transition.loads (ראו את השדה הזה).

detour

Duration

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

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

אחרת, הוא מחושב לפי start_location של הרכב ושווה ל:

start_time - vehicle_start_time - travel duration from
the vehicle's `start_location` to the visit.
shipment_label

string

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

visit_label

string

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

visit_type

VisitType

אופציונלי. מציין את סוג הביקור. ההגדרה הזו מחליפה את השדה Visit.is_pickup.

injected_solution_location_token

int32

אסימון אטום שמייצג מידע על מיקום הביקור.

יכול להיות שהשדה הזה יאוכלס בביקורים של מסלולי התוצאות אם VisitRequest.avoid_u_turns הוגדר כ-true לביקור הזה, או אם ShipmentModel.avoid_u_turns הוגדר כ-true בבקשה OptimizeToursRequest.

ניסיוני: פרטים נוספים זמינים בכתובת https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request.

VisitType

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

טיפוסים בני מנייה (enum)
VISIT_TYPE_UNSPECIFIED סוג הביקור לא צוין.
PICKUP_SHIPMENT ביקור תואם לאיסוף משלוח.
DELIVER_SHIPMENT ביקור תואם למסירת משלוח.

ShipmentTypeIncompatibility

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

שדות
types[]

string

רשימה של סוגים לא תואמים. שני משלוחים עם ערכים שונים של shipment_types מבין אלה שרשומים הם "לא תואמים".

incompatibility_mode

IncompatibilityMode

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

IncompatibilityMode

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

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

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

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

ShipmentTypeRequirement

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

שדות
required_shipment_type_alternatives[]

string

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

dependent_shipment_types[]

string

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

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

requirement_mode

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

SkippedShipment

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

שדות
index

int32

האינדקס תואם לאינדקס של המשלוח במקור ShipmentModel.

label

string

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

reasons[]

Reason

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

penalty_cost

double

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

ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד.

estimated_incompatible_vehicle_ratio

double

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

ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד.

סיבה

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

reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 1
  example_exceeded_capacity_type: "Apples"
}
reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 3
  example_exceeded_capacity_type: "Pears"
}
reasons {
  code: CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT
  example_vehicle_index: 1
}

המשלוח שדילגתם עליו לא מתאים לאף אחד מכלי הרכב. הסיבות יכולות להיות שונות לכל הרכבים, אבל לפחות רכב אחד יחרוג מהקיבולת של "תפוחים" (כולל רכב 1), לפחות רכב אחד יחרוג מהקיבולת של "אגסים" (כולל רכב 3) ולפחות רכב אחד יחרוג ממגבלת המרחק (כולל רכב 1).

שדות
code

Code

עיינו בהערות של הקוד.

example_vehicle_indices[]

int32

כמו example_vehicle_index, אבל אנחנו מספקים את רשימת כלי הרכב שזוהו. זו רשימה חלקית בלבד. השדה הזה מתמלא רק אם הערך של [fill_example_vehicle_indices_in_skipped_reasons][] הוא True.

ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד.

example_exceeded_capacity_type

string

אם קוד הסיבה הוא DEMAND_EXCEEDS_VEHICLE_CAPACITY, המסמכים חורגים מסוג קיבולת אחד.

example_vehicle_index

int32

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

קוד

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

טיפוסים בני מנייה (enum)
CODE_UNSPECIFIED אין להשתמש בזה אף פעם.
NO_VEHICLE אין רכב במודל, ולכן אי אפשר לבצע את כל המשלוחים.
DEMAND_EXCEEDS_VEHICLE_CAPACITY הביקוש למשלוח חורג מהקיבולת של הרכב בחלק מסוגי הקיבולת, ואחד מהם הוא example_exceeded_capacity_type.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT

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

שימו לב שבחישוב הזה אנחנו משתמשים במרחקים גיאודזיים.

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT

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

הערה: זמן ההגעה מחושב לפי התרחיש הטוב ביותר, כלומר מרחק גיאודזי כפול 36 מטרים לשנייה (בערך 130 קמ"ש).

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT כמו למעלה, אבל אנחנו משווים רק את זמן ההגעה המינימלי ואת travel_duration_limit של הרכב.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS הרכב לא יכול לבצע את המשלוח הזה בתרחיש הטוב ביותר (ראו CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT לחישוב הזמן) אם הוא מתחיל בשעת ההתחלה המוקדמת ביותר: הזמן הכולל יגרום לרכב לסיים אחרי שעת הסיום המאוחרת ביותר שלו.
VEHICLE_NOT_ALLOWED השדה allowed_vehicle_indices של המשלוח לא ריק, והרכב הזה לא שייך אליו.
VEHICLE_IGNORED

השדה ignore של הרכב מוגדר כ-true.

ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד.

SHIPMENT_IGNORED

השדה ignore של המשלוח מוגדר כ-true.

ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד.

SKIPPED_IN_INJECTED_SOLUTION_CONSTRAINT

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

ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד.

VEHICLE_ROUTE_IS_FULLY_SEQUENCE_CONSTRAINED

ההקלה במסלול הרכב שצוינה ב-injected_solution_constraint לא מאפשרת להוסיף אף ביקור.

ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד.

ZERO_PENALTY_COST

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

ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד.

TimeWindow

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

גבולות קשיחים של חלון הזמן, start_time ו-end_time, אוכפים את השעה המוקדמת ביותר והמאוחרת ביותר של האירוע, כך ש-start_time <= event_time <= end_time. הגבול התחתון של חלון הזמן הגמיש, soft_start_time, מבטא העדפה שהאירוע יתרחש ב-soft_start_time או אחריו, על ידי גביית עלות פרופורציונלית למשך הזמן שבו האירוע מתרחש לפני soft_start_time. הגבול העליון של חלון הזמן הגמיש, soft_end_time, מבטא העדפה שהאירוע יתרחש ב-soft_end_time או לפני כן, על ידי צבירת עלות פרופורציונלית למשך הזמן שחלף אחרי soft_end_time עד שהאירוע התרחש. ‫start_time, ‏ end_time, ‏ soft_start_time ו-soft_end_time צריכים להיות בטווח של מגבלות הזמן הגלובליות (ראו ShipmentModel.global_start_time ו-ShipmentModel.global_end_time) ולעמוד בתנאים הבאים:

  0 <= `start_time` <= `end_time` and
  0 <= `start_time` <= `soft_start_time` and
  0 <= `soft_end_time` <= `end_time`.
שדות
start_time

Timestamp

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

end_time

Timestamp

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

soft_start_time

Timestamp

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

soft_end_time

Timestamp

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

cost_per_hour_before_soft_start_time

double

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

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

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

cost_per_hour_after_soft_end_time

double

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

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

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

TransitionAttributes

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

שדות
src_tag

string

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

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

excluded_src_tag

string

src_tag. אחד מהשדות src_tag ו-excluded_src_tag חייב להיות לא ריק.

dst_tag

string

ביקור ביעד או סיום מסלול של רכב תואמים אם ורק אם VisitRequest.tags או Vehicle.end_tags מכילים את dst_tag או לא מכילים את excluded_dst_tag (בהתאם לשאלה איזה משני השדות האלה לא ריק).

excluded_dst_tag

string

dst_tag. אחד מהשדות dst_tag ו-excluded_dst_tag חייב להיות לא ריק.

cost

double

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

cost_per_kilometer

double

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

distance_limit

DistanceLimit

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

נכון ליוני 2021, יש תמיכה רק במגבלות גמישות.

delay

Duration

מציין את העיכוב שנגרם כשמבצעים את המעבר הזה.

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

אורי

מזהה משאבים אחיד (URI) שמפנה למשאב ש-Route Optimization API יכול לקרוא ולכתוב.

שדות
uri

string

ה-URI של המשאב. יכול להיות שהמשאב עדיין לא קיים.

התוכן של המשאב מקודד כ-JSON או כ-textproto. יש תמיכה רק במשאבים של Google Cloud Storage. אם המשאב מקודד כ-JSON, שם המשאב חייב להסתיים ב-.json. אם המשאב מקודד כ-textproto, שם המשאב חייב להסתיים בסיומת .txtpb. לדוגמה, URI של Google Cloud Storage לקובץ בקידוד JSON יכול להיראות כך: gs://bucket/path/input/object.json.

כלי רכב

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

שדות
display_name

string

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

travel_mode

TravelMode

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

route_modifiers

RouteModifiers

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

start_location

LatLng

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

start_waypoint

Waypoint

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

end_location

LatLng

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

end_waypoint

Waypoint

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

start_tags[]

string

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

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

end_tags[]

string

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

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

start_time_windows[]

TimeWindow

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

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

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

end_time_windows[]

TimeWindow

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

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

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

unloading_policy

UnloadingPolicy

מדיניות הפריקה שנאכפת ברכב.

load_limits

map<string, LoadLimit>

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

cost_per_hour

double

עלויות הרכב: כל העלויות מצטברות וצריכות להיות באותה יחידה כמו Shipment.penalty_cost.

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

cost_per_traveled_hour

double

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

cost_per_kilometer

double

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

fixed_cost

double

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

used_if_route_is_empty

bool

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

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

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

route_duration_limit

DurationLimit

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

travel_duration_limit

DurationLimit

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

route_distance_limit

DistanceLimit

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

extra_visit_duration_for_visit_type

map<string, Duration>

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

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

break_rule

BreakRule

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

label

string

מציין תווית לרכב הזה. התווית הזו מדווחת בתגובה בתור vehicle_label של ShipmentRoute התואם.

ignore

bool

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

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

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

travel_duration_multiple

double

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

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

מידע נוסף מופיע בקטע extra_visit_duration_for_visit_type בהמשך.

DurationLimit

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

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

שדות
max_duration

Duration

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

soft_max_duration

Duration

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

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

quadratic_soft_max_duration

Duration

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

אם השדה quadratic_soft_max_duration מוגדר, התנאים הבאים צריכים להתקיים:

  • הערך לא יכול להיות שלילי.
  • חובה להגדיר את max_duration.
  • הערך של quadratic_soft_max_duration חייב להיות קטן מהערך של max_duration.
  • ההפרש לא יכול להיות יותר מיום אחד: max_duration - quadratic_soft_max_duration <= 86400 seconds
cost_per_hour_after_soft_max

double

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

  cost_per_hour_after_soft_max * (duration - soft_max_duration)

העלות לא יכולה להיות שלילית.

cost_per_square_hour_after_quadratic_soft_max

double

העלות לשעה בריבוע שנגבית אם חורגים מהסף של quadratic_soft_max_duration.

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

  cost_per_square_hour_after_quadratic_soft_max *
  (duration - quadratic_soft_max_duration)^2

העלות לא יכולה להיות שלילית.

LoadLimit

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

שדות
soft_max_load

int64

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

cost_per_unit_above_soft_max

double

אם העומס חורג מ-soft_max_load לאורך המסלול של הרכב הזה, חל הקנס הבא (רק פעם אחת לכל רכב): (עומס - soft_max_load) * cost_per_unit_above_soft_max. כל העלויות מצטברות וצריכות להיות באותה יחידה כמו Shipment.penalty_cost. אפשר להגדיר מגבלות גמישות רק בסוגים שחלים רק על איסופים או רק על משלוחים בכל המודל.

start_load_interval

Interval

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

end_load_interval

Interval

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

max_load

int64

העומס המקסימלי המותר.

cost_per_kilometer

LoadCost

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

ניסיוני: פרטים נוספים זמינים בכתובת https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.

cost_per_traveled_hour

LoadCost

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

ניסיוני: פרטים נוספים זמינים בכתובת https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.

מרווח

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

שדות
min

int64

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

max

int64

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

LoadCost

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

  • min(load, load_threshold) * cost_per_unit_below_threshold
  • max(0, load - load_threshold) * cost_per_unit_above_threshold

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

load_limit {
  key: "weight"
  value {
    cost_per_kilometer {
      load_threshold: 15
      cost_per_unit_below_threshold: 2.0
      cost_per_unit_above_threshold: 10.0
    }
  }
}

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

transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 20 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }

אז העלות של LoadCost היא (cost_below * load_below * kilometers + cost_above * load_above * kms)

  • מעבר 0: 0.0
  • מעבר 1: ‎2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • מעבר 2: ‎2.0 * 15 * 1.0 + 10.0 * (20 - 15) * 1.0 = 80.0
  • מעבר 3: ‎2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • מעבר 4: 0.0

לכן, הערך של LoadCost במסלול הוא 120.0.

עם זאת, אם המסלול הוא התחלה,איסוף,מסירה,איסוף,מסירה,סיום עם מעברים:

transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }

אז העלות שנוצרה על ידי LoadCost היא

  • מעבר 0: 0.0
  • מעבר 1: ‎2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • מעבר 2: 0.0
  • מעבר 3: ‎2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • מעבר 4: 0.0

כאן הערך של LoadCost במסלול הוא 40.0.

LoadCost מייקרת פתרונות עם מעברים עמוסים.

ניסיוני: פרטים נוספים זמינים בכתובת https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.

שדות
load_threshold

int64

כמות העומס שמעליה העלות של העברת יחידת עומס משתנה מ-cost_per_unit_below_threshold ל-cost_per_unit_above_threshold. הערך חייב להיות גדול מ-0 או שווה לו.

cost_per_unit_below_threshold

double

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

cost_per_unit_above_threshold

double

עלות ההעברה של יחידת עומס, לכל יחידה מעל הסף. במקרה המיוחד שבו הסף = 0, זו עלות קבועה ליחידה. הערך חייב להיות סופי וגדול מ-0 או שווה לו.

TravelMode

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

אלה צריכים להיות קבוצת משנה של אמצעי התחבורה של Google Maps Platform Routes API, ראו: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteTravelMode

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

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

UnloadingPolicy

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

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

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

VehicleFullness

VehicleFullness הוא מדד שמחשב את מידת העומס של הרכב. כל שדה VehicleFullness הוא בין 0 ל-1, ומחושב כיחס בין שדה מדד מוגבל (למשל AggregatedMetrics.travel_distance_meters) לבין מגבלת הרכב הקשורה (למשל Vehicle.route_distance_limit), אם היא קיימת. אחרת, יחס התפוסה לא יוגדר. אם המגבלה היא 0, השדה מוגדר ל-1. הערה: כשמסלול כפוף למגבלות תנועה, חלק מהיחסים הגולמיים של התפוסה עשויים להיות גבוהים מ-1.0, למשל הרכב עשוי לחרוג ממגבלת המרחק שלו. במקרים כאלה, אנחנו מגבילים את ערכי התפוסה ל-1.0.

שדות
max_fullness

double

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

distance

double

היחס בין AggregatedMetrics.travel_distance_meters ל-Vehicle.route_distance_limit. אם המדיניות Vehicle.route_distance_limit לא מוגדרת, השדה הזה לא יוגדר.

travel_duration

double

היחס בין [AggregatedMetrics.travel_duration_seconds][] לבין Vehicle.travel_duration_limit. אם Vehicle.travel_duration_limit לא מוגדר, השדה הזה לא יוגדר.

active_duration

double

היחס בין [AggregatedMetrics.total_duration_seconds][] לבין Vehicle.route_duration_limit. אם המדיניות Vehicle.route_duration_limit לא מוגדרת, השדה הזה לא יוגדר.

max_load

double

היחס המקסימלי בין כל הסוגים של [AggregatedMetrics.max_load][] לבין Vehicle.load_limits המתאים. אם כל השדות של Vehicle.load_limits לא מוגדרים, השדה הזה לא יוגדר.

active_span

double

היחס (vehicle_end_time - vehicle_start_time) / (latest_vehicle_end_time - earliest_vehicle_start_time) של רכב נתון. אם המכנה לא קיים, הפונקציה משתמשת במקום זאת ב-(ShipmentModel.global_end_time - ShipmentModel.global_start_time).

נקודת ציון

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

שדות
side_of_road

bool

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

vehicle_stopover

bool

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

ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד.

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

Location

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

place_id

string

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

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