יצירת הבקשה הראשונה לאופטימיזציה של המסלול

מפתחים באזור הכלכלי האירופי (EEA)

במאמר הזה נסביר איך לשלוח את הבקשה הראשונה ל-Route Optimization API באמצעות תרחיש לדוגמה מהעולם האמיתי.

כדי לפשט את הדברים, בדוגמה נעשה שימוש ב-HTTP וב-JSON כדי להדגים את API בארכיטקטורת REST. עם זאת, בסביבת הייצור מומלץ להשתמש ב-gRPC בגלל יתרונות הביצועים שלו. עם זאת, צריך להתקין את gRPC. מידע נוסף זמין במאמר ספריות הלקוח של Route Optimization API.

תרחיש

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

אתם מנהלים מעון יום לכלבים בסן פרנסיסקו, שפועל בין השעות 7:00 ל-19:00. הבוקר אתם צריכים לאסוף שני כלבים ממקומות שונים בעיר. שני בעלי הכלבים נתנו לך חלון איסוף בין 7:30 ל-9:30.

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

היום הוא 13 בפברואר 2024, ולנהג יש את המשימות הבאות:

  • מרימים את כלב ההרים הברניזי ליד מגדל קויט.
  • אוספים את הצ'יוואווה בפארק South Sunset Playground.
  • תוריד את שני הכלבים במעון לכלבים ב-Mission Dolores Park.

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

לפני שמתחילים

כדי להריץ את הקוד בתרחיש לדוגמה, קודם צריך לבצע את ההוראות במאמר הגדרת Route Optimization API.

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

ל-Route Optimization API יש כמה שיטות שתוכלו לבחור מביניהן, בהתאם למורכבות של בעיית האופטימיזציה.

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

כדי לשלוח בקשת HTTP POST ל-method‏ optimizeTours, משתמשים בכתובת ה-URL הבאה:

https://routeoptimization.googleapis.com/v1/projects/PROJECT_OR_ID:optimizeTours

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

  • מגדירים את הפרמטר timeout ל-2 שניות.
  • משאירים את הגדרות הדדליין כברירת מחדל, שהיא 60 שניות לבקשות REST.

2. יצירת גוף ההודעה של הבקשה

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

בתרחיש הזה, הבקשה היא הודעת OptimizeToursRequest שמקודדת כ-JSON ב-API בארכיטקטורת REST.

כדי ליצור את הודעת הבקשה, פועלים לפי השלבים הבאים:

  1. מתחילים במבנה הבסיסי של הבקשה, שמופיע בהמשך:

    {
      "timeout": ...,
      "model": {
        "shipments": [...],
        "vehicles": [...],
        "globalStartTime": "...",
        "globalEndTime": "..."
      }
    }
    

    למידע נוסף על המבנה, עיינו במדריך למושגי מפתח בנושא מבנה בסיסי (ShipmentModel,‏ Shipment ו-Vehicle).

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

    1. לכל כלב, יוצרים VisitRequest לאיסוף ו- נוסף למשלוח, שבמקרה הזה הוא הורדה במעון.

      • באיסופים, מגדירים את arrivalWaypoint למיקום האיסוף של הכלב (Coit Tower לכלב ההרים הברנזי או South Sunset Playground Park לצ'יוואווה) ואת timeWindows לשעת האיסוף שביקש הבעלים (7:30 עד 9:30).

      • בקטע 'משלוחים', מגדירים את arrivalWaypoint למרכז הטיפול ואת timeWindows לשעת המסירה הנדרשת (9:30 עד 11:30).

      מידע נוסף על חלונות זמן זמין במאמר בנושא חלונות זמן.

    2. אפשר להשתמש בשדה label כדי להוסיף מזהה לכל משלוח, כמו 'כלב הרים ברני' ו'צ'יוואווה'. כך תוכלו לזהות את המשלוחים בתגובה.

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

  3. הגדרת כלי רכב. בשדה vehicles, מוסיפים הודעה Vehicle לגבי הטנדר היחיד, עם מרכז הטיפול כנקודת התחלה וסיום, עלות השכר של הנהג ושעות הפעילות של הטנדר.

    1. מגדירים את startWaypoint ואת endWaypoint של הרכב למיקומי ההתחלה והסיום של היום, שהם מעון היום ליד פארק מיסיון דולורס.

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

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

    מידע נוסף על הגדרת כלי רכב זמין במאמר כלי רכב.

  4. הגדרת חלון זמן גלובלי. חלון הזמן הגלובלי מייצג את מסגרת הזמן שבה הרכב יכול לבצע איסופים והורדות של ילדים במעון במהלך היום. בתרחיש הזה, מגדירים את globalStartTime ל-7:00 ואת globalEndTime ל-19:00 ב-13 בפברואר 2024, שעות הפעילות של המקום.

3. שליחת הבקשה

הבקשה הפשוטה הבאה curl מבוססת על התרחיש של מעון היום לכלבים ומשתמשת בשיטת החסימה optimizeTours.

לפני ששולחים את הבקשה, מחליפים את PROJECT_NUMBER_OR_ID בקוד לדוגמה במזהה הפרויקט ב-Google Cloud.

curl -X POST 'https://routeoptimization.googleapis.com/v1/projects/PROJECT_NUMBER_OR_ID:optimizeTours' \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
--data @- << EOM
{
  "timeout": "2s",
  "model": {
    "shipments": [
      {
        "pickups": [
          {
            "arrivalWaypoint": {
              "location": {
                "latLng": {
                  "latitude": 37.802395,
                  "longitude": -122.405822
                }
              }
            },
            "timeWindows": [
              {
                "startTime": "2024-02-13T07:30:00Z",
                "endTime": "2024-02-13T09:30:00Z"
              }
            ]
          }
        ],
        "deliveries": [
          {
            "arrivalWaypoint": {
              "location": {
                "latLng": {
                  "latitude": 37.760202,
                  "longitude": -122.426796
                }
              }
            },
            "timeWindows": [
              {
                "startTime": "2024-02-13T09:30:00Z",
                "endTime": "2024-02-13T11:30:00Z"
              }
            ]
          }
        ],
        "label": "Bernese mountain dog"
      },
      {
        "pickups": [
          {
            "arrivalWaypoint": {
              "location": {
                "latLng": {
                  "latitude": 37.738067,
                  "longitude": -122.498593
                }
              }
            },
            "timeWindows": [
              {
                "startTime": "2024-02-13T07:30:00Z",
                "endTime": "2024-02-13T09:30:00Z"
              }
            ]
          }
        ],
        "deliveries": [
          {
            "arrivalWaypoint": {
              "location": {
                "latLng": {
                  "latitude": 37.760202,
                  "longitude": -122.426796
                }
              }
            },
            "timeWindows": [
              {
                "startTime": "2024-02-13T09:30:00Z",
                "endTime": "2024-02-13T11:30:00Z"
              }
            ]
          }
        ],
        "label": "Chihuahua"
      }
    ],
    "vehicles": [
      {
        "startWaypoint": {
          "location": {
            "latLng": {
              "latitude": 37.760202,
              "longitude": -122.426796
            }
          }
        },
        "endWaypoint": {
          "location": {
            "latLng": {
              "latitude": 37.760202,
              "longitude": -122.426796
            }
          }
        },
        "costPerHour": 27,
        "startTimeWindows": [
          {
            "startTime": "2024-02-13T07:00:00Z",
            "endTime": "2024-02-13T07:15:00Z"
          }
        ],
        "endTimeWindows": [
          {
            "startTime": "2024-02-13T11:45:00Z",
            "endTime": "2024-02-13T12:00:00Z"
          }
        ]
      }
    ],
    "globalStartTime": "2024-02-13T07:00:00Z",
    "globalEndTime": "2024-02-13T19:00:00Z"
  }
}
EOM

פרמטרים של בקשה שנעשה בהם שימוש בבקשה

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

הורה פרמטר סוג הנכס תיאור
OptimizeToursRequest model אובייקט (ShipmentModel) זהו עיקר הבקשה שלך. זהו אובייקט יחיד שבו מגדירים את כל הבעיה, כולל כל הכלבים שצריך לאסוף ולהחזיר (shipments) ואת הטנדר בצי הרכבים (vehicles). אפשר לחשוב על זה כעל תוכנית מלאה לבעיה שצריך לבצע אופטימיזציה שלה.
timeout משך הפרמטר הזה מציין את משך הזמן המקסימלי שהשרת עובד על בקשה לפני שהוא מחזיר תשובה. כדאי להשתמש בפרמטר הזה כדי לקצר את זמן ההמתנה. לגבי בקשות קטנות ומהירות, כמו התרחיש הזה של מעון יום לכלבים, מגדירים את הערך הזה ל-2 שניות.
ShipmentModel shipments[] מערך של אובייקטים (Shipment) זהו מערך של אובייקטים שבו כל אובייקט מייצג כלב שצריך לאסוף או להוריד.
vehicles[] מערך של אובייקטים (Vehicle) זהו מערך של אובייקטים שבו כל אובייקט מגדיר רכב בצי שלכם. כאן מתארים את המשאבים, כמו הרכב שאוסף ומוריד את הנוסעים. כדי לקבל מסלול אופטימלי, צריך להגדיר לפחות רכב אחד.
globalStartTime חותמת זמן זה הזמן המוקדם ביותר שבו אירוע כלשהו יכול להתרחש במודל כולו. הפרמטר הזה מצמצם את בעיית האופטימיזציה בזמן, וזה חיוני לחישובים מדויקים של תנועה ומסלולים. בתרחיש הזה של מעון הכלבים, מגדירים את השעה המוקדמת ביותר שבה הנהג יכול להפעיל את הרכב באותו יום, שהיא 7:00 ב-13 בפברואר 2024.
globalEndTime חותמת זמן זהו הזמן המאוחר ביותר האפשרי להתרחשות של אירוע כלשהו במודל כולו. בתרחיש של מעון הכלבים, מגדירים את השעה שבה המסחרית צפויה לסיים את הפעילות, כלומר 19:00 ב-13 בפברואר 2024.
Shipment pickups[] מערך של אובייקטים (VisitRequest) זו רשימה של כל אפשרויות האיסוף האפשריות של המשלוח. הכלי לאופטימיזציה בוחר את המודל הכי מתאים לפתרון הבעיה. בתרחיש הזה של גן כלבים, צריך לציין את מיקומי האיסוף ואת חלונות הזמן שכל בעלים סיפק לכל כלב.
deliveries[] מערך של אובייקטים (VisitRequest) זו רשימה של כל אפשרויות המסירה של המשלוח. הכלי לאופטימיזציה בוחר את המודל הכי מתאים לפתרון הבעיה. בתרחיש הזה של מעון יום לכלבים, צריך לציין את המיקום של המעון ואת חלון הזמנים שבו הנהג צריך להחזיר כל כלב לארוחת צהריים.
label מחרוזת זהו מזהה של משלוח ספציפי בבקשה שלכם. אתם יכולים לציין תוויות בבקשה כדי שהתשובה תהיה קלה יותר לקריאה. בתרחיש הזה של מעון לכלבים, משתמשים במחרוזת תיאורית כמו "צ'יוואווה", "כלב הרים ברנזי" או שם הכלב כדי להתאים את הפתרון לקלט כשמקבלים את התגובה מה-API.
VisitRequest arrivalWaypoint[] אובייקט (Waypoint) זהו המיקום של ביקור ספציפי במסלול. אפשר להגדיר את זה באמצעות קואורדינטות של קו אורך וקו רוחב, מזהה מקום או כיוון. בתרחיש הזה של מעון יום לכלבים, צריך להגדיר את המיקום שסופק על ידי הבעלים בשביל pickups ואת הכתובת של מעון היום בשביל deliveries.
timeWindows[] מערך של אובייקטים (TimeWindow) זהו מערך של אובייקטים שמגדירים את מגבלות הזמן לאיסוף או למשלוח. בתרחיש הזה, נשתמש בזה כדי להגדיר את חלון האיסוף של כל אחד מהכלבים ואת החלון המקובל להורדת הכלבים במעון.
Vehicle startWaypoint[] אובייקט (Waypoint) זהו מיקום ההתחלה של מסלול הרכב, שמוגדר באמצעות קואורדינטות של קו רוחב וקו אורך או מזהה מקום. הפרמטר הזה מציין לכלי האופטימיזציה איפה הרכב צריך להתחיל את המסלול. אם לא מגדירים את נקודת הדרך הזו, הכלי לאופטימיזציה בוחר באחת מנקודות האיסוף או המסירה כמיקום ההתחלה. בתרחיש הזה של משמורת כלבים, הנהג מתחיל את היום במתקן של משמורת הכלבים, ולכן משתמשים בקואורדינטות של פארק מישן דולורס.
endWaypoint[] אובייקט (Waypoint) זהו היעד הסופי של מסלול הרכב, שמוגדר באמצעות קואורדינטות של קו רוחב וקו אורך או מזהה מקום. הפרמטר הזה מציין לכלי האופטימיזציה איפה הרכב צריך לסיים את המסלול. אם לא מגדירים את נקודת הדרך הזו, כלי האופטימיזציה בוחר באחד מהאיסופים או המשלוחים כסוף המסלול. בתרחיש הזה של מעון הכלבים, הנהג צריך לסיים את היום במעון, ולכן צריך להשתמש בקואורדינטות של Mission Dolores Park.
costPerHour number העלות הזו היא העלות שנוצרת על כל שעה שבה נעשה שימוש ברכב, בלי קשר אם הוא נוסע או שהוא במצב עצירה. בתרחיש הזה של מעון יום לכלבים, משתמשים בזה כדי ליצור מודל של שכר שעתי לנהג.
startTimeWindows[] מערך של אובייקטים (TimeWindow) זהו חלון הזמנים המקובל שבו הנהג יכול להתחיל לנסוע ברכב המסחרי כדי לאסוף את הכלבים בבוקר.
endTimeWindows[] מערך של אובייקטים (TimeWindow) זהו חלון הזמנים המקובל שבו הנהג צריך לסיים את הנסיעה ברכב המסחרי ולחנות בחזרה במעון הכלבים.

הבא

פירוש התשובה