Package google.maps.routeoptimization.v1

אינדקס

RouteOptimization

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

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

  • google.protobuf.Timestamp
    • השעות הן לפי שעון יוניקס (Unix): שניות מ-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].
    • הערך של יחידות הננו צריך להיות לא מוגדר או מוגדר ל-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 – קבוצת מסלולים שכלי רכב מפחיתים מהעלות הכוללת.

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

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

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

מודל ShipmentModel מורכב בעיקר מאובייקטים של Shipment שצריך לבצע ו-Vehicles שאפשר להשתמש בהם כדי להעביר את אובייקטי 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.

AggregatedMetrics

מדדים נצברים של ShipmentRoute (תגובה ל-OptimizeToursResponse על כל רכיבי Transition ו/או Visit (resres, מעל כל 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 (resp. ShipmentRoute.metrics.max_loads.

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:00 דוגמה:

  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

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

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

שדות
max_meters

int64

מגבלה קשיחה שמגבילה את המרחק למקסימום_מטרים. המגבלה חייבת להיות לא שלילית.

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 מציין את הכותרת לצפון, וכן הלאה.

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

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

החל מ-11/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 (resp. 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, הקווים הפוליטיים יאוכלסו בתשובה ShipmentRoutes.

populate_transition_polylines

bool

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

allow_large_deadline_despite_interruption_risk

bool

אם היא מוגדרת, ייתכן שתאריך היעד של הבקשה יהיה עד 60 דקות (מידע נוסף זמין בכתובת https://grpc.io/blog/deadlines). אחרת, המועד האחרון המקסימלי הוא 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), אלא אם Solution_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 נשאר ריק.

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

OptimizeToursResponse

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

שדות
routes[]

ShipmentRoute

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

request_label

string

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

skipped_shipments[]

SkippedShipment

רשימה של כל המשלוחים שנדחו.

validation_errors[]

OptimizeToursValidationError

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

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 (עלות). הערכים הם העלות הכוללת שנוצרה בשדה העלות התואם, שמצטברת בכל הפתרון. במילים אחרות, העלויות["model.shipments.pickups.cost"] הן הסכום של כל עלויות האיסוף במסגרת הפתרון. כל העלויות שמוגדרות במודל מדווחות כאן בפירוט, למעט עלויות שקשורות למאפייני מעבר, שמדווחות רק באופן מצטבר נכון ל-2022.

total_cost

double

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

OptimizeToursValidationError

מיועד לתיאור שגיאה או אזהרה שהתרחשה במהלך האימות של OptimizeToursRequest.

שדות
code

int32

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

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

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

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

קובץ עזר: רשימה של כל הצמדים (קוד, שם):

  • UNSPECIFIED = 0;
  • INVALIDATION_TIMEOUT_ERROR = 10; לא ניתן היה להשלים את האימות במסגרת המועד האחרון.
  • REQUEST_OPTIONS_ERROR = 12;

    • REQUEST_OPTIONS_INVALID_SOLVING_מצב = 1201;
    • REQUEST_OPTIONS_INVALID_MAX_INVALIDATION_ERRORS = 1203;
    • REQUEST_OPTIONS_INVALID_פונקציותDESIC_METERS_PER_SECOND = 1204;
    • REQUEST_OPTIONS_GEODESIC_METERS_PER_SECOND_TOO_SMALL = 1205;
    • REQUEST_OPTIONS_MISSING_geoDESIC_METERS_PER_SECOND = 1206;
    • REQUEST_OPTIONS_POPULATE_PATHFINDER_TRIPS_AND_ לחפשDESIC_DISTANCE = 1207;
    • REQUEST_OPTIONS_COST_MODEL_OPTIONS_AND_טורDESIC_DISTANCE = 1208;
    • REQUEST_OPTIONS_TRAVEL_מצב_INCOMPATIBLE_WITH_TRAFFIC = 1211;
    • REQUEST_OPTIONS_MULTIPLE_TRAFFIC_FLAVORS = 1212;
    • REQUEST_OPTIONS_INVALID_TRAFFIC_FLAVOR = 1213;
    • REQUEST_OPTIONS_TRAFFIC_enabled_WITHOUT_GLOBAL_START_TIME = 1214;
    • REQUEST_OPTIONS_TRAFFIC_ENABLED_WITH_PRECEDENCES = 1215;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_מצב_INVALID = 1216;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_ לגשת_WITHOUT_TRAFFIC = 1217;
  • INJECTED_SOLUTION_ERROR = 20;
    • INJECTED_SOLUTION_MISSING_LABEL = 2000;
    • INJECTED_SOLUTION_DUPLICATE_LABEL = 2001;
    • INJECTED_SOLUTION_AMBIGUOUS_INDEX = 2002;
    • INJECTED_SOLUTION_INFEASIBLE_TRUE_GETTING_TRAVEL_TIMES = 2003;
    • INJECTED_SOLUTION_TRANSITION_INCONSISTENT_WITH_TRUE_TRAVEL = 2004;
    • INJECTED_SOLUTION_CONCURRENT_SOLUTION_TYPES = 2005;
    • INJECTED_SOLUTION_MORE_THAN_ONE_PER_TYPE = 2006;
    • INJECTED_SOLUTION_REFRESH_WITHOUT_POPULATE = 2008;
    • INJECTED_SOLUTION_CONSTRAINED_ROUTE_PORTION_INFEASIBLE = 2010;
  • SHIPMENT_MODEL_ERROR = 22;
    • SHIPMENT_MODEL_TOO_LARGE = 2200;
    • SHIPMENT_MODEL_TOO_MANY_CAPACITY_TYPES = 2201;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_NEGATIVE_OR_NAN = 2202;
    • SHIPMENT_MODEL_GLOBAL_END_TIME_TOO_LARGE_OR_NAN = 2203;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_METRIC_GLOBAL_END_TIME = 2204;
    • SHIPMENT_MODEL_GLOBAL_DURATION_TOO_ נמוכה = 2205;
    • SHIPMENT_MODEL_MAX_ACTIVE_VEHICLES_NOT_POSITIVE = 2206;
    • SHIPMENT_MODEL_DURATION_MATRIX_TOO_LARGE = 2207;
  • INDEX_ERROR = 24;
  • TAG_ERROR = 26;
  • TIME_WINDOW_ERROR = 28;
    • TIME_WINDOW_INVALID_START_TIME = 2800;
    • TIME_WINDOW_INVALID_END_TIME = 2801;
    • TIME_WINDOW_INVALID_SOFT_START_TIME = 2802;
    • TIME_WINDOW_INVALID_SOFT_END_TIME = 2803;
    • TIME_WINDOW_OUTSIDE_GLOBAL_TIME_WINDOW = 2804;
    • TIME_WINDOW_START_TIME_ אתר בסופו של דבר_END_TIME = 2805;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_BEFORE_SOFT_START_TIME = 2806;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_׳ זהות שירותי ׳1_SOFT_END_TIME׳ = 2807;
    • TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_WITHOUT_SOFT_START_TIME = 2808;
    • TIME_WINDOW_COST_ השם אחרי_SOFT_END_TIME_WITHOUT_SOFT_END_TIME = 2809;
    • TIME_WINDOW_SOFT_START_TIME_WITHOUT_COST_BEFORE_SOFT_START_TIME = 2810;
    • TIME_WINDOW_SOFT_END_TIME_WITHOUT_COST_ אתר לפני_SOFT_END_TIME = 2811;
    • TIME_WINDOW_OVERLAPPING_ADJACENT_OR_EARLIER_THAN_PREVIOUS = 2812;
    • TIME_WINDOW_START_TIME_ אתר לפני_SOFT_START_TIME = 2813;
    • TIME_WINDOW_SOFT_START_TIME_OUTSIDE_GLOBAL_TIME_WINDOW = 2819;
    • TIME_WINDOW_SOFT_END_TIME_OUTSIDE_GLOBAL_TIME_WINDOW = 2820;
    • TIME_WINDOW_SOFT_END_TIME_׳׳ הרבה׳ = 2816 = 2816;
    • TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_SET_AND_MULTIPLE_WINDOWS = 2817;
    • TIME_WINDOW_COST_ הרבה שנכללים ב-SOFT_END_TIME_SET_AND_MULTIPLE_WINDOWS = 2818;
    • TRANSITION_ATTRIBUTES_ERROR = 30;
    • TRANSITION_ATTRIBUTES_INVALID_COST = 3000;
    • TRANSITION_ATTRIBUTES_INVALID_COST_PER_KILOMETER = 3001;
    • TRANSITION_ATTRIBUTES_DUPLICATE_TAG_PAIR = 3002;
    • TRANSITION_ATTRIBUTES_DISTANCE_LIMIT_MAX_METERS_UNSUPPORTED = 3003;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_SOURCE_TAGS = 3004;
    • TRANSITION_ATTRIBUTES_CONFLICTING_SOURCE_TAGS_FIELDS = 3005;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_DESTINATION_TAGS = 3006;
    • TRANSITION_ATTRIBUTES_CONFLICTING_DESTINATION_TAGS_FIELDS = 3007;
    • TRANSITION_ATTRIBUTES_DELAY_DURATION_NEGATIVE_OR_NAN = 3008;
    • TRANSITION_ATTRIBUTES_DELAY_DURATION_EXCEEDS_GLOBAL_DURATION = 3009;
  • AMOUNT_ERROR = 31;
    • AMOUNT_NEGATIVE_VALUE = 3100;
  • LOAD_LIMIT_ERROR = 33;
    • LOAD_LIMIT_INVALID_COST_ABOVE_SOFT_MAX = 3303;
    • LOAD_LIMIT_SOFT_MAX_WITHOUT_COST_ABOVE_SOFT_MAX = 3304;
    • LOAD_LIMIT_COST_ABOVE_SOFT_MAX_WITHOUT_SOFT_MAX = 3305;
    • LOAD_LIMIT_NEGATIVE_SOFT_MAX = 3306;
    • LOAD_LIMIT_MIXED_DEMAND_TYPE = 3307;
    • LOAD_LIMIT_MAX_LOAD_NEGATIVE_VALUE = 3308;
    • LOAD_LIMIT_SOFT_MAX_ABOVE_MAX = 3309;
  • INTERVAL_ERROR = 34;
    • INTERVAL_MIN_EXCEEDS_MAX = 3401;
    • INTERVAL_NEGATIVE_MIN = 3402;
    • INTERVAL_NEGATIVE_MAX = 3403;
    • INTERVAL_MIN_EXCEEDS_CAPALOCATION = 3404;
    • INTERVAL_MAX_EXCEEDS_CAPAcity = 3405;
  • DISTANCE_LIMIT_ERROR = 36;
    • DISTANCE_LIMIT_INVALID_COST_ אתר; SOFT_MAX = 3601;
    • DISTANCE_LIMIT_SOFT_MAX_WITHOUT_COST_AFTER_SOFT_MAX = 3602;
    • DISTANCE_LIMIT_COST_ השם אחרי_SOFT_MAX_WITHOUT_SOFT_MAX = 3603;
    • DISTANCE_LIMIT_NEGATIVE_MAX = 3604;
    • DISTANCE_LIMIT_NEGATIVE_SOFT_MAX = 3605;
    • DISTANCE_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3606;
  • DURATION_LIMIT_ERROR = 38;
    • DURATION_LIMIT_MAX_DURATION_NEGATIVE_OR_NAN = 3800;
    • DURATION_LIMIT_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3801;
    • DURATION_LIMIT_INVALID_COST_PER_HOUR_ הצופים בחינם ב-SOFT_MAX = 3802;
    • DURATION_LIMIT_SOFT_MAX_WITHOUT_COST_ אתר בסופו של דבר_SOFT_MAX = 3803;
    • DURATION_LIMIT_COST_ בהגדרת {SOFT_MAX_WITHOUT_SOFT_MAX = 3804;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3805;
    • DURATION_LIMIT_INVALID_COST_ ללאוג_QUADRATIC_SOFT_MAX = 3806;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_COST_PER_SQUARE_HOUR = 3807;
    • DURATION_LIMIT_COST_PER_SQUARE_HOUR_WITHOUT_QUADRATIC_SOFT_MAX = 3808;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_MAX = 3809;
    • DURATION_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3810;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_LARGER_THAN_MAX = 3811;
    • DURATION_LIMIT_DIFF_BETWEEN_MAX_AND_QUADRATIC_SOFT_MAX_TOO_LARGE = 3812;
    • DURATION_LIMIT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3813;
    • DURATION_LIMIT_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3814;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3815;
  • SHIPMENT_ERROR = 40;
    • SHIPMENT_PD_LIMIT_WITHOUT_PICKUP_AND_DELIVERY = 4014;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_NEGATIVE_OR_NAN = 4000;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4001;
    • SHIPMENT_PD_RELATIVE_DETOUR_LIMIT_INVALID = 4015;
    • SHIPMENT_PD_DETOUR_LIMIT_AND_EXTRA_VISIT_DURATION = 4016;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_NEGATIVE_OR_NAN = 4002;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4003;
    • SHIPMENT_EMPTY_SHIPMENT_TYPE = 4004;
    • SHIPMENT_NO_PICKUP_NO_DELIVERY = 4005;
    • SHIPMENT_INVALID_PENALTY_COST = 4006;
    • SHIPMENT_ALLOWED_VEHICLE_INDEX_OUT_OF_BOUNDS = 4007;
    • SHIPMENT_DUPLICATE_ALLOWED_VEHICLE_INDEX = 4008;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITHOUT_INDEX = 4009;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITH_INDEX = 4010;
    • SHIPMENT_INVALID_COST_FOR_VEHICLE = 4011;
    • SHIPMENT_COST_FOR_VEHICLE_INDEX_OUT_OF_BOUNDS = 4012;
    • SHIPMENT_DUPLICATE_COST_FOR_VEHICLE_INDEX = 4013;
  • VEHICLE_ERROR = 42;
    • VEHICLE_EMPTY_REQUIRED_OPERATOR_TYPE = 4200;
    • VEHICLE_DUPLICATE_REQUIRED_OPERATOR_TYPE = 4201;
    • VEHICLE_NO_OPERATOR_WITH_REQUIRED_OPERATOR_TYPE = 4202;
    • VEHICLE_EMPTY_START_TAG = 4203;
    • VEHICLE_DUPLICATE_START_TAG = 4204;
    • VEHICLE_EMPTY_END_TAG = 4205;
    • VEHICLE_DUPLICATE_END_TAG = 4206;
    • VEHICLE_PORT_VISIT_DURATION_NEGATIVE_OR_NAN = 4207;
    • VEHICLE_PORT_VISIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4208;
    • VEHICLE_EXTRA_VISIT_DURATION_EMPTY_KEY = 4209;
    • VEHICLE_FIRST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4210;
    • VEHICLE_FIRST_SHIPMENT_IGNORED = 4211;
    • VEHICLE_FIRST_SHIPMENT_NOT_BOUND = 4212;
    • VEHICLE_LAST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4213;
    • VEHICLE_LAST_SHIPMENT_IGNORED = 4214;
    • VEHICLE_LAST_SHIPMENT_NOT_BOUND = 4215;
    • VEHICLE_IGNORED_WITH_USED_IF_ROUTE_IS_EMPTY = 4216;
    • VEHICLE_INVALID_COST_PER_KILOMETER = 4217;
    • VEHICLE_INVALID_COST_PER_HOUR = 4218;
    • VEHICLE_INVALID_COST_PER_TRAVELED_HOUR = 4219;
    • VEHICLE_INVALID_FIXED_COST = 4220;
    • VEHICLE_INVALID_TRAVEL_DURATION_MULTIPLE = 4221;
    • VEHICLE_TRAVEL_DURATION_MULTIPLE_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4223;
    • VEHICLE_MATRIX_INDEX_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4224;
    • VEHICLE_מינימלי_DURATION_ בהגדרת אינסוף = THAN_DURATION_LIMIT = 4222
  • VISIT_REQUEST_ERROR = 44;
    • VISIT_REQUEST_EMPTY_TAG = 4400;
    • VISIT_REQUEST_DUPLICATE_TAG = 4401;
    • VISIT_REQUEST_DURATION_NEGATIVE_OR_NAN = 4404;
    • VISIT_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4405;
  • PRECEDENCE_ERROR = 46;
    • PRECEDENCE_PARAM_MISSING_FIRST_INDEX = 4600;
    • PRECEDENCE_PARAM_MISSING_SECOND_INDEX = 4601;
    • PRECEDENCE_TERMS_FIRST_INDEX_OUT_OF_BOUNDS = 4602;
    • PRECEDENCE_PARAM_SECOND_INDEX_OUT_OF_BOUNDS = 4603;
    • PRECEDENCE_PARAM_DUPLICATE_INDEX = 4604;
    • PRECEDENCE_PARAM_INEXISTENT_FIRST_VISIT_REQUEST = 4605;
    • PRECEDENCE_TERMS_INEXISTENT_SECOND_VISIT_REQUEST = 4606;
  • break_ERROR = 48;
    • ח B=4800 = כלל_EMPTY
    • break_REQUEST_UNSPECIFIED_DURATION = 4801;
    • break_REQUEST_UNSPECIFIED_EARLIEST_START_TIME = 4802;
    • break_REQUEST_UNSPECIFIED_LATEST_START_TIME = 4803;
    • break_REQUEST_DURATION_NEGATIVE_OR_NAN = 4804; = 4804;
    • BREAK_REQUEST_LATEST_START_TIME_BEFORE_EARLIEST_START_TIME = 4805;
    • BREAK_REQUEST_EARLIEST_START_TIME_BEFORE_GLOBAL_START_TIME = 4806;
    • break_REQUEST_LATEST_END_TIME_ אתר לפני_GLOBAL_END_TIME = 4807;
    • /iw_REQUEST_NON_SCHEDULABLE = 4808
    • break_ro_MAX_INTER_BR_DURATION_NEGATIVE_OR_NAN = 4809;
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_NEGATIVE_OR_NAN = 4810;
    • break_value_MIN_break_DURATION_EXCEEDS_GLOBAL_DURATION = 4811;
    • break_value_MAX_INTER_break_DURATION_EXCEEDS_GLOBAL_DURATION = 4812;
    • BREAK_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4813;
    • /cookie = 4814 = {0/} cookie cookie 4814
    • break_value_MISSING_MIN_break_DURATION = 4815;
  • SHIPMENT_TYPE_INCOMPATIBILITY_ERROR = 50;
    • SHIPMENT_TYPE_INCOMPATIBILITY_EMPTY_TYPE = 5001;
    • SHIPMENT_TYPE_INCOMPATIBILITY_LESS_THAN_TWO_TYPES = 5002;
    • SHIPMENT_TYPE_INCOMPATIBILITY_DUPLICATE_TYPE = 5003;
    • SHIPMENT_TYPE_INCOMPATIBILITY_INVALID_INCOMPATIBILITY_מצב = 5004;
    • SHIPMENT_TYPE_INCOMPATIBILITY_TOO_MANY_INCOMPATIBILITIES = 5005;
  • SHIPMENT_TYPE_REQUIREMENT_ERROR = 52;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE = 52001;
    • SHIPMENT_TYPE_REQUIREMENT_NO_DEPENDENT_TYPE = 52002;
    • SHIPMENT_TYPE_REQUIREMENT_INVALID_REQUIREMENT_מצב = 52003;
    • SHIPMENT_TYPE_REQUIREMENT_TOO_MANY_REQUIREMENTS = 52004;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_REQUIRED_TYPE = 52005;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_REQUIRED_TYPE = 52006;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE_FOUND = 52007;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_DEPENDENT_TYPE = 52008;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_DEPENDENT_TYPE = 52009;
    • SHIPMENT_TYPE_REQUIREMENT_SELF_DEPENDENT_TYPE = 52010;
    • SHIPMENT_TYPE_REQUIREMENT_GRAPH_HAS_CYCLES = 52011;
  • VEHICLE_OPERATOR_ERROR = 54;
    • VEHICLE_OPERATOR_EMPTY_TYPE = 5400;
    • VEHICLE_OPERATOR_MULTIPLE_START_TIME_WINDOWS = 5401;
    • VEHICLE_OPERATOR_SOFT_START_TIME_WINDOW = 5402;
    • VEHICLE_OPERATOR_MULTIPLE_END_TIME_WINDOWS = 5403;
    • VEHICLE_OPERATOR_SOFT_END_TIME_WINDOW = 5404;
  • DURATION_SECONDS_MATRIX_ERROR = 56;
    • DURATION_SECONDS_MATRIX_DURATION_NEGATIVE_OR_NAN = 5600;
    • DURATION_SECONDS_MATRIX_DURATION_EXCEEDS_GLOBAL_DURATION = 5601;
  • אזהרה = 9;
    • אזהרה_INJECTED_FIRST_SOLUTION = 90;
      • WARNING_INJECTED_FIRST_SOLUTION_INFEASIBLE_SHIPMENTS_REMOVED = 9000;
      • WARNING_INJECTED_FIRST_SOLUTION_INFEASIBLE_TRUE_GETTING_TRAVEL_TIMES = 9001;
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

מחרוזת לתיאור השגיאה, שאנשים יכולים לקרוא. יש מיפוי אחד-לאחד בין 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.route Optimize.v1.RouteOptimizationService.BatchOptimizeTours].

שדות
data_format

DataFormat

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

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

GcsDestination

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

RouteModifiers

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

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

  • אותו מספר רכיבים כמו 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

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

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

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

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

ShipmentModel

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

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

Shipment

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

vehicles[]

Vehicle

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

global_start_time

Timestamp

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

טווח הזמן של המודל חייב להיות קצר משנה. כלומר, הטווח של global_end_time והglobal_start_time חייב להיות בטווח של 31536,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.
  • כלי רכב אחד מתחיל את המסלול במקום אחד ומסתיים במיקום הזה.
  • בקשת ביקור אחת לאיסוף במיקום 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.
  • רכב אחד מתחיל את המסלול ב-locA ומסתיים ב-locB באמצעות המטריצה 'fast'.
  • רכב אחד שמתחיל את המסלול ב-locB ומסתיים ב-locB, באמצעות המטריצה 'איטי'.
  • רכב אחד מתחיל את המסלול ב-locB ומסתיים ב-locB באמצעות המטריצה 'fast'.
  • בקשת ביקור אחת לאיסוף באתר 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

קבוצות של סוגי משלוח לא תואמים (מידע נוסף זמין ב-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.

PrecedenceRule

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

כמה קדימות יכולות להתייחס לאותם אירועים (או אירועים קשורים). למשל: "איסוף ב' מתבצע אחרי המסירה של" ו'איסוף 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

לתשומת ליבכם: אנחנו עושים הבדל בין:

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

Invariants:

  • אם יש 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 במהלך מעבר.

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

רצף מסודר של ביקורים שמייצג מסלול. ביקורים[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, בהתאם להקשר.

route_costs

map<string, double>

העלות של המסלול, לפי פירוט בשדות הבקשה שקשורים לעלויות. המפתחות הם נתיבי פרוטו, ביחס לקלט OptimizeToursRequest, למשל. 'model.shipments.pickups.cost', והערכים שם הם העלות הכוללת שנוצרה על ידי שדה העלות התואם, שמצטברת לאורך כל המסלול. במילים אחרות, העלויות["model.shipments.pickups.cost"] הן הסכום של כל עלויות האיסוף לאורך המסלול. כל העלויות שמוגדרות במודל מדווחות כאן בפירוט, למעט עלויות שקשורות למאפייני מעבר, שמדווחות רק באופן מצטבר נכון ל-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+duration_duration?
  • break_duration + pending_duration`.
start_time

Timestamp

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

route_polyline

EncodedPolyline

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

ShipmentTypeIncompatibility

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

שדות
types[]

string

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

incompatibility_mode

IncompatibilityMode

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

IncompatibilityMode

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

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

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

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

ShipmentTypeRequirement

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

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

סיבה

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

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

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/06, אפשר להשתמש רק במגבלות רכות.

delay

Duration

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

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

כלי רכב

מודל של רכב בבעיה במשלוח. כדי לפתור בעיית משלוח, המערכת תיצור מסלול החל מ-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

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

עומס מקסימלי מקובל.

מרווח

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

שדות
min

int64

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

max

int64

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

TravelMode

מצבי נסיעה לשימוש בכלי רכב.

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

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

UnloadingPolicy

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

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

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

נקודת ציון

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

שדות
side_of_road

bool

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

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

Location

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

place_id

string

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