אינדקס
-
RouteOptimization(ממשק) -
AggregatedMetrics(הודעה) -
BatchOptimizeToursMetadata(הודעה) -
BatchOptimizeToursRequest(הודעה) -
BatchOptimizeToursRequest.AsyncModelConfig(הודעה) -
BatchOptimizeToursResponse(הודעה) -
BreakRule(הודעה) -
BreakRule.BreakRequest(הודעה) -
BreakRule.FrequencyConstraint(הודעה) DataFormat(enum)-
DistanceLimit(הודעה) -
GcsDestination(הודעה) -
GcsSource(הודעה) -
InjectedSolutionConstraint(הודעה) -
InjectedSolutionConstraint.ConstraintRelaxation(הודעה) -
InjectedSolutionConstraint.ConstraintRelaxation.Relaxation(הודעה) InjectedSolutionConstraint.ConstraintRelaxation.Relaxation.Level(enum)-
InputConfig(הודעה) -
Location(הודעה) -
OptimizeToursLongRunningMetadata(הודעה) -
OptimizeToursRequest(הודעה) OptimizeToursRequest.SearchMode(enum)OptimizeToursRequest.SolvingMode(enum)-
OptimizeToursResponse(הודעה) -
OptimizeToursResponse.Metrics(הודעה) -
OptimizeToursUriMetadata(הודעה) -
OptimizeToursUriRequest(הודעה) -
OptimizeToursUriResponse(הודעה) -
OptimizeToursValidationError(הודעה) -
OptimizeToursValidationError.FieldReference(הודעה) -
OutputConfig(הודעה) -
RouteModifiers(הודעה) -
Shipment(הודעה) -
Shipment.Load(הודעה) -
Shipment.VisitRequest(הודעה) -
ShipmentModel(הודעה) -
ShipmentModel.DurationDistanceMatrix(הודעה) -
ShipmentModel.DurationDistanceMatrix.Row(הודעה) -
ShipmentModel.Objective(הודעה) ShipmentModel.Objective.Type(enum)-
ShipmentModel.PrecedenceRule(הודעה) -
ShipmentRoute(הודעה) -
ShipmentRoute.Break(הודעה) -
ShipmentRoute.EncodedPolyline(הודעה) -
ShipmentRoute.Transition(הודעה) -
ShipmentRoute.VehicleLoad(הודעה) -
ShipmentRoute.Visit(הודעה) ShipmentRoute.Visit.VisitType(enum)-
ShipmentTypeIncompatibility(הודעה) ShipmentTypeIncompatibility.IncompatibilityMode(enum)-
ShipmentTypeRequirement(הודעה) ShipmentTypeRequirement.RequirementMode(enum)-
SkippedShipment(הודעה) -
SkippedShipment.Reason(הודעה) SkippedShipment.Reason.Code(enum)-
TimeWindow(הודעה) -
TransitionAttributes(הודעה) -
Uri(הודעה) -
Vehicle(הודעה) -
Vehicle.DurationLimit(הודעה) -
Vehicle.LoadLimit(הודעה) -
Vehicle.LoadLimit.Interval(הודעה) -
Vehicle.LoadLimit.LoadCost(הודעה) Vehicle.TravelMode(enum)Vehicle.UnloadingPolicy(enum)-
VehicleFullness(הודעה) -
Waypoint(הודעה)
RouteOptimization
שירות לאופטימיזציה של מסלולי רכבים.
תוקף של סוגי שדות מסוימים:
google.protobuf.Timestamp- השעות הן בזמן יוניקס: מספר השניות מאז 1970-01-01T00:00:00+00:00.
- השניות צריכות להיות בטווח [0, 253402300799], כלומר בטווח [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
- הערך של nanos חייב להיות לא מוגדר או מוגדר כ-0.
google.protobuf.Duration- השניות צריכות להיות בטווח [0, 253402300799], כלומר בטווח [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
- הערך של nanos חייב להיות לא מוגדר או מוגדר כ-0.
google.type.LatLng- קו הרוחב חייב להיות בטווח [-90.0, 90.0].
- קו האורך חייב להיות בטווח [-180.0, 180.0].
- לפחות אחד מהערכים של קו הרוחב וקו האורך חייב להיות שונה מאפס.
| BatchOptimizeTours |
|---|
|
אופטימיזציה של מסלולי נסיעה של כלי רכב להודעה אחת או יותר של ה-method הזו היא פעולה ממושכת (LRO). הקלט לאופטימיזציה (הודעות המשתמש יכול לדגום את אם הערך בשדה אם השדה
|
| OptimizeTours |
|---|
|
שליחת מודל המטרה היא להקצות
|
| OptimizeToursLongRunning |
|---|
|
זוהי גרסה של השיטה ה-
|
| OptimizeToursUri |
|---|
|
זוהי וריאציה של השיטה הלקוח מציין את ה-URI של ה- השיטה הזו עדיפה על השיטה ה-
|
AggregatedMetrics
מדדים נצברים של ShipmentRoute (או של OptimizeToursResponse) בכל הרכיבים של Transition ו/או Visit (או בכל הרכיבים של ShipmentRoute).
| שדות | |
|---|---|
performed_shipment_count |
מספר המשלוחים שבוצעו. חשוב לזכור שצמד של איסוף ומסירה נספר רק פעם אחת. |
travel_duration |
משך הנסיעה הכולל במסלול או בפתרון. |
wait_duration |
משך ההמתנה הכולל במסלול או בפתרון. |
delay_duration |
משך העיכוב הכולל במסלול או בפתרון. |
break_duration |
משך ההפסקה הכולל במסלול או בפתרון. |
visit_duration |
משך הביקור הכולל במסלול או בפתרון. |
total_duration |
משך הזמן הכולל צריך להיות שווה לסכום של כל משכי הזמן שלמעלה. במסלולים, הוא תואם גם ל: |
travel_distance_meters |
מרחק הנסיעה הכולל של מסלול או פתרון. |
max_loads |
העומס המקסימלי שהושג לאורך כל המסלול (או הפתרון), לכל אחת מהכמויות במסלול הזה (או הפתרון), מחושב כערך המקסימלי בכל |
performed_mandatory_shipment_count |
מספר המשלוחים שבוצעו בפועל. ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד. |
performed_shipment_penalty_cost_sum |
סכום ה- ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד. |
BatchOptimizeToursMetadata
בסוג הזה אין שדות.
מטא-נתונים של פעולות לשיחות BatchOptimizeToursRequest.
BatchOptimizeToursRequest
בקשה לאופטימיזציה של סיורים באצווה כפעולה אסינכרונית. כל קובץ קלט צריך להכיל OptimizeToursRequest אחד, וכל קובץ פלט יכיל OptimizeToursResponse אחד. הבקשה מכילה מידע לקריאה/כתיבה וניתוח של הקבצים. כל קובצי הקלט והפלט צריכים להיות באותו פרויקט.
| שדות | |
|---|---|
parent |
חובה. פרויקט היעד והמיקום שבו מתבצעת הקריאה. פורמט:
ערכי |
model_configs[] |
חובה. מידע על קלט/פלט של כל מודל רכישה, כמו נתיבי קבצים ופורמטי נתונים. |
AsyncModelConfig
מידע על פתרון אסינכרוני של מודל אופטימיזציה אחד.
| שדות | |
|---|---|
display_name |
אופציונלי. שם המודל שהוגדר על ידי המשתמש, יכול לשמש ככינוי על ידי המשתמשים כדי לעקוב אחר המודלים. |
input_config |
חובה. מידע על מודל הקלט. |
output_config |
חובה. פרטי מיקום הפלט הרצוי. |
BatchOptimizeToursResponse
בסוג הזה אין שדות.
תשובה לBatchOptimizeToursRequest. הערך הזה מוחזר בפעולה הממושכת אחרי שהפעולה מסתיימת.
BreakRule
כללים ליצירת הפסקות לרכב (למשל, הפסקות צהריים). הפסקה היא פרק זמן רציף שבו הרכב נשאר במצב חוסר פעילות במיקום הנוכחי שלו ולא יכול לבצע ביקורים. הפסקה יכולה להתרחש:
- במהלך הנסיעה בין שני ביקורים (כולל הזמן מיד לפני או מיד אחרי ביקור, אבל לא באמצע ביקור), ובמקרה כזה הוא מאריך את זמן ההובלה המתאים בין הביקורים,
- או לפני תחילת הנסיעה של הרכב (יכול להיות שהרכב לא יתחיל לנסוע באמצע הפסקה), ובמקרה כזה היא לא משפיעה על שעת ההתחלה של הרכב.
- או אחרי שעת הסיום של הרכב (כנ"ל, עם שעת הסיום של הרכב).
| שדות | |
|---|---|
break_requests[] |
רצף של הפסקות. ההודעה |
frequency_constraints[] |
יכול להיות שיחולו כמה |
BreakRequest
צריך לדעת מראש את רצף ההפסקות (כלומר, המספר והסדר שלהן) שחלות על כל רכב. הערכים החוזרים של BreakRequest מגדירים את הרצף הזה, לפי הסדר שבו הם צריכים להתרחש. חלונות הזמן שלהם (earliest_start_time / latest_start_time) עשויים לחפוף, אבל הם חייבים להיות תואמים להזמנה (הדבר נבדק).
| שדות | |
|---|---|
earliest_start_time |
חובה. הגבול התחתון (כולל) של תחילת ההפסקה. |
latest_start_time |
חובה. הגבול העליון (כולל) של תחילת ההפסקה. |
min_duration |
חובה. משך הזמן המינימלי של ההפסקה. הערך חייב להיות חיובי. |
FrequencyConstraint
אפשר להגביל עוד יותר את התדירות ומשך הזמן של ההפסקות שצוינו למעלה, על ידי אכיפה של תדירות הפסקות מינימלית, כמו "חייבת להיות הפסקה של שעה אחת לפחות כל 12 שעות". נניח שאפשר לפרש את זה כך: "בכל חלון זמן של 12 שעות, חייבת להיות הפסקה אחת לפחות של שעה אחת לפחות". הדוגמה הזו תתורגם ל-FrequencyConstraint הבא:
{
min_break_duration { seconds: 3600 } # 1 hour.
max_inter_break_duration { seconds: 39600 } # 11 hours (12 - 1 = 11).
}
התזמון ומשך ההפסקות בפתרון יתחשבו בכל המגבלות האלה, בנוסף לחלונות הזמן ולמשכי הזמן המינימליים שכבר צוינו ב-BreakRequest.
בפועל, FrequencyConstraint עשויה לחול על הפסקות לא רצופות. לדוגמה, לוח הזמנים הבא תואם לדוגמה "שעה אחת כל 12 שעות":
04:00 vehicle start
.. performing travel and visits ..
09:00 1 hour break
10:00 end of the break
.. performing travel and visits ..
12:00 20-min lunch break
12:20 end of the break
.. performing travel and visits ..
21:00 1 hour break
22:00 end of the break
.. performing travel and visits ..
23:59 vehicle end
| שדות | |
|---|---|
min_break_duration |
חובה. משך ההפסקה המינימלי לאילוץ הזה. לא שלילי. לתיאור של |
max_inter_break_duration |
חובה. משך הזמן המקסימלי המותר לכל מרווח זמן במסלול שלא כולל הפסקה של |
DataFormat
פורמטים של נתונים לקובצי קלט ופלט.
| טיפוסים בני מנייה (enum) | |
|---|---|
DATA_FORMAT_UNSPECIFIED |
ערך לא חוקי, הפורמט לא יכול להיות UNSPECIFIED. |
JSON |
JavaScript Object Notation. |
PROTO_TEXT |
פורמט טקסט של מאגרי אחסון לפרוטוקולים. אפשר לעיין בכתובת https://protobuf.dev/reference/protobuf/textformat-spec/ |
DistanceLimit
מגבלה שמגדירה את המרחק המקסימלי שאפשר לנסוע. הוא יכול להיות קשיח או רך.
אם מגדירים מגבלה גמישה, צריך להגדיר גם את soft_max_meters וגם את cost_per_kilometer_above_soft_max, והערכים שלהם לא יכולים להיות שליליים.
| שדות | |
|---|---|
max_meters |
מגבלה קשיחה שמגבילה את המרחק ל-max_meters לכל היותר. הסף חייב להיות מספר חיובי. |
soft_max_meters |
מגבלה גמישה שלא אוכפת מגבלת מרחק מקסימלי, אבל אם חורגים ממנה, היא מוסיפה עלות לעלויות אחרות שמוגדרות במודל, באותה יחידה. אם מגדירים את soft_max_meters, הערך צריך להיות קטן מ-max_meters ולא שלילי. |
cost_per_kilometer_below_soft_max |
העלות לקילומטר שנצברה, עד העלות הזו לא נתמכת ב- |
cost_per_kilometer_above_soft_max |
העלות לקילומטר אם המרחק חורג מהמגבלה של העלות לא יכולה להיות שלילית. |
GcsDestination
המיקום ב-Google Cloud Storage שבו ייכתבו קובצי הפלט.
| שדות | |
|---|---|
uri |
חובה. URI של Google Cloud Storage. |
GcsSource
המיקום ב-Google Cloud Storage שממנו ייקרא קובץ הקלט.
| שדות | |
|---|---|
uri |
חובה. URI של אובייקט ב-Google Cloud Storage בפורמט |
InjectedSolutionConstraint
הפתרון שמוזרק לבקשה, כולל מידע על הביקורים שצריך להגביל ואיך להגביל אותם.
| שדות | |
|---|---|
routes[] |
המסלולים של הפתרון שצריך להוסיף. יכול להיות שחלק מהמסלולים יושמטו מהפתרון המקורי. המסלולים והמשלוחים שדילגתם עליהם צריכים לעמוד בהנחות הבסיסיות לגבי תקינות שמופיעות ב- |
skipped_shipments[] |
משלוחים שדילגו עליהם בפתרון שרוצים להוסיף. יכול להיות שחלק מהם יושמטו מהפתרון המקורי. מעיינים בשדה |
constraint_relaxations[] |
לאפס קבוצות של כלי רכב או יותר, מציין מתי ובאיזו מידה להקל על האילוצים. אם השדה הזה ריק, כל המסלולים הלא ריקים של כלי הרכב מוגבלים באופן מלא. |
ConstraintRelaxation
בקבוצת רכבים, מציין באילו ערכי סף המגבלות על הביקורים יוקלו ובאיזו רמה. המשלוחים שרשומים בשדה skipped_shipment חייבים להיות מדולגים, כלומר אי אפשר לבצע אותם.
| שדות | |
|---|---|
relaxations[] |
כל ההקלות באילוצי הביקורים שיחולו על ביקורים במסלולים עם כלי רכב ב- |
vehicle_indices[] |
מציין את האינדקסים של כלי הרכב שעליהם חל אילוץ הביקור אינדקס הרכב ממופה כמו |
הירגעות
אם 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 |
רמת ההקלה באילוצים שחלה כשהתנאים ב- |
threshold_time |
השעה שבה או שאחריה אפשר להחיל את ההקלה |
threshold_visit_count |
מספר הביקורים שבהם או שאחריהם אפשר להחיל את ההקלה אם הערך הוא |
רמה
מבטא את הרמות השונות של הקלות באילוצים, שחלות על ביקור ועל הביקורים הבאים אחריו כשהוא עומד בתנאי הסף.
הספירה הבאה היא בסדר עולה של הקלות.
| טיפוסים בני מנייה (enum) | |
|---|---|
LEVEL_UNSPECIFIED |
רמת ברירת המחדל המשתמעת של הקלה: לא מקלים על אף אילוץ, כלומר כל הביקורים מוגבלים באופן מלא. אסור להשתמש בערך הזה באופן מפורש ב- |
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 |
חובה. פורמט נתוני הקלט. |
שדה של איחוד source. חובה. הערך source יכול להיות רק אחד מהבאים: |
|
gcs_source |
מיקום ב-Google Cloud Storage. האובייקט חייב להיות אובייקט יחיד (קובץ). |
מיקום
מכיל מיקום (נקודה גיאוגרפית וכיוון אופציונלי).
| שדות | |
|---|---|
lat_lng |
הקואורדינטות הגיאוגרפיות של נקודת הדרך. |
heading |
כיוון המצפן שמשויך לכיוון זרימת התנועה. הערך הזה משמש כדי לציין את צד הכביש שבו צריך להשתמש לאיסוף ולהורדה. ערכי הכיוון יכולים להיות בין 0 ל-360, כאשר 0 מציין כיוון צפונה, 90 מציין כיוון מזרחה וכו'. |
OptimizeToursLongRunningMetadata
בסוג הזה אין שדות.
מטא-נתונים של פעולות לשיחות OptimizeToursLongRunning.
OptimizeToursRequest
בקשה שמועברת לכלי לפתרון בעיות אופטימיזציה של סיורים, שמגדיר את מודל המשלוחים שצריך לפתור וגם את הפרמטרים של האופטימיזציה.
| שדות | |
|---|---|
parent |
חובה. פרויקט או מיקום יעד לביצוע שיחה. פורמט:
ערכי |
timeout |
אם מגדירים את הזמן הקצוב לתפוגה, השרת מחזיר תשובה לפני שפרק הזמן הקצוב לתפוגה חולף או לפני שמגיע המועד האחרון של השרת לבקשות סנכרוניות, המוקדם מביניהם. בבקשות לא סנכרוניות, השרת ייצור פתרון (אם אפשר) לפני שזמן הקצוב לתפוגה יחלוף. |
model |
מודל המשלוח שצריך לפתור. |
solving_mode |
כברירת מחדל, מצב הפתרון הוא |
search_mode |
מצב החיפוש ששימש לפתרון הבקשה. |
injected_first_solution_routes[] |
הנחיית אלגוריתם האופטימיזציה למציאת פתרון ראשון שדומה לפתרון קודם. המודל מוגבל כשהפתרון הראשון נוצר. כל המשלוחים שלא בוצעו במסלול מסוים נדלגים באופן משתמע בפתרון הראשון, אבל יכול להיות שהם יבוצעו בפתרונות הבאים. הפתרון צריך לעמוד בכמה הנחות בסיסיות לגבי תוקף:
אם הפתרון שהוזרק לא אפשרי, לא בהכרח תוחזר שגיאת אימות, ויכול להיות שתוחזר שגיאה שמציינת שהפתרון לא אפשרי. |
injected_solution_constraint |
להגביל את אלגוריתם האופטימיזציה כדי למצוא פתרון סופי שדומה לפתרון קודם. לדוגמה, אפשר להשתמש בזה כדי להקפיא חלקים ממסלולים שכבר הושלמו או שצריך להשלים אבל אסור לשנות. אם הפתרון שהוזרק לא אפשרי, לא בהכרח תוחזר שגיאת אימות, ויכול להיות שתוחזר שגיאה שמציינת שהפתרון לא אפשרי. |
refresh_details_routes[] |
אם השדה לא ריק, המסלולים שצוינו ירועננו בלי לשנות את רצף הביקורים או זמני הנסיעה שלהם: רק פרטים אחרים יעודכנו. הפעולה הזו לא פותרת את המודל. החל מנובמבר 2020, השדה הזה מאכלס רק את הקווים הפוליגוניים של מסלולים לא ריקים, ודורש שהערך של יכול להיות שהשדות אסור להשתמש בשדה הזה יחד עם ל- |
interpret_injected_solutions_using_labels |
אם הערך הוא True:
הפרשנות הזו חלה על השדות אם הערך הוא True, תוויות בקטגוריות הבאות יכולות להופיע לכל היותר פעם אחת בקטגוריה שלהן:
אם הסרה של ביקורים במסלול או של מסלולים שלמים מפתרון מוזרק עשויה להשפיע על האילוצים המשתמעים, מה שעלול להוביל לשינוי בפתרון, לשגיאות אימות או לחוסר היתכנות. הערה: מי שמבצע את הקריאה צריך לוודא שכל |
consider_road_traffic |
כדאי להביא בחשבון את אומדן התנועה כשמחשבים את השדות |
populate_polylines |
אם הערך הוא True, קווים פוליגוניים יאוכלסו בתגובות מסוג |
populate_transition_polylines |
אם הערך הוא True, קווים פוליגוניים וטוקנים של מסלולים יאוכלסו בתגובה |
allow_large_deadline_despite_interruption_risk |
אם המדיניות מוגדרת, לבקשה יכול להיות מועד אחרון (ראו https://grpc.io/blog/deadlines) של עד 60 דקות. אחרת, המועד האחרון המקסימלי הוא 30 דקות בלבד. חשוב לזכור שבבקשות לטווח ארוך יש סיכון גדול יותר (אבל עדיין קטן) להפרעה. |
use_geodesic_distances |
אם הערך הוא true, מרחקי הנסיעה יחושבו באמצעות מרחקים גיאודזיים במקום מרחקים במפות Google, וזמני הנסיעה יחושבו באמצעות מרחקים גיאודזיים עם מהירות שמוגדרת על ידי |
label |
תווית שאפשר להשתמש בה כדי לזהות את הבקשה הזו, שדווחה ב- |
geodesic_meters_per_second |
כשהערך של |
max_validation_errors |
מגבילה את מספר שגיאות האימות שמוחזרות. השגיאות האלה בדרך כלל מצורפות למטען ייעודי (payload) של שגיאת INVALID_ARGUMENT בתור פרטי שגיאת BadRequest (https://cloud.google.com/apis/design/errors#error_details)), אלא אם solving_mode=VALIDATE_ONLY: ראו את השדה |
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 |
מאכלס רק את חשוב: לא כל המשלוחים הבלתי אפשריים מוחזרים כאן, אלא רק אלה שזוהו כבלתי אפשריים במהלך העיבוד המקדים. |
TRANSFORM_AND_RETURN_REQUEST |
המצב הזה פועל רק אם ניסיוני: פרטים נוספים זמינים בכתובת https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request. |
OptimizeToursResponse
תשובה אחרי פתרון בעיה של אופטימיזציית מסלולים, שמכילה את המסלולים של כל כלי רכב, את המשלוחים שדילגו עליהם ואת העלות הכוללת של הפתרון.
| שדות | |
|---|---|
routes[] |
מסלולים שמחושבים לכל רכב. המסלול ה-i תואם לרכב ה-i במודל. |
request_label |
עותק של |
skipped_shipments[] |
רשימת כל המשלוחים שדילגו עליהם. |
validation_errors[] |
רשימה של כל שגיאות האימות שהצלחנו לזהות באופן עצמאי. אפשר לעיין בהסבר על "שגיאות מרובות" לגבי ההודעה |
processed_request |
במקרים מסוימים אנחנו משנים את הבקשה לפני שאנחנו פותרים אותה, למשל מוסיפים עלויות. אם solving_mode == TRANSFORM_AND_RETURN_REQUEST, הבקשה ששונתה מוחזרת כאן. ניסיוני: פרטים נוספים זמינים בכתובת https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request. |
metrics |
מדדי משך זמן, מרחק ושימוש בפתרון הזה. |
מדדים
מדדים כלליים, שנאספו מכל המסלולים.
| שדות | |
|---|---|
aggregated_route_metrics |
זהו נתון נצבר מהמסלולים. כל מדד הוא הסכום (או הערך המקסימלי, במקרה של עומסים) של כל השדות של |
skipped_mandatory_shipment_count |
מספר המשלוחים שדילגו עליהם. |
used_vehicle_count |
מספר כלי הרכב שנעשה בהם שימוש. הערך: אם מסלול הרכב ריק והערך של |
earliest_vehicle_start_time |
שעת ההתחלה המוקדמת ביותר של רכב בשימוש, שמחושבת כערך המינימלי של |
latest_vehicle_end_time |
שעת הסיום המאוחרת ביותר של רכב משומש, שמחושבת כערך המקסימלי של |
costs |
עלות הפתרון, בחלוקה לפי שדות הבקשה שקשורים לעלות. המפתחות הם נתיבי פרוטו, ביחס ל-OptimizeToursRequest של הקלט, למשל "model.shipments.pickups.cost", והערכים הם העלות הכוללת שנוצרה על ידי שדה העלות המתאים, שנצבר על פני כל הפתרון. במילים אחרות, costs["model.shipments.pickups.cost"] הוא הסכום של כל המחירים לאיסוף בפתרון. כל העלויות שמוגדרות במודל מדווחות כאן בפירוט, חוץ מעלויות שקשורות ל-TransitionAttributes, שמדווחות רק באופן מצטבר החל מינואר 2022. |
total_cost |
העלות הכוללת של הפתרון. הסכום של כל הערכים במפת העלויות. |
OptimizeToursUriMetadata
בסוג הזה אין שדות.
מטא-נתונים של פעולות לשיחות OptimizeToursUri.
OptimizeToursUriRequest
בקשה שמשמשת את השיטה OptimizeToursUri.
| שדות | |
|---|---|
parent |
חובה. פרויקט או מיקום יעד לביצוע שיחה. פורמט:
ערכי |
input |
חובה. ה-URI של האובייקט ב-Cloud Storage שמכיל את ה- |
output |
חובה. ה-URI של האובייקט ב-Cloud Storage שיכיל את ה- |
OptimizeToursUriResponse
תשובה שהוחזרה על ידי ה-method OptimizeToursUri.
| שדות | |
|---|---|
output |
אופציונלי. ה-URI של האובייקט ב-Cloud Storage שמכיל את ה- אפשר להשתמש ב- |
OptimizeToursValidationError
תיאור של שגיאה או אזהרה שנתקלו בהן במהלך האימות של OptimizeToursRequest.
| שדות | |
|---|---|
code |
שגיאת אימות מוגדרת על ידי הצמד ( השדות שאחרי הקטע הזה מספקים הקשר נוסף לגבי השגיאה. שגיאות מרובות: כשיש כמה שגיאות, תהליך האימות מנסה להציג כמה מהן. בדומה לקומפיילר, זהו תהליך לא מושלם. חלק משגיאות האימות יהיו "חמורות", כלומר הן יעצרו את כל תהליך האימות. זה נכון לגבי שגיאות יציבות: |
display_name |
השם המוצג של השגיאה. |
fields[] |
הקשר של שגיאה יכול לכלול 0, 1 (ברוב המקרים) או יותר שדות. לדוגמה, כדי להתייחס לרכב מספר 4 ולאיסוף הראשון של משלוח מספר 2, אפשר להשתמש בקוד הבא: עם זאת, שימו לב שהעוצמה של |
error_message |
מחרוזת קריאה לאנשים שמתארת את השגיאה. יש מיפוי של 1:1 בין יציבות: לא יציב: הודעת השגיאה שמשויכת ל- |
offending_values |
יכול להכיל את הערכים של השדות. האפשרות הזו לא תמיד זמינה. אסור להסתמך עליו, וצריך להשתמש בו רק לניפוי באגים ידני במודל. |
FieldReference
מציין את ההקשר של שגיאת האימות. FieldReference תמיד מתייחס לשדה נתון בקובץ הזה, והוא פועל לפי אותו מבנה היררכי. לדוגמה, אפשר לציין את רכיב מס' 2 של start_time_windows של רכב מס' 5 באמצעות:
name: "vehicles" index: 5 sub_field { name: "end_time_windows" index: 2 }
עם זאת, אנחנו משמיטים ישויות ברמה העליונה כמו OptimizeToursRequest או ShipmentModel כדי למנוע עומס בהודעה.
| שדות | |
|---|---|
name |
שם השדה, למשל "vehicles". |
sub_field |
שדה משנה בתצורה של רקורסיה, אם צריך. |
שדה של איחוד הערך |
|
index |
האינדקס של השדה אם הוא חוזר. |
key |
מפתח אם השדה הוא מפה. |
OutputConfig
מציינים יעד לתוצאות של [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours].
| שדות | |
|---|---|
data_format |
חובה. פורמט הנתונים של הפלט. |
שדה של איחוד destination. חובה. הערך destination יכול להיות רק אחד מהבאים: |
|
gcs_destination |
המיקום ב-Google Cloud Storage שבו ייכתב הפלט. |
RouteModifiers
מכיל קבוצה של תנאים אופציונליים שצריך לעמוד בהם כשמחשבים מסלולים של כלי רכב. השדה הזה דומה לשדה RouteModifiers ב-Routes Preferred API של הפלטפורמה של מפות Google. מידע נוסף זמין בכתובת: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.
| שדות | |
|---|---|
avoid_tolls |
ההגדרה קובעת אם להימנע מכבישי אגרה כשאפשר. תינתן עדיפות למסלולים שלא כוללים כבישי אגרה. רלוונטי רק לאמצעי תחבורה ממונעים. |
avoid_highways |
ההגדרה קובעת אם להימנע מכבישים מהירים כשאפשר. תינתן עדיפות למסלולים שלא כוללים כבישים מהירים. רלוונטי רק לאמצעי תחבורה ממונעים. |
avoid_ferries |
ההגדרה קובעת אם להימנע ממעבורות כשאפשר. תינתן עדיפות למסלולים שלא כוללים נסיעה במעבורות. רלוונטי רק לאמצעי תחבורה ממונעים. |
avoid_indoor |
אופציונלי. ההגדרה קובעת אם להימנע מניווט בתוך מבנים כשאפשר. תינתן עדיפות למסלולים שלא כוללים ניווט בתוך מבנים. ההגדרה חלה רק על אופן ההתניידות |
משלוח
משלוח של פריט אחד, מנקודת איסוף אחת לנקודת מסירה אחת. כדי שהמשלוח ייחשב כמבוצע, רכב ייחודי צריך לבקר באחד ממיקומי האיסוף שלו (ולהקטין את הקיבולת הפנויה שלו בהתאם), ואז לבקר באחד ממיקומי המסירה שלו בשלב מאוחר יותר (ולכן להגדיל מחדש את הקיבולת הפנויה שלו בהתאם).
| שדות | |
|---|---|
display_name |
השם המוצג של המשלוח, שמוגדר על ידי המשתמש. הוא יכול להכיל עד 63 תווים, כולל תווים בפורמט UTF-8. |
pickups[] |
קבוצה של חלופות לאיסוף שמשויכות למשלוח. אם לא מציינים את המיקום, הרכב צריך להגיע רק למיקום שתואם למשלוחים. |
deliveries[] |
קבוצה של חלופות משלוח שמשויכות למשלוח. אם לא מציינים את המיקום, הרכב צריך להגיע רק למיקום שתואם לאיסופים. |
load_demands |
דרישות העומס של המשלוח (לדוגמה: משקל, נפח, מספר משטחים וכו'). המפתחות במפה צריכים להיות מזהים שמתארים את סוג העומס המתאים, ורצוי לכלול גם את היחידות. לדוגמה: "weight_kg", "volume_gallons", "pallet_count" וכו'. אם מפתח מסוים לא מופיע במפה, העומס התואם נחשב כ-null. |
allowed_vehicle_indices[] |
קבוצת כלי הרכב שיכולים לבצע את המשלוח הזה. אם השדה ריק, כל כלי הרכב יכולים לבצע את המשימה. הרכבים מיוצגים על ידי האינדקס שלהם ברשימת |
costs_per_vehicle[] |
מציין את העלות שנגרמת כשהמשלוח הזה נמסר על ידי כל רכב. אם מציינים את המאפיין, הוא חייב לכלול אחד מהשניים:
העלויות האלה צריכות להיות באותה יחידה כמו |
costs_per_vehicle_indices[] |
אינדקסים של כלי הרכב ש- |
pickup_to_delivery_absolute_detour_limit |
מציינת את משך הזמן המקסימלי של עיקוף מוחלט בהשוואה למסלול הקצר ביותר מנקודת האיסוף לנקודת המסירה. אם מציינים את המאפיין, הוא חייב להיות לא שלילי, והמשלוח חייב לכלול לפחות איסוף אחד ומסירה אחת. לדוגמה, נניח ש-t הוא הזמן הקצר ביותר שלוקח להגיע מהאפשרות שנבחרה לאיסוף ישירות לאפשרות שנבחרה למשלוח. ואז ההגדרה אם מגדירים גם מגבלות יחסיות וגם מגבלות מוחלטות לאותו משלוח, המגבלה המחמירה יותר משמשת לכל זוג אפשרי של איסוף/מסירה. החל מאוקטובר 2017, יש תמיכה בנסיעות עקיפות רק כשמשך הנסיעה לא תלוי בכלי הרכב. |
pickup_to_delivery_time_limit |
מציין את משך הזמן המקסימלי מתחילת האיסוף ועד לתחילת המסירה של משלוח. אם מציינים את המאפיין, הוא חייב להיות לא שלילי, והמשלוח חייב לכלול לפחות איסוף אחד ומסירה אחת. הזמן הזה לא תלוי באפשרויות שנבחרו לאיסוף ולמסירה, וגם לא במהירות הרכב. אפשר לציין את זה לצד אילוצי סטייה מקסימלית: הפתרון יתחשב בשני המפרטים. |
shipment_type |
מחרוזת לא ריקה שמציינת את סוג המשלוח. אפשר להשתמש בתכונה הזו כדי להגדיר חוסר תאימות או דרישות בין השדה הזה שונה מהשדה |
label |
מציין תווית למשלוח הזה. התווית הזו מדווחת בתגובה ב- |
ignore |
אם הערך הוא True, המערכת מדלגת על המשלוח הזה, אבל לא מחילה התעלמות ממשלוח גורמת לשגיאת אימות כשיש מותר להתעלם ממשלוח שמבוצע ב- |
penalty_cost |
אם המשלוח לא הושלם, הקנס הזה מתווסף לעלות הכוללת של המסלולים. משלוח נחשב כהושלם אם מבקרים באחת מהחלופות לאיסוף ולמסירה שלו. העלות יכולה להיות מבוטאת באותה יחידה שבה משתמשים בכל שאר השדות שקשורים לעלות במודל, והיא חייבת להיות חיובית. חשוב: אם לא מציינים את הקנס הזה, הוא נחשב לאינסופי, כלומר חובה להשלים את המשלוח. |
pickup_to_delivery_relative_detour_limit |
מציין את זמן העיקוף היחסי המקסימלי בהשוואה למסלול הקצר ביותר מנקודת האיסוף לנקודת המסירה. אם מציינים את המאפיין, הוא חייב להיות לא שלילי, והמשלוח חייב לכלול לפחות איסוף אחד ומסירה אחת. לדוגמה, נניח ש-t הוא הזמן הקצר ביותר שלוקח להגיע מהאפשרות שנבחרה לאיסוף ישירות לאפשרות שנבחרה למשלוח. ואז ההגדרה אם מגדירים גם מגבלות יחסיות וגם מגבלות מוחלטות לאותו משלוח, המגבלה המחמירה יותר משמשת לכל זוג אפשרי של איסוף/מסירה. החל מאוקטובר 2017, יש תמיכה בנסיעות עקיפות רק כשמשך הנסיעה לא תלוי בכלי הרכב. |
טעינה
כשמבצעים ביקור, יכול להיות שסכום מוגדר מראש יתווסף לעומס על הרכב אם מדובר באיסוף, או יופחת אם מדובר במשלוח. ההודעה הזו מגדירה את הסכום הזה. load_demands.
| שדות | |
|---|---|
amount |
המידה שבה העומס של הרכב שמבצע את הביקור המתאים ישתנה. מכיוון שמדובר במספר שלם, מומלץ למשתמשים לבחור יחידה מתאימה כדי למנוע אובדן של דיוק. הערך חייב להיות גדול מ-0 או שווה לו. |
VisitRequest
בקשה לביקור שאפשר לבצע באמצעות רכב: יש לה מיקום גיאוגרפי (או שניים, ראו בהמשך), שעות פתיחה וסגירה שמיוצגות על ידי חלונות זמן, ומשך זמן שירות (הזמן שהרכב מבלה מרגע שהגיע לאסוף או לפרוק סחורה).
| שדות | |
|---|---|
arrival_location |
המיקום הגיאוגרפי שאליו הרכב מגיע כשמבצעים את ה |
arrival_waypoint |
נקודת הדרך שאליה הרכב מגיע כשמבצעים את ה |
departure_location |
המיקום הגיאוגרפי שממנו הרכב יוצא אחרי השלמת |
departure_waypoint |
נקודת הציון שבה הרכב יוצא אחרי השלמת |
tags[] |
מציין תגים שמצורפים לבקשת הביקור. אסור להשתמש במחרוזות ריקות או כפולות. |
time_windows[] |
חלונות זמן שמגבילים את זמן ההגעה לביקור. שימו לב שכלי רכב יכול לצאת מחוץ לחלון זמן ההגעה, כלומר זמן ההגעה + משך הזמן לא צריכים להיות בתוך חלון זמן. אם הרכב יגיע לפני אם לא מצוין חלונות הזמן חייבים להיות נפרדים, כלומר אסור שחלון זמן אחד יחפוף לחלון זמן אחר או יהיה סמוך אליו, והם חייבים להיות בסדר עולה. אפשר להגדיר את |
duration |
משך הביקור, כלומר הזמן שהרכב נמצא במקום בין ההגעה לעזיבה (צריך להוסיף אותו לזמן ההמתנה האפשרי, ראו |
cost |
עלות הטיפול בבקשת הביקור הזו במסלול של כלי רכב. אפשר להשתמש במאפיין הזה כדי לשלם עלויות שונות על כל אפשרות חלופית לאיסוף או למסירה של משלוח. העלות הזו צריכה להיות באותה יחידה כמו |
load_demands |
העומס שנוצר בעקבות בקשת הביקור הזו. השדה הזה זהה לשדה |
visit_types[] |
מציין את סוגי הביקורים. אפשר להשתמש במאפיין הזה כדי להקצות זמן נוסף שנדרש לרכב כדי להשלים את הביקור (ראו כל סוג יכול להופיע רק פעם אחת. |
label |
מציינת תווית ל- |
avoid_u_turns |
מציינת אם צריך להימנע מפניות פרסה במסלולי נסיעה במיקום הזה. אנחנו עושים כמיטב יכולתנו כדי להימנע מפניות פרסה, אבל לא יכולים להבטיח הימנעות מוחלטת. זו תכונה ניסיונית וההתנהגות שלה עשויה להשתנות. ניסיוני: פרטים נוספים זמינים בכתובת https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request. |
ShipmentModel
מודל משלוחים מכיל קבוצה של משלוחים שצריך לבצע באמצעות קבוצה של כלי רכב, תוך צמצום העלות הכוללת, שהיא הסכום של:
- עלות הניתוב של כלי הרכב (סכום העלות לזמן הכולל, העלות לזמן הנסיעה והעלות הקבועה לכל כלי הרכב).
- קנסות על משלוחים שלא בוצעו.
- עלות המשלוחים לכל משך הזמן של המבצע
| שדות | |
|---|---|
shipments[] |
קבוצת משלוחים שצריך לבצע במודל. |
vehicles[] |
קבוצת כלי רכב שאפשר להשתמש בהם כדי לבצע ביקורים. |
objectives[] |
קבוצת היעדים של המודל הזה, שאותם נהפוך לעלויות. אם הוא לא ריק, מודל הקלט צריך להיות ללא עלות. כדי לקבל את הבקשה ששונתה, צריך להשתמש ב- ניסיוני: פרטים נוספים זמינים בכתובת https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request. |
global_start_time |
שעת ההתחלה ושעת הסיום הגלובליות של המודל: שעות מחוץ לטווח הזה לא ייחשבו כתקפות. טווח הזמן של המודל חייב להיות פחות משנה, כלומר ההפרש בין כשמשתמשים בשדות |
global_end_time |
אם לא מגדירים את השדה, ערך ברירת המחדל הוא 00:00:00 UTC, 1 בינואר 1971 (כלומר, שניות: 31536000, ננו-שניות: 0). |
global_duration_cost_per_hour |
"משך הזמן הגלובלי" של התוכנית הכוללת הוא ההפרש בין שעת ההתחלה האפקטיבית המוקדמת ביותר לבין שעת הסיום האפקטיבית המאוחרת ביותר של כל הרכבים. המשתמשים יכולים להקצות עלות לשעה לכמות הזו כדי לנסות לבצע אופטימיזציה להשלמת המשימה המוקדמת ביותר, למשל. העלות הזו צריכה להיות באותה יחידה כמו |
duration_distance_matrices[] |
מציין את מטריצות משך הזמן ומטריצת המרחקים שבהן נעשה שימוש במודל. אם השדה הזה ריק, המערכת תשתמש במפות Google או במרחקים גיאודזיים, בהתאם לערך בשדה דוגמאות לשימוש:
|
duration_distance_matrix_src_tags[] |
תגים שמגדירים את המקורות של מטריצות משך הזמן והמרחק. התגים תואמים ל- |
duration_distance_matrix_dst_tags[] |
תגים שמגדירים את היעדים של מטריצות משך הזמן ומטריצות המרחקים; התגים תואמים ל- |
transition_attributes[] |
מאפייני מעבר נוספו למודל. |
shipment_type_incompatibilities[] |
קבוצות של shipment_types לא תואמים (ראו |
shipment_type_requirements[] |
קבוצות של דרישות |
precedence_rules[] |
קבוצה של כללי קדימות שצריך לאכוף במודל. חשוב: השימוש בכללי קדימויות מגביל את גודל הבעיה שאפשר לבצע לה אופטימיזציה. יכול להיות שנדחה בקשות שכוללות כללי קדימות עם הרבה משלוחים. |
max_active_vehicles |
מגבילה את המספר המקסימלי של כלי רכב פעילים. רכב נחשב פעיל אם המסלול שלו כולל לפחות משלוח אחד. אפשר להשתמש בזה כדי להגביל את מספר המסלולים במקרים שבהם יש פחות נהגים מכלי רכב, וצי הרכב הוא הטרוגני. לאחר מכן, האופטימיזציה תבחר את קבוצת המשנה הטובה ביותר של כלי הרכב לשימוש. הערך חייב להיות חיובי. |
DurationDistanceMatrix
מציינת מטריצה של משך זמן ומרחק ממיקומי ההתחלה של הביקור והרכב למיקומי הסיום של הביקור והרכב.
| שדות | |
|---|---|
rows[] |
מציין את השורות של מטריצת משך הזמן ומטריצת המרחקים. הוא חייב להכיל את אותו מספר רכיבים כמו |
vehicle_start_tag |
תג שמגדיר לאילו כלי רכב חלה מטריצת המרחקים ומשך הזמן הזו. אם לא מציינים ערך, המטריצה חלה על כל הרכבים, ויכולה להיות רק מטריצה אחת. כל התחלה של רכב חייבת להתאים בדיוק למטריצה אחת, כלומר בדיוק אחד מהשדות לכל המטריצות צריך להיות |
שורה
מציין שורה במטריצת משך הזמן והמרחק.
| שדות | |
|---|---|
durations[] |
ערכי משך זמן בשורה נתונה. הוא חייב להכיל את אותו מספר רכיבים כמו |
meters[] |
ערכי המרחק בשורה נתונה. אם אין עלויות או אילוצים שמתייחסים למרחקים במודל, אפשר להשאיר את השדה הזה ריק. אחרת, הוא צריך להכיל מספר רכיבים זהה ל- |
מטרה
היעדים מחליפים את מודל העלות לחלוטין, ולכן הם לא תואמים לעלויות קיימות. כל מטרה ממופה למספר עלויות מוגדרות מראש, למשל, כלי רכב, משלוחים או מאפייני מעבר.
ניסיוני: פרטים נוספים זמינים בכתובת https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request.
| שדות | |
|---|---|
type |
סוג היעד. |
weight |
כמה היעד הזה צריך להיחשב ביחס ליעדים האחרים. אפשר להזין כל מספר לא שלילי, וסכום המשקלים לא חייב להיות 1. ברירת המחדל של המשקלים היא 1.0. |
סוג
סוג היעד שימופה לקבוצת עלויות.
| טיפוסים בני מנייה (enum) | |
|---|---|
DEFAULT |
כדי להבטיח פתרון סביר, המערכת תשתמש בקבוצת עלויות שמוגדרת כברירת מחדל. הערה: אפשר להשתמש ביעד הזה בפני עצמו, אבל הוא גם תמיד יתווסף עם משקל 1.0, כבסיס, ליעדים שצוינו על ידי המשתמש, אם הוא עדיין לא קיים. |
MIN_DISTANCE |
יעדי MIN. לצמצם את המרחק הכולל. |
MIN_WORKING_TIME |
צמצום זמן העבודה הכולל, בחישוב של כל הרכבים. |
MIN_TRAVEL_TIME |
כמו למעלה, אבל עם התמקדות בזמן הנסיעה בלבד. |
MIN_NUM_VEHICLES |
לצמצם את מספר כלי הרכב שבהם משתמשים. |
PrecedenceRule
כלל קדימות בין שני אירועים (כל אירוע הוא איסוף או מסירה של משלוח): האירוע "השני" צריך להתחיל לפחות offset_duration אחרי שהאירוע "הראשון" התחיל.
כמה קדימויות יכולות להתייחס לאותם אירועים (או לאירועים קשורים), למשל, "האיסוף של B מתרחש אחרי המסירה של A" ו "האיסוף של C מתרחש אחרי האיסוף של B".
בנוסף, קדימויות חלות רק כששני המשלוחים מבוצעים, ואחרת המערכת מתעלמת מהן.
| שדות | |
|---|---|
first_is_delivery |
מציין אם האירוע "הראשון" הוא מסירה. |
second_is_delivery |
מציין אם האירוע "השני" הוא מסירה. |
offset_duration |
ההיסט בין האירוע "הראשון" לאירוע "השני". הוא יכול להיות שלילי. |
first_index |
אינדקס המשלוח של האירוע "הראשון". חובה למלא את השדה הזה. |
second_index |
אינדקס המשלוח של האירוע "השני". חובה למלא את השדה הזה. |
ShipmentRoute
אפשר לפרק את המסלול של הרכב לאורך ציר הזמן, באופן הבא (אנחנו מניחים שיש n ביקורים):
| | | | | T[2], | | |
| Transition | Visit #0 | | | V[2], | | |
| #0 | aka | T[1] | V[1] | ... | V[n-1] | T[n] |
| aka T[0] | V[0] | | | V[n-2],| | |
| | | | | T[n-1] | | |
^ ^ ^ ^ ^ ^ ^ ^
vehicle V[0].start V[0].end V[1]. V[1]. V[n]. V[n]. vehicle
start (arrival) (departure) start end start end end
חשוב לשים לב להבדל בין:
- "אירועים נקודתיים", כמו ההתחלה והסיום של הרכב וההתחלה והסיום של כל ביקור (כלומר הגעה ועזיבה). הם מתרחשים בשנייה נתונה.
- "מרווחי זמן", כמו הביקורים עצמם והמעבר בין הביקורים. לפעמים משך הזמן של מרווחי הזמן יכול להיות אפס, כלומר הם מתחילים ומסתיימים באותה שנייה, אבל בדרך כלל משך הזמן שלהם חיובי.
אינווריאנטים:
- אם יש n ביקורים, יש n+1 מעברים.
- ביקור תמיד מוקף במעבר לפניו (אותו אינדקס) ובמעבר אחריו (אינדקס + 1).
- אחרי תחילת הנסיעה של הרכב תמיד מגיע מעבר מספר 0.
- לפני סיום הנסיעה תמיד מופיע מעבר #n.
בואו נתמקד במה שקורה במהלך Transition ו-Visit:
---+-------------------------------------+-----------------------------+-->
| TRANSITION[i] | VISIT[i] |
| | |
| * TRAVEL: the vehicle moves from | PERFORM the visit: |
| VISIT[i-1].departure_location to | |
| VISIT[i].arrival_location, which | * Spend some time: |
| takes a given travel duration | the "visit duration". |
| and distance | |
| | * Load or unload |
| * BREAKS: the driver may have | some quantities from the |
| breaks (e.g. lunch break). | vehicle: the "demand". |
| | |
| * WAIT: the driver/vehicle does | |
| nothing. This can happen for | |
| many reasons, for example when | |
| the vehicle reaches the next | |
| event's destination before the | |
| start of its time window | |
| | |
| * DELAY: *right before* the next | |
| arrival. E.g. the vehicle and/or | |
| driver spends time unloading. | |
| | |
---+-------------------------------------+-----------------------------+-->
^ ^ ^
V[i-1].end V[i].start V[i].end
לבסוף, כך אפשר לסדר את המצבים נסיעה, הפסקות, עיכוב והמתנה במהלך מעבר.
- הם לא חופפים.
- הערך של DELAY הוא ייחודי וחייב להיות פרק זמן רציף ממש לפני הביקור הבא (או סיום הנסיעה של הרכב). לכן, מספיק לדעת את משך העיכוב כדי לדעת את שעת ההתחלה והסיום שלו.
- ההפסקות הן פרקי זמן רציפים שלא חופפים. התשובה מציינת את שעת ההתחלה ואת משך הזמן של כל הפסקה.
- הפעולות TRAVEL ו-WAIT הן "ניתנות להפרעה": אפשר להפריע להן כמה פעמים במהלך המעבר הזה. הלקוחות יכולים להניח שהנסיעה מתרחשת "בהקדם האפשרי" ושהזמן שנותר מוקדש ל "המתנה".
דוגמה (מורכבת):
TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
|| | | | | | | ||
|| T | B | T | | B | | D ||
|| r | r | r | W | r | W | e ||
|| a | e | a | a | e | a | l ||
|| v | a | v | i | a | i | a ||
|| e | k | e | t | k | t | y ||
|| l | | l | | | | ||
|| | | | | | | ||
--++-----------------------------------------------------------------++-->
| שדות | |
|---|---|
vehicle_index |
הרכב שמבצע את המסלול, מזוהה לפי האינדקס שלו במקור |
vehicle_label |
התווית של הרכב שמבצע את המסלול הזה, שווה ל- |
vehicle_start_time |
השעה שבה הרכב מתחיל את המסלול שלו. |
vehicle_end_time |
השעה שבה הרכב מסיים את המסלול שלו. |
visits[] |
רצף מסודר של ביקורים שמייצג מסלול. visits[i] הוא הביקור ה-i במסלול. אם השדה הזה ריק, הרכב נחשב כלא משומש. |
transitions[] |
רשימה מסודרת של מעברים במסלול. |
has_traffic_infeasibilities |
כשהערך של סביר להניח שההגעה אל next_visit תתרחש אחרי חלון הזמן הנוכחי שלה, בגלל הערכה מוגברת של זמן הנסיעה |
route_polyline |
ייצוג הקו הפוליגוני המקודד של המסלול. השדה הזה מאוכלס רק אם הערך של |
breaks[] |
הפסקות מתוכננות לרכב שנוסע במסלול הזה. הרצף |
metrics |
מדדי משך הזמן, המרחק והעומס במסלול הזה. השדות של |
vehicle_fullness |
שדה ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד. |
route_costs |
עלות המסלול, בחלוקה לפי שדות בקשה שקשורים לעלות. המפתחות הם נתיבי פרוטו, ביחס ל-OptimizeToursRequest של הקלט, למשל "model.shipments.pickups.cost", והערכים הם העלות הכוללת שנוצרה על ידי שדה העלות המתאים, שנצבר לאורך כל המסלול. במילים אחרות, costs["model.shipments.pickups.cost"] הוא הסכום של כל עלויות האיסוף לאורך המסלול. כל העלויות שמוגדרות במודל מדווחות כאן בפירוט, חוץ מעלויות שקשורות ל-TransitionAttributes, שמדווחות רק באופן מצטבר החל מינואר 2022. |
route_total_cost |
העלות הכוללת של המסלול. סכום כל העלויות במפת העלויות. |
הפסקה
נתונים שמייצגים את ההפעלה של הפסקה.
| שדות | |
|---|---|
start_time |
שעת ההתחלה של ההפסקה. |
duration |
משך ההפסקה. |
EncodedPolyline
הייצוג המקודד של קו פוליגוני. מידע נוסף על קידוד קו פוליגוני זמין כאן: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.
| שדות | |
|---|---|
points |
מחרוזת שמייצגת נקודות מקודדות של הקו הפוליגוני. |
מעבר
מעבר בין שני אירועים במסלול. לתיאור של ShipmentRoute.
אם לרכב אין start_location או end_location, מדדי הנסיעה התואמים הם 0.
| שדות | |
|---|---|
travel_duration |
משך הנסיעה במהלך המעבר הזה. |
travel_distance_meters |
המרחק שעברתם במהלך המעבר. |
traffic_info_unavailable |
כשמבקשים נתוני תנועה דרך |
delay_duration |
סכום משכי הזמן של העיכובים שהוחלו על המעבר הזה. אם יש עיכוב, הוא מתחיל בדיוק |
break_duration |
משך הזמן הכולל של ההפסקות שהתרחשו במהלך המעבר הזה, אם היו כאלה. פרטים על שעת ההתחלה ומשך הזמן של כל הפסקה מאוחסנים ב- |
wait_duration |
משך ההמתנה במהלך המעבר הזה. משך ההמתנה תואם לזמן חוסר הפעילות ולא כולל את זמן ההפסקה. חשוב גם לדעת שזמן ההמתנה הזה יכול להיות מחולק לכמה מרווחים לא רציפים. |
total_duration |
משך הזמן הכולל של המעבר, לנוחיותכם. הוא שווה ל:
|
start_time |
שעת ההתחלה של המעבר הזה. |
route_polyline |
הייצוג של הקו הפוליגוני המקודד של המסלול שבו הרכב נסע במהלך המעבר. השדה הזה מאוכלס רק אם הערך של |
route_token |
פלט בלבד. אסימון אטום שאפשר להעביר ל-Navigation SDK כדי לשחזר את המסלול במהלך הניווט, ובמקרה של שינוי מסלול, לשמור על הכוונה המקורית של המסלול שנוצר. התייחסו לטוקן הזה כאל אובייקט BLOB אטום. אל תשוו את הערך שלו בין בקשות, כי הערך עשוי להשתנות גם אם השירות מחזיר בדיוק את אותו מסלול. השדה הזה מאוכלס רק אם השדה |
vehicle_loads |
עומסי הרכב במהלך המעבר הזה, לכל סוג שמופיע ב- העומסים במהלך המעבר הראשון הם עומסי ההתחלה של מסלול הרכב. אחרי כל ביקור, הערך של |
VehicleLoad
מדווח על העומס בפועל של הרכב בנקודה מסוימת לאורך המסלול, עבור סוג נתון (ראו Transition.vehicle_loads).
| שדות | |
|---|---|
amount |
כמות המטען ברכב, לפי הסוג הנתון. יחידת העומס מצוינת בדרך כלל לפי הסוג. |
כניסה
ביקור שבוצע במהלך מסלול. הביקור הזה קשור לאיסוף או למשלוח של Shipment.
| שדות | |
|---|---|
shipment_index |
אינדקס של השדה |
is_pickup |
אם הערך הוא True, הביקור תואם לאיסוף של |
visit_request_index |
האינדקס של |
start_time |
השעה שבה הביקור מתחיל. חשוב לזכור שהרכב עשוי להגיע למיקום הביקור לפני השעה הזו. השעות תואמות ל |
load_demands |
העומס הכולל של הביקור הוא הסכום של המשלוח ובקשת הביקור |
detour |
זמן הנסיעה הנוסף שנובע מהמשלוחים שבוצעו במסלול לפני הביקור, ומזמן ההמתנה הפוטנציאלי שנובע מחלונות הזמן. אם הביקור הוא מסירה, הנסיעה הלוך ושוב מחושבת מהביקור המתאים של האיסוף, והיא שווה ל: אחרת, הוא מחושב לפי |
shipment_label |
עותק של |
visit_label |
עותק של |
visit_type |
אופציונלי. מציין את סוג הביקור. ההגדרה הזו מחליפה את השדה |
injected_solution_location_token |
אסימון אטום שמייצג מידע על מיקום הביקור. יכול להיות שהשדה הזה יאוכלס בביקורים של מסלולי התוצאות אם ניסיוני: פרטים נוספים זמינים בכתובת https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request. |
VisitType
מציין אם הביקור הוא איסוף, משלוח או ביקור בStop. הביקורים בתחנה משמשים רק כשאופטימיזציה של כמה אמצעי תחבורה מופעלת.
| טיפוסים בני מנייה (enum) | |
|---|---|
VISIT_TYPE_UNSPECIFIED |
סוג הביקור לא צוין. |
PICKUP_SHIPMENT |
ביקור תואם לאיסוף משלוח. |
DELIVER_SHIPMENT |
ביקור תואם למסירת משלוח. |
ShipmentTypeIncompatibility
מציין חוסר תאימות בין משלוחים בהתאם ל-shipment_type שלהם. ההופעה של משלוחים לא תואמים באותו מסלול מוגבלת בהתאם למצב חוסר התאימות.
| שדות | |
|---|---|
types[] |
רשימה של סוגים לא תואמים. שני משלוחים עם ערכים שונים של |
incompatibility_mode |
המצב שמופעל על חוסר התאימות. |
IncompatibilityMode
מצבים שמגדירים איך להגביל את ההופעה של משלוחים לא תואמים באותו מסלול.
| טיפוסים בני מנייה (enum) | |
|---|---|
INCOMPATIBILITY_MODE_UNSPECIFIED |
מצב אי-תאימות לא מוגדר. אין להשתמש בערך הזה. |
NOT_PERFORMED_BY_SAME_VEHICLE |
במצב הזה, שני משלוחים עם סוגים לא תואמים לא יכולים לחלוק את אותו הרכב. |
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY |
במצב הזה, שני משלוחים עם סוגים לא תואמים לא יכולים להיות באותו רכב באותו זמן:
|
ShipmentTypeRequirement
מציין את הדרישות בין משלוחים על סמך ה-shipment_type שלהם. הפרטים הספציפיים של הדרישה מוגדרים לפי מצב הדרישה.
| שדות | |
|---|---|
required_shipment_type_alternatives[] |
רשימה של סוגי משלוחים חלופיים שנדרשים על ידי |
dependent_shipment_types[] |
בכל המשלוחים עם סוג בשדה הערה: אסור ליצור שרשראות של דרישות שבהן |
requirement_mode |
המצב שמוגדר לדרישה. |
RequirementMode
מצבים שמגדירים את המראה של משלוחים תלויים במסלול.
| טיפוסים בני מנייה (enum) | |
|---|---|
REQUIREMENT_MODE_UNSPECIFIED |
מצב דרישה לא מוגדר. אין להשתמש בערך הזה. |
PERFORMED_BY_SAME_VEHICLE |
במצב הזה, כל המשלוחים "התלויים" חייבים לחלוק את אותו רכב עם לפחות אחד מהמשלוחים "הנדרשים" שלהם. |
IN_SAME_VEHICLE_AT_PICKUP_TIME |
במצב לכן, איסוף משלוח "תלוי" חייב לכלול:
|
IN_SAME_VEHICLE_AT_DELIVERY_TIME |
כמו קודם, אבל המשלוחים "התלויים" צריכים להיות ברכב עם משלוח "נדרש" בזמן המסירה שלהם. |
SkippedShipment
מציין פרטים של משלוחים שלא בוצעו בפתרון. במקרים פשוטים, או אם אנחנו יכולים לזהות את הסיבה לדילוג, אנחנו מדווחים על הסיבה כאן.
| שדות | |
|---|---|
index |
האינדקס תואם לאינדקס של המשלוח במקור |
label |
עותק של |
reasons[] |
רשימת סיבות שמסבירות למה המערכת דילגה על המשלוח. אפשר לעיין בהערה שלמעלה |
penalty_cost |
זהו עותק של ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד. |
estimated_incompatible_vehicle_ratio |
היחס המשוער של כלי רכב שלא יכולים לבצע את המשלוח הזה בגלל אחת מהסיבות הבאות לפחות. הערה: השדה הזה מתמלא רק כשהסיבות קשורות לרכב. ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד. |
סיבה
אם אנחנו יכולים להסביר למה המשלוח לא נכלל, הסיבות יופיעו כאן. אם הסיבה לא זהה לכל הרכבים, 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 |
עיינו בהערות של הקוד. |
example_vehicle_indices[] |
כמו ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד. |
example_exceeded_capacity_type |
אם קוד הסיבה הוא |
example_vehicle_index |
אם הסיבה קשורה לאי-תאימות בין המשלוח לרכב, השדה הזה מספק את האינדקס של רכב רלוונטי אחד. |
קוד
קוד שמזהה את סוג הסיבה. הסדר כאן לא משנה. במיוחד, אין אינדיקציה אם סיבה מסוימת תופיע לפני סיבה אחרת בפתרון, אם שתיהן רלוונטיות.
| טיפוסים בני מנייה (enum) | |
|---|---|
CODE_UNSPECIFIED |
אין להשתמש בזה אף פעם. |
NO_VEHICLE |
אין רכב במודל, ולכן אי אפשר לבצע את כל המשלוחים. |
DEMAND_EXCEEDS_VEHICLE_CAPACITY |
הביקוש למשלוח חורג מהקיבולת של הרכב בחלק מסוגי הקיבולת, ואחד מהם הוא example_exceeded_capacity_type. |
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT |
המרחק המינימלי שנדרש כדי לבצע את המשלוח הזה, כלומר מ- שימו לב שבחישוב הזה אנחנו משתמשים במרחקים גיאודזיים. |
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT |
הזמן המינימלי שנדרש לביצוע המשלוח הזה, כולל זמן הנסיעה, זמן ההמתנה וזמן השירות, חורג מהערך הערה: זמן ההגעה מחושב לפי התרחיש הטוב ביותר, כלומר מרחק גיאודזי כפול 36 מטרים לשנייה (בערך 130 קמ"ש). |
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT |
כמו למעלה, אבל אנחנו משווים רק את זמן ההגעה המינימלי ואת travel_duration_limit של הרכב. |
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS |
הרכב לא יכול לבצע את המשלוח הזה בתרחיש הטוב ביותר (ראו CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT לחישוב הזמן) אם הוא מתחיל בשעת ההתחלה המוקדמת ביותר: הזמן הכולל יגרום לרכב לסיים אחרי שעת הסיום המאוחרת ביותר שלו. |
VEHICLE_NOT_ALLOWED |
השדה allowed_vehicle_indices של המשלוח לא ריק, והרכב הזה לא שייך אליו. |
VEHICLE_IGNORED |
השדה ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד. |
SHIPMENT_IGNORED |
השדה ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד. |
SKIPPED_IN_INJECTED_SOLUTION_CONSTRAINT |
המשלוח לא יתבצע ב ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד. |
VEHICLE_ROUTE_IS_FULLY_SEQUENCE_CONSTRAINED |
ההקלה במסלול הרכב שצוינה ב- ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד. |
ZERO_PENALTY_COST |
עלות הקנס של המשלוח היא אפס. האפשרות הזו יכולה להיות שימושית כבחירה מתקדמת של מודלים, אבל היא גם יכולה להסביר בדיעבד למה המערכת דילגה על משלוח מסוים. ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד. |
TimeWindow
חלונות זמן מגבילים את הזמן של אירוע, כמו זמן ההגעה לביקור, או שעת ההתחלה והסיום של רכב.
גבולות קשיחים של חלון הזמן, start_time ו-end_time, אוכפים את השעה המוקדמת ביותר והמאוחרת ביותר של האירוע, כך ש-start_time <= event_time <=
end_time. הגבול התחתון של חלון הזמן הגמיש, soft_start_time, מבטא העדפה שהאירוע יתרחש ב-soft_start_time או אחריו, על ידי גביית עלות פרופורציונלית למשך הזמן שבו האירוע מתרחש לפני soft_start_time. הגבול העליון של חלון הזמן הגמיש, soft_end_time, מבטא העדפה שהאירוע יתרחש ב-soft_end_time או לפני כן, על ידי צבירת עלות פרופורציונלית למשך הזמן שחלף אחרי soft_end_time עד שהאירוע התרחש. start_time, end_time, soft_start_time ו-soft_end_time צריכים להיות בטווח של מגבלות הזמן הגלובליות (ראו ShipmentModel.global_start_time ו-ShipmentModel.global_end_time) ולעמוד בתנאים הבאים:
0 <= `start_time` <= `end_time` and
0 <= `start_time` <= `soft_start_time` and
0 <= `soft_end_time` <= `end_time`.
| שדות | |
|---|---|
start_time |
שעת ההתחלה של חלון הזמן הקשיח. אם לא מציינים ערך, הוא מוגדר כ- |
end_time |
שעת הסיום של חלון הזמן הקשיח. אם לא מציינים ערך, הוא מוגדר כ- |
soft_start_time |
שעת ההתחלה הרכה של חלון הזמן. |
soft_end_time |
שעת הסיום הגמישה של חלון הזמן. |
cost_per_hour_before_soft_start_time |
עלות לשעה שמתווספת לעלויות אחרות במודל אם האירוע מתרחש לפני soft_start_time, ומחושבת כך: העלות הזו חייבת להיות חיובית, ואפשר להגדיר את השדה רק אם הוגדר soft_start_time. |
cost_per_hour_after_soft_end_time |
עלות לשעה שמתווספת לעלויות אחרות במודל אם האירוע מתרחש אחרי העלות הזו חייבת להיות חיובית, ואפשר להגדיר את השדה רק אם הוגדר |
TransitionAttributes
מציין מאפיינים של מעברים בין שני ביקורים רצופים במסלול. יכול להיות שכמה TransitionAttributes יחולו על אותו מעבר: במקרה כזה, כל העלויות הנוספות מצטברות והאילוץ או המגבלה המחמירים ביותר חלים (בהתאם לסמנטיקה הטבעית של "AND").
| שדות | |
|---|---|
src_tag |
תגים שמגדירים את קבוצת המעברים (src->dst) שהמאפיינים האלה חלים עליהם. ביקור במקור או התחלת נסיעה של רכב תואמים אם |
excluded_src_tag |
|
dst_tag |
ביקור ביעד או סיום מסלול של רכב תואמים אם ורק אם |
excluded_dst_tag |
|
cost |
מציין את העלות של ביצוע המעבר הזה. הערך הזה צריך להיות באותה יחידה כמו כל העלויות האחרות במודל, והוא לא יכול להיות שלילי. הוא מתווסף לכל העלויות הקיימות האחרות. |
cost_per_kilometer |
מציין עלות לקילומטר שחלה על המרחק שנעשה במהלך המעבר הזה. הוא מצטבר לכל |
distance_limit |
מציינת מגבלה על המרחק שעוברים במהלך המעבר הזה. נכון ליוני 2021, יש תמיכה רק במגבלות גמישות. |
delay |
מציין את העיכוב שנגרם כשמבצעים את המעבר הזה. העיכוב הזה תמיד מתרחש אחרי סיום הביקור בנקודת המוצא ולפני תחילת הביקור בנקודת היעד. |
אורי
מזהה משאבים אחיד (URI) שמפנה למשאב ש-Route Optimization API יכול לקרוא ולכתוב.
| שדות | |
|---|---|
uri |
ה-URI של המשאב. יכול להיות שהמשאב עדיין לא קיים. התוכן של המשאב מקודד כ-JSON או כ-textproto. יש תמיכה רק במשאבים של Google Cloud Storage. אם המשאב מקודד כ-JSON, שם המשאב חייב להסתיים ב- |
כלי רכב
מודל של רכב בבעיית משלוח. פתרון בעיה במשלוח יבנה מסלול שמתחיל ב-start_location ומסתיים ב-end_location לרכב הזה. מסלול הוא רצף של ביקורים (ראו ShipmentRoute).
| שדות | |
|---|---|
display_name |
השם שהמשתמש הגדיר לתצוגה של הרכב. הוא יכול להכיל עד 63 תווים, כולל תווים בפורמט UTF-8. |
travel_mode |
אופן הנסיעה שמשפיע על הכבישים שבהם הרכב יכול להשתמש ועל המהירות שלו. מידע נוסף מופיע ב- |
route_modifiers |
קבוצת תנאים שמשפיעים על אופן חישוב המסלולים של הרכב הנתון. |
start_location |
המיקום הגיאוגרפי שבו הרכב מתחיל את הנסיעה לפני שהוא אוסף משלוחים. אם לא מציינים את המיקום, הרכב מתחיל באיסוף הראשון שלו. אם למודל המשלוח יש מטריצות של משך זמן ומטריצת מרחקים, אסור לציין את |
start_waypoint |
נקודת ציון שמייצגת מיקום גיאוגרפי שבו הרכב מתחיל לפני איסוף המשלוחים. אם לא מציינים את |
end_location |
המיקום הגיאוגרפי שבו הרכב מסיים את הנסיעה אחרי שהשלים את ה- |
end_waypoint |
נקודת עצירה שמייצגת מיקום גיאוגרפי שבו הרכב מסיים את הנסיעה אחרי שהשלים את ה- |
start_tags[] |
מציין תגים שמצורפים לתחילת המסלול של הרכב. אסור להשתמש במחרוזות ריקות או כפולות. |
end_tags[] |
מציין תגים שמצורפים לסוף המסלול של הרכב. אסור להשתמש במחרוזות ריקות או כפולות. |
start_time_windows[] |
חלונות זמן שבהם הרכב יכול לצאת ממיקום ההתחלה שלו. הם חייבים להיות בטווח הזמן הגלובלי (ראו שדות חלונות זמן ששייכים לאותו שדה חוזר חייבים להיות נפרדים, כלומר אסור שחלון זמן כלשהו יחפוף לחלון זמן אחר או יהיה סמוך אליו, והם חייבים להיות בסדר כרונולוגי. אפשר להגדיר את |
end_time_windows[] |
חלונות זמן שבהם הרכב יכול להגיע למיקום הסופי שלו. הם חייבים להיות בטווח הזמן הגלובלי (ראו שדות חלונות זמן ששייכים לאותו שדה חוזר חייבים להיות נפרדים, כלומר אסור שחלון זמן כלשהו יחפוף לחלון זמן אחר או יהיה סמוך אליו, והם חייבים להיות בסדר כרונולוגי. אפשר להגדיר את |
unloading_policy |
מדיניות הפריקה שנאכפת ברכב. |
load_limits |
קיבולת הרכב (למשל: משקל, נפח, מספר משטחים). המפתחות במפה הם המזהים של סוג העומס, בהתאם למפתחות של השדה |
cost_per_hour |
עלויות הרכב: כל העלויות מצטברות וצריכות להיות באותה יחידה כמו העלות לשעה של מסלול הרכב. העלות הזו חלה על משך הזמן הכולל של המסלול, וכוללת את זמן הנסיעה, זמן ההמתנה וזמן הביקור. שימוש ב- |
cost_per_traveled_hour |
עלות לכל שעת נסיעה במסלול של הרכב. העלות הזו חלה רק על זמן ההגעה במסלול (כלומר, הזמן שדווח בשדה |
cost_per_kilometer |
עלות לקילומטר של מסלול הרכב. העלות הזו חלה על המרחק שמדווח ב- |
fixed_cost |
עלות קבועה שחלה אם משתמשים ברכב הזה לטיפול במשלוח. |
used_if_route_is_empty |
השדה הזה רלוונטי רק לכלי רכב שהמסלול שלהם לא כולל משלוחים. הוא מציין אם הרכב נחשב כמשומש או לא במקרה הזה. אם הערך הוא true, הרכב עובר ממיקום ההתחלה למיקום הסיום גם אם הוא לא מבצע משלוחים, ועלויות הזמן והמרחק שנובעות מהנסיעה ממיקום ההתחלה למיקום הסיום נלקחות בחשבון. אחרת, הוא לא נוסע ממיקום ההתחלה למיקום הסיום, ולא מתוזמנים לרכב הזה |
route_duration_limit |
מגבלה שחלה על משך הזמן הכולל של מסלול הרכב. ב |
travel_duration_limit |
מגבלה שחלה על משך הנסיעה במסלול של הרכב. ב |
route_distance_limit |
מגבלה שחלה על המרחק הכולל של מסלול הרכב. ב- |
extra_visit_duration_for_visit_type |
מציין מיפוי של מחרוזות visit_types למשכי זמן. משך הזמן הוא הזמן שצריך להוסיף ל- אם לבקשת ביקור יש כמה סוגים, משך זמן יתווסף לכל סוג במפה. |
break_rule |
מתאר את לוח הזמנים של ההפסקות שצריך לאכוף ברכב הזה. אם השדה ריק, לא יתוזמנו הפסקות לרכב הזה. |
label |
מציין תווית לרכב הזה. התווית הזו מדווחת בתגובה בתור |
ignore |
אם הערך הוא True, הערך של אם משלוח מתבצע על ידי רכב שמתעלמים ממנו ב- אם משלוח מתבצע על ידי רכב שמתעלמים ממנו ב- |
travel_duration_multiple |
מציין גורם כפל שאפשר להשתמש בו כדי להגדיל או להקטין את זמני הנסיעה של הרכב הזה. לדוגמה, אם מגדירים את הערך 2.0, הרכב איטי יותר וזמני ההגעה שלו ארוכים פי 2 מאלה של רכבים רגילים. הכפולה הזו לא משפיעה על משך הביקור. היא משפיעה על העלות אם מציינים את אזהרה: זמני ההגעה יעוגלו לשנייה הקרובה ביותר אחרי החלת המכפיל הזה, אבל לפני ביצוע פעולות מספריות כלשהן. לכן, מכפיל קטן עלול לגרום לאובדן הדיוק. מידע נוסף מופיע בקטע |
DurationLimit
מגבלה שמגדירה את משך הזמן המקסימלי של מסלול הרכב. הוא יכול להיות קשיח או רך.
כשמגדירים שדה של מגבלה גמישה, צריך להגדיר גם את הסף המקסימלי הגמיש וגם את העלות שמשויכת אליו.
| שדות | |
|---|---|
max_duration |
מגבלה קשיחה שמגבילה את משך הזמן ל-max_duration לכל היותר. |
soft_max_duration |
מגבלה גמישה שלא אוכפת מגבלה על משך הזמן המקסימלי, אבל אם חורגים ממנה, המסלול כרוך בעלות. העלות הזו מתווספת לעלויות אחרות שמוגדרות במודל, באותה יחידה. אם מגדירים את |
quadratic_soft_max_duration |
מגבלה גמישה שלא אוכפת מגבלת משך מקסימלי, אבל אם חורגים ממנה, המסלול כרוך בעלות ריבועית ביחס למשך. העלות הזו מתווספת לעלויות אחרות שמוגדרות במודל, באותה יחידה. אם השדה
|
cost_per_hour_after_soft_max |
העלות לשעה שנגבית אם חורגים מהסף של העלות לא יכולה להיות שלילית. |
cost_per_square_hour_after_quadratic_soft_max |
העלות לשעה בריבוע שנגבית אם חורגים מהסף של העלות הנוספת היא 0 אם משך הזמן קצר מהסף, אחרת העלות תלויה במשך הזמן באופן הבא: העלות לא יכולה להיות שלילית. |
LoadLimit
מגדיר את מגבלת העומס שחלה על רכב, למשל "המשאית הזו יכולה לשאת עד 3,500 ק"ג". load_limits.
| שדות | |
|---|---|
soft_max_load |
מגבלה רכה של העומס. |
cost_per_unit_above_soft_max |
אם העומס חורג מ- |
start_load_interval |
מרווח העומס הקביל של הרכב בתחילת המסלול. |
end_load_interval |
מרווח העומס הקביל של הרכב בסוף המסלול. |
max_load |
העומס המקסימלי המותר. |
cost_per_kilometer |
עלות ההעברה של יחידת מטען אחת לאורך קילומטר אחד ברכב הזה. אפשר להשתמש בזה כערך חלופי לצריכת דלק: אם העומס הוא משקל (בניוטונים), אז עומס*קילומטר הוא המימד של האנרגיה. ניסיוני: פרטים נוספים זמינים בכתובת https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request. |
cost_per_traveled_hour |
עלות הנסיעה עם יחידת עומס במשך שעה אחת ברכב הזה. ניסיוני: פרטים נוספים זמינים בכתובת https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request. |
מרווח
מרווח של סכומי טעינה קבילים.
| שדות | |
|---|---|
min |
עומס מינימלי קביל. הערך חייב להיות גדול מ-0 או שווה לו. אם שניהם צוינו, הערך של |
max |
עומס מקסימלי מקובל. הערך חייב להיות גדול מ-0 או שווה לו. אם לא מציינים ערך, העומס המקסימלי לא מוגבל על ידי ההודעה הזו. אם שניהם צוינו, הערך של |
LoadCost
עלות ההעברה של יחידת עומס אחת במהלך Transition. העלות של עומס נתון היא הסכום של שני חלקים:
- min(load,
load_threshold) *cost_per_unit_below_threshold - max(0, load -
load_threshold) *cost_per_unit_above_threshold
עם העלות הזו, הפתרונות מעדיפים לספק קודם את הביקושים הגבוהים, או באופן שווה ערך לאסוף את הביקושים הגבוהים אחרונים. לדוגמה, אם לרכב יש
load_limit {
key: "weight"
value {
cost_per_kilometer {
load_threshold: 15
cost_per_unit_below_threshold: 2.0
cost_per_unit_above_threshold: 10.0
}
}
}
והמסלול שלו הוא: התחלה, איסוף, איסוף, מסירה, מסירה, סיום, עם המעברים הבאים:
transition { vehicle_load['weight'] { amount: 0 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 20 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
travel_distance_meters: 1000.0 }
אז העלות של LoadCost היא (cost_below * load_below * kilometers + cost_above * load_above * kms)
- מעבר 0: 0.0
- מעבר 1: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
- מעבר 2: 2.0 * 15 * 1.0 + 10.0 * (20 - 15) * 1.0 = 80.0
- מעבר 3: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
- מעבר 4: 0.0
לכן, הערך של LoadCost במסלול הוא 120.0.
עם זאת, אם המסלול הוא התחלה,איסוף,מסירה,איסוף,מסירה,סיום עם מעברים:
transition { vehicle_load['weight'] { amount: 0 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
travel_distance_meters: 1000.0 }
אז העלות שנוצרה על ידי LoadCost היא
- מעבר 0: 0.0
- מעבר 1: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
- מעבר 2: 0.0
- מעבר 3: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
- מעבר 4: 0.0
כאן הערך של LoadCost במסלול הוא 40.0.
LoadCost מייקרת פתרונות עם מעברים עמוסים.
ניסיוני: פרטים נוספים זמינים בכתובת https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.
| שדות | |
|---|---|
load_threshold |
כמות העומס שמעליה העלות של העברת יחידת עומס משתנה מ-cost_per_unit_below_threshold ל-cost_per_unit_above_threshold. הערך חייב להיות גדול מ-0 או שווה לו. |
cost_per_unit_below_threshold |
העלות של העברת יחידת עומס, לכל יחידה בין 0 לערך הסף. הערך חייב להיות סופי וגדול מ-0 או שווה לו. |
cost_per_unit_above_threshold |
עלות ההעברה של יחידת עומס, לכל יחידה מעל הסף. במקרה המיוחד שבו הסף = 0, זו עלות קבועה ליחידה. הערך חייב להיות סופי וגדול מ-0 או שווה לו. |
TravelMode
אמצעי תחבורה שמתאימים לכלי רכב.
אלה צריכים להיות קבוצת משנה של אמצעי התחבורה של Google Maps Platform Routes API, ראו: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteTravelMode
הערה: מסלולי WALKING נמצאים בגרסת בטא, ולפעמים חסרות בהם מדרכות או דרכים להולכי רגל. חובה להציג את האזהרה הזו למשתמש בכל מסלולי ההליכה שמוצגים באפליקציה.
| טיפוסים בני מנייה (enum) | |
|---|---|
TRAVEL_MODE_UNSPECIFIED |
אמצעי הגעה לא מוגדר, שווה ערך ל-DRIVING. |
DRIVING |
אמצעי הגעה שתואם למסלול הנסיעה (רכב, ...). |
WALKING |
אמצעי הגעה שתואם למסלול הליכה. |
UnloadingPolicy
המדיניות לגבי פריקת רכב. רלוונטי רק למשלוחים שכוללים גם איסוף וגם מסירה.
משלוחים אחרים יכולים להתבצע בכל מקום במסלול, בלי קשר ל-unloading_policy.
| טיפוסים בני מנייה (enum) | |
|---|---|
UNLOADING_POLICY_UNSPECIFIED |
מדיניות פריקה לא מוגדרת. המשלוחים צריכים להתבצע אחרי האיסופים התואמים שלהם. |
LAST_IN_FIRST_OUT |
המשלוחים צריכים להתבצע בסדר הפוך מהאיסופים |
FIRST_IN_FIRST_OUT |
המשלוחים חייבים להתבצע באותו סדר כמו האיסופים |
VehicleFullness
VehicleFullness הוא מדד שמחשב את מידת העומס של הרכב. כל שדה VehicleFullness הוא בין 0 ל-1, ומחושב כיחס בין שדה מדד מוגבל (למשל AggregatedMetrics.travel_distance_meters) לבין מגבלת הרכב הקשורה (למשל Vehicle.route_distance_limit), אם היא קיימת. אחרת, יחס התפוסה לא יוגדר. אם המגבלה היא 0, השדה מוגדר ל-1. הערה: כשמסלול כפוף למגבלות תנועה, חלק מהיחסים הגולמיים של התפוסה עשויים להיות גבוהים מ-1.0, למשל הרכב עשוי לחרוג ממגבלת המרחק שלו. במקרים כאלה, אנחנו מגבילים את ערכי התפוסה ל-1.0.
| שדות | |
|---|---|
max_fullness |
הערך המקסימלי של כל שאר השדות בהודעה הזו. |
distance |
היחס בין |
travel_duration |
היחס בין [AggregatedMetrics.travel_duration_seconds][] לבין |
active_duration |
היחס בין [AggregatedMetrics.total_duration_seconds][] לבין |
max_load |
היחס המקסימלי בין כל הסוגים של [AggregatedMetrics.max_load][] לבין |
active_span |
היחס (vehicle_end_time - vehicle_start_time) / (latest_vehicle_end_time - earliest_vehicle_start_time) של רכב נתון. אם המכנה לא קיים, הפונקציה משתמשת במקום זאת ב-( |
נקודת ציון
מכיל נקודת דרך. נקודות ציון מסמנות את מיקומי ההגעה והיציאה של VisitRequests, ואת מיקומי ההתחלה והסיום של כלי הרכב.
| שדות | |
|---|---|
side_of_road |
אופציונלי. מציין שהמיקום של נקודת הדרך הזו נועד להעדפה שהרכב יעצור בצד מסוים של הכביש. כשמגדירים את הערך הזה, המסלול יעבור דרך המיקום כך שהרכב יוכל לעצור בצד הכביש שהמיקום נוטה אליו ממרכז הכביש. האפשרות הזו לא פועלת במצב הנסיעה WALKING. |
vehicle_stopover |
מציין שהרכב אמור לעצור בציון הדרך כדי לאסוף או להוריד נוסעים. האפשרות הזו פועלת רק במצב הנסיעה "נהיגה" וכשהערך של location_type הוא location. ניסיוני: ההתנהגות או הקיום של השדה הזה עשויים להשתנות בעתיד. |
שדה של איחוד location_type. דרכים שונות לייצג מיקום. הערך location_type יכול להיות רק אחד מהבאים: |
|
location |
נקודה שצוינה באמצעות קואורדינטות גיאוגרפיות, כולל כיוון אופציונלי. |
place_id |
מזהה המקום של נקודת העניין שמשויך לציון הדרך. כשמשתמשים במזהה מקום כדי לציין את מיקום ההגעה או היציאה של VisitRequest, צריך להשתמש במזהה מקום ספציפי מספיק כדי לקבוע מיקום LatLng לניווט למקום. לדוגמה, מזהה מקום שמייצג בניין מתאים, אבל לא מומלץ להשתמש במזהה מקום שמייצג כביש. |