Method: projects.locations.optimizeTours

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

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

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

בקשת HTTP

POST https://routeoptimization.googleapis.com/v1/{parent=projects/*/locations/*}:optimizeTours

כתובת ה-URL משתמשת בתחביר של Transcoding של gRPC.

פרמטרים של נתיב

פרמטרים
parent

string

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

פורמט: * projects/{project-id} * projects/{project-id}/locations/{location-id}

אם לא תציינו מיקום, ייבחר אזור באופן אוטומטי.

גוף הבקשה

גוף הבקשה מכיל נתונים במבנה הבא:

ייצוג ב-JSON
{
  "timeout": string,
  "model": {
    object (ShipmentModel)
  },
  "solvingMode": enum (SolvingMode),
  "searchMode": enum (SearchMode),
  "injectedFirstSolutionRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "injectedSolutionConstraint": {
    object (InjectedSolutionConstraint)
  },
  "refreshDetailsRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "interpretInjectedSolutionsUsingLabels": boolean,
  "considerRoadTraffic": boolean,
  "populatePolylines": boolean,
  "populateTransitionPolylines": boolean,
  "allowLargeDeadlineDespiteInterruptionRisk": boolean,
  "useGeodesicDistances": boolean,
  "label": string,
  "geodesicMetersPerSecond": number,
  "maxValidationErrors": integer
}
שדות
timeout

string (Duration format)

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

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

משך הזמן בשניות, עם עד תשע ספרות עשרוניות, שמסתיימים ב-'s'. דוגמה: "3.5s".

model

object (ShipmentModel)

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

solvingMode

enum (SolvingMode)

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

searchMode

enum (SearchMode)

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

injectedFirstSolutionRoutes[]

object (ShipmentRoute)

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

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

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

  • לכל המסלולים, הערך של vehicleIndex חייב להיות בטווח ולא כפול.
  • לכל הביקורים, הערכים של shipmentIndex ו-visitRequestIndex חייבים להיות בטווח.
  • אפשר להפנות למשלוח רק במסלול אחד.
  • איסוף עצמי צריך להתבצע לפני מועד המסירה.
  • לא ניתן לבצע יותר מאפשרות אחת לאיסוף או למשלוח של משלוח.
  • בכל המסלולים, משך הזמן גדל (כלומר vehicleStartTime <= visits[0].start_time <= visits[1].start_time ... <= vehicleEndTime).
  • אפשר לבצע משלוח רק ברכב מורשה. מותר להשתמש ברכב אם השדה Shipment.allowed_vehicle_indices ריק או שהשדה vehicleIndex שלו נכלל בשדה Shipment.allowed_vehicle_indices.

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

injectedSolutionConstraint

object (InjectedSolutionConstraint)

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

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

refreshDetailsRoutes[]

object (ShipmentRoute)

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

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

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

אין להשתמש בשדה הזה יחד עם injectedFirstSolutionRoutes או injectedSolutionConstraint.

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

interpretInjectedSolutionsUsingLabels

boolean

אם הערך הוא True:

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

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

אם vehicleLabel בפתרון שהוחדר לא מתאים לרכב בקשה, המסלול המתאים יוסר מהפתרון יחד עם הביקורים שלו. אם shipmentLabel בפתרון שהוחדר לא מתאים לבקשת משלוח, הביקור המתאים יוסר מהפתרון. אם SkippedShipment.label בפתרון שהוחדר לא מתאים לבקשה למשלוח, SkippedShipment יוסר מהתמיסה.

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

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

considerRoadTraffic

boolean

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

populatePolylines

boolean

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

populateTransitionPolylines

boolean

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

allowLargeDeadlineDespiteInterruptionRisk

boolean

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

useGeodesicDistances

boolean

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

label

string

תווית שעשויה לשמש לזיהוי הבקשה הזו, שתדווח ב-OptimizeToursResponse.request_label.

geodesicMetersPerSecond

number

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

maxValidationErrors

integer

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

גוף התשובה

אם הפעולה מצליחה, גוף התגובה מכיל מופע של OptimizeToursResponse.

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

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

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

הרשאות IAM

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

  • routeoptimization.locations.use

למידע נוסף, עיינו במסמכי העזרה של IAM.