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].
    • הערך של יחידות הננו צריך להיות לא מוגדר או מוגדר ל-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 או אל Cloud Storage בפורמט שהוגדר על ידי המשתמש. כמו השיטה OptimizeTours, כל רכיב OptimizeToursRequest מכיל ShipmentModel ומחזיר ערך OptimizeToursResponse שמכיל ShipmentRoute – קבוצת מסלולים שכלי רכב מפחיתים מהעלות הכוללת.

היקפי ההרשאות

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

  • https://www.googleapis.com/auth/cloud-platform
OptimizeTours

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

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

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

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

היקפי ההרשאות

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

  • https://www.googleapis.com/auth/cloud-platform

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_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 (תגובה Shipment.label) משמש לזיהוי ייחודי של ישות של רכב (משלוח resp) שנעשה בה שימוש בשתי הבקשות הרלוונטיות: הבקשה הקודמת שממנה נוצר התמיסה 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 פותרים את המודל.
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-th במודל.

request_label

string

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

skipped_shipments[]

SkippedShipment

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

validation_errors[]

OptimizeToursValidationError

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

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_CURDESIC_METERS_PER_SECOND_TOO_PENDING = 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_CAPALOCATION_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_׳׳ הרבה׳ = 2814 = 2814;
    • TIME_WINDOW_START_TIME_ אתר לפני_SOFT_END_TIME = 2815;
    • 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_ אתר תוסף_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_חוץ_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_PORT_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_ADDITIONAL_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;
  • 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;
    • break_REQUEST_NON_SCHEDULABLE = 4808;
    • break_RO_MAX_INTER_BR_DURATION_NEGATIVE_OR_NAN = 4809;
    • break_RO_MIN_BR_DURATION_NEGATIVE_OR_NAN = 4810;
    • break_value_MIN_break_DURATION_EXCEEDS_GLOBAL_DURATION = 4811;
    • /cookie = 4812 = 4812 = FALSE_ טווח הגדרות של 1812;
    • 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;
display_name

string

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

fields[]

FieldReference

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

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

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

error_message

string

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

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

offending_values

string

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

FieldReference

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

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

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

שדות
name

string

שם השדה, למשל 'כלי רכב'.

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 שבו צריך לכתוב את הפלט.

משלוח

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

שדות
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/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 המתאים.

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

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

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

משתנים:

  • אם יש 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` <= `soft_start_time` <= `end_time` and
  0 <= `start_time` <= `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.

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

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