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

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

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

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

המשתמש יכול לבצע שאילתת polling אל 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.

המטרה היא להקצות ShipmentRoutes ל-Vehicles באופן שממזער את העלות הכוללת, כאשר העלות מורכבת מרכיבים רבים שמוגדרים ב-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.

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

היקפי הרשאה

נדרש היקף ההרשאות הבא של 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 הוא OptimizeToursLongRunningMetadata. אם הפעולה תצליח, סוג השדה response יהיה OptimizeToursUriResponse.

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

היקפי הרשאה

נדרש היקף ההרשאות הבא של 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 יחולו על כל הרכבים שלא צוינו בrelaxations אחרים.constraint_relaxations יכולה להיות ברירת מחדל אחת לכל היותר, כלומר, מותר להשאיר ריק שדה אחד לכל היותר של הקלה במגבלות vehicle_indices. אי אפשר לציין אינדקס של רכב יותר מפעם אחת, גם אם הוא מופיע בכמה constraint_relaxations.

מיפוי של אינדקס רכב מתבצע כמו ShipmentRoute.vehicle_index, אם interpret_injected_solutions_using_labels הוא true (ראו הערה fields).

הירגעות

אם relaxations ריק, שעת ההתחלה והרצף של כל הביקורים ב-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/11, המערכת מאכלסת רק את הקווים המקוטעים של מסלולים לא ריקים, ונדרש שהערך של 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, כשמגדירים את השדה ShipmentRoute.has_traffic_infeasibilities וכשמחשבים את השדה OptimizeToursResponse.total_cost.vehicle_end_time

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/01.

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

תשובה שמוחזרת על ידי השיטה 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) כי השגיאה החדשה הסתירה את השגיאה הישנה. לדוגמה, אפשר לעיין בקטע 'שגיאות מרובות'.

display_name

string

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

fields[]

FieldReference

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

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 ב-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

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

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/10, יש תמיכה בדרכים חלופיות רק אם משך הנסיעה לא תלוי ברכב.

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/10, יש תמיכה בדרכים חלופיות רק אם משך הנסיעה לא תלוי ברכב.

טעינה

כשמבצעים ביקור, יכול להיות שסכום מוגדר מראש יתווסף למטען של הרכב אם מדובר באיסוף, או יופחת אם מדובר במשלוח. הסכום הזה מוגדר בהודעה. 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 ו-locB.
  • רכב אחד שמתחיל את המסלול שלו במיקום א' ומסיים אותו במיקום א'.
  • בקשת ביקור אחת לאיסוף במיקום ב'.
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.
  • רכב אחד מתחיל את המסלול במיקום א' ומסיים אותו במיקום ב', באמצעות מטריצה 'מהירה'.
  • רכב אחד שמתחיל את המסלול במיקום ב' ומסיים אותו במיקום ב', באמצעות מטריצה 'איטית'.
  • רכב אחד מתחיל את המסלול במיקום locB ומסיים אותו במיקום locB, באמצעות מטריצה 'מהירה'.
  • בקשת ביקור לאיסוף אחת במיקום locC.
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_type לא תואמים (ראו 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

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

second_is_delivery

bool

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

offset_duration

Duration

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

first_index

int32

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

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

לבסוף, כך אפשר לסדר את המילים TRAVEL, ‏ BREAKS, ‏ DELAY ו-WAIT במהלך מעבר.

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

דוגמה (מורכבת):

                               TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
  ||     |       |           |       |           |         |         ||
  ||  T  |   B   |     T     |       |     B     |         |    D    ||
  ||  r  |   r   |     r     |   W   |     r     |    W    |    e    ||
  ||  a  |   e   |     a     |   a   |     e     |    a    |    l    ||
  ||  v  |   a   |     v     |   i   |     a     |    i    |    a    ||
  ||  e  |   k   |     e     |   t   |     k     |    t    |    y    ||
  ||  l  |       |     l     |       |           |         |         ||
  ||     |       |           |       |           |         |         ||
--++-----------------------------------------------------------------++-->
שדות
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/01.

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

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.

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 יהיו יותר מ-1 רכיבים. במשלוח שדילגתם עליו לא יכולות להיות סיבות כפולות, כלומר, מצב שבו כל השדות זהים חוץ מ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 יחולו על אותו מעבר: במקרה כזה, כל העלויות הנוספות מצטברות והאילוץ או המגבלה המחמירים ביותר חלים (בהתאם לסמנטיקה הטבעית של 'וגם').

שדות
src_tag

string

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

ביקור במקור או התנעה של כלי רכב נחשבים להתאמה אם השדה 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

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

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

אורי

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

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

אלה צריכים להיות חלק ממצבי הנסיעה ב-Routes API של הפלטפורמה של מפות Google. מידע נוסף זמין בכתובת: 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).

נקודת ציון

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

שדות
side_of_road

bool

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

vehicle_stopover

bool

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

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

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

Location

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

place_id

string

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

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