בדף הזה מתואר תהליך התכנון של מסלול באמצעות Route Optimization API, החל מזיהוי צורכי הניתוב ועד ליצירת תוכנית מסלול משולבת במערכת.
כשפועלים לפי השלבים של תוכנית המסלול, אפשר להשיג את המטרות הבאות:
- מיפוי פעולות הצי: תרגום של הצי הפיזי, אילוצים מורכבים ויעדים עסקיים לקוד עבור ה-API.
- אופטימיזציה של תוכניות נסיעה לעסק: הסבר על שיפור תוכנית הנסיעה כדי לעמוד ביעדים ולשפר את הפעילות העסקית היומיומית.
- פריסה בסביבת הייצור: הטמעת תוכנית המסלולים על ידי הכללתה בפעולות היומיומיות.
התרשים הבא מציג את מחזור החיים של תוכנית מסלול.
שלב ההטמעה של תוכנית מסלולים מתרחש כשמשלבים את ה-API בפעם הראשונה או כשדרישות העסק משתנות באופן משמעותי. היא כוללת את שלבים 1 עד 5.
בשלב התפעול היומיומי יש פחות עבודה, והשיפורים מינימליים. הוא כולל את שלבים 2 עד 4.
שלבי החיים של מסלול הם:
- מגדירים את היקף הבעיה: כדאי לזהות ולארגן את המטרות, המשאבים, המשימות והמגבלות כדי לקבל תמונה מלאה של הפעולות לפני שמתחילים להשתמש ב-API.
- מיפוי הנתונים: מתרגמים את המציאות העסקית לפרמטרים של API כדי שתוכנית המסלול תשקף את אופן הפעולה של צי הרכב.
- יצירת בקשה וקבלת תוכנית מסלול: מזינים את הנתונים ב-API ומקבלים תוכנית מסלול אופטימלית.
- משפרים את תוכנית המסלול: בודקים את תוכנית המסלול ומשפרים אותה על ידי התאמת האילוצים והיעדים כדי לוודא שהיא עונה על כל הצרכים.
- שילוב תוכנית המסלול: קישור תוכנית המסלול למערכות הקיימות כדי לספק ניווט שניתן לפעול לפיו.
הגדרת היקף הבעיה
לפני שמשתמשים ב-API, צריך לארגן את פרטי הפעולות היומיומיות בקטגוריות נתונים ברורות. כך תוכלו להתחיל את תהליך ההטמעה עם הבנה ברורה של המשאבים והמשימות הנוכחיים, מה המגבלות שלהם ומה היעדים שאתם רוצים להשיג באמצעות צי הרכבים.
זיהוי המשאבים והמשימות
שלב חשוב בתכנון של תוכנית המסלול הוא זיהוי המשאבים והמשימות שלכם, כלומר כלי הרכב והמשלוחים.
| כלי הרכב | המשלוחים |
|---|---|
|
|
זיהוי האילוצים
המגבלות הן ההגבלות על אופן השימוש בכלי הרכב ועל אופן הטיפול במשלוחים. הם מכתיבים את רוב הפעולות שלכם, והם חיוניים כשיוצרים תוכנית מסלול אופטימלית.
באופן כללי, האילוצים נחלקים לשתי קטגוריות:
| מגבלות מחמירות | מגבלות רכות |
|---|---|
| אלה מגבלות שאי אפשר לחרוג מהן. לדוגמה, משאית לא יכולה לשאת משקל שגדול מהקיבולת המקסימלית שלה, ונהג לא יכול לאסוף פריט אחרי שהחנות נסגרה. | אלה העדפות שאפשר לחרוג מהן אם יש צורך, בדרך כלל בתשלום קנס. לדוגמה, יכול להיות שאתם מעדיפים להעמיס משאית רק עד 80% מהקיבולת שלה, או לבצע משלוח לפני שעת היעד, אבל אתם מוכנים לחרוג מהמגבלות האלה כדי לקבל מסלול טוב יותר. |
אלה חלק מההגבלות הנפוצות:
- מגבלות קיבולת: המשקל, הנפח או מספר הפריטים המקסימליים שכלי רכב יכול לשאת.
- חלונות זמן: משבצות הזמן הספציפיות שבהן מיקום מסוים פתוח לביקור, או שעות המשמרת הספציפיות של נהג.
- עלויות: העלות של הפעלת כלי רכב או של דילוג על משלוח. אחת המטרות העיקריות של ה-API היא ליצור תוכנית מסלולים משתלמת.
- הפסקות לנהג: תקופות מנוחה לנהג שנדרשות בדרך כלל על פי חוקי העבודה אחרי מספר מסוים של שעות עבודה.
הגדרת היעדים העסקיים
אחרי שמגדירים את המשאבים והמשימות ואת המגבלות שלהם, הגיע הזמן להגדיר אילו מדדים הכי חשובים לעסק. היעדים האלה קשורים למגבלות, והם עוזרים לכם להחליט מה הכי חשוב כשמתכננים מסלול.
אלה כמה דוגמאות ליעדים עסקיים:
| גודל הצי | מרחק | שעה | עלות |
|---|---|---|---|
| האם אתם רוצים לצמצם את מספר כלי הרכב שבהם נעשה שימוש, או להשתמש בכל הצי כדי לסיים את יום העבודה מוקדם יותר? | האם אתם רוצים את המסלול הקצר ביותר כדי לחסוך בדלק, או שאתם מעדיפים מסלול מהיר יותר שאולי יהיה ארוך יותר בגלל השימוש בכבישים מהירים? | האם אתם רוצים לצמצם את מספר שעות העבודה הכולל, או להגיע בזמנים ספציפיים, מה שיכול להאריך את הזמן שמוקדש לנסיעה? | האם אתם רוצים לצמצם את הוצאות התפעול כמו שכר ודלק, או שאתם מוכנים לשלם יותר כדי לעמוד בלוחות זמנים צפופים? |
מיפוי הנתונים
אחרי שתאספו את הנתונים, תמפו אותם כך שיתאימו למאפיינים של ה-API. כך הכלי לאופטימיזציה מקבל את כל המידע כדי להחזיר תוכנית מסלול שמתחשבת במציאות העסקית שלכם.
משתמשים בפרמטרים בטבלאות הבאות כדי למפות את המשאבים, המשימות, האילוצים והיעדים שמיפיתם בקטע 'הגדרת היקף הבעיה'.
מיפוי משתנים
| קונספט מהעולם האמיתי | פרמטר API | תיאור |
|---|---|---|
| נהג או רכב | model.vehicles[] |
מייצג כלי רכב יחיד בצי. |
| מיקומי מחסנים |
vehicles[].startWaypointvehicles[].endWaypoint
|
המיקום שבו הרכב מתחיל ומסיים את המסלול. |
| שעות הפעילות |
model.globalStartTimemodel.globalEndTime
|
שעת ההתחלה המוקדמת ביותר ושעת הסיום המאוחרת ביותר של הפעילות של כל צי הרכב. |
| משימה או חבילה | model.shipments[] |
ייצוג של משימה. יכול להיות pickup, delivery או שניהם. |
| מיקום המשימה |
pickups[].arrivalWaypointdeliveries[].arrivalWaypoint
|
המיקום הגיאוגרפי שבו מתבצעת העבודה. |
| שעת השירות |
pickups[].durationdeliveries[].duration
|
הזמן שביליתם במיקום כדי להשלים את המשימה (לדוגמה, פריקה), לא כולל זמן נסיעה. |
מיפוי מגבלות
| מגבלה בעולם האמיתי | פרמטר API | תיאור |
|---|---|---|
| מספר המושבים ברכב | vehicles[].loadLimits |
הגדרה של המגבלה הקשיחה או הרכה על מספר הנוסעים ברכב. אם ערך המשלוח loadDemand גבוה מהמגבלה שנותרה, הוא לא יוקצה. |
| גודל החבילה | shipments[].loadDemands |
כמות קיבולת הרכב שמשלוח צורך. |
| הגבלות על כלי רכב | shipments[].allowedVehicleIndices |
הגבלה של משלוח כך שאפשר לאסוף אותו או למסור אותו רק באמצעות כלי רכב או נהגים ספציפיים. |
| שעות פעילות | shipments[].pickups[].timeWindows או shipments[].deliveries[].timeWindows |
הגדרת השעות שבהן אפשר לבקר במיקום. אם הרכב לא יכול להגיע בפרק הזמן הזה, המשלוח ידלג על הרכב. |
| מגבלת אורך המשמרת | vehicles[].routeDurationLimit |
הגדרת מגבלה קשיחה או גמישה על משך העבודה של נהג מסוים (לדוגמה, מקסימום 8 שעות), ללא קשר לשעת הסיום הגלובלית. |
| הפסקות לנהגים | vehicles[].breakRule |
אכיפה של כללי מנוחה ספציפיים, כמו הפסקות חובה אחרי מספר מסוים של שעות עבודה. |
| הגבלות על כבישים | vehicles[].travelMode |
מציינים את אמצעי התחבורה (לדוגמה, DRIVE או BICYCLE). כך המסלול מוגבל לכבישים חוקיים, והמהירויות שמשמשות לחישוב זמני ההגעה נקבעות. |
מיפוי יעדים
| יעד בעולם האמיתי | פרמטר API | תיאור |
|---|---|---|
| מזעור גודל הצי | vehicles[].fixedCost |
עלות חד-פעמית על שימוש ברכב. עלות קבועה גבוהה מחייבת את המסלול לתת עדיפות לשימוש בפחות כלי רכב על פני הגדלת המרחק הכולל או זמן העבודה. |
| צמצום המרחק | vehicles[].costPerKilometer |
הגדרת עלות לכל קילומטר נסיעה. האפליקציה מתעדפת מסלולים קצרים יותר כדי לחסוך בדלק ובבלאי. |
| צמצום משך הזמן הכולל | vehicles[].costPerHour |
העלות חלה על כל שעה שהרכב פעיל (כולל זמן הנסיעה וזמן ההמתנה). העדיפות היא להשלמה מהירה יותר. |
| צמצום זמן הנסיעה | vehicles[].costPerTraveledHour |
העלות חלה באופן ספציפי על הזמן שבו מתבצעת תנועה. כך אפשר להבחין בין נסיעה בפקקים (יקרה) לבין המתנה בתחנה(יכולה להיות זולה יותר). |
| לתעדף משימות מסוימות | shipments[].penaltyCost |
העלות חלה אם מדלגים על משלוח ספציפי. הגדרת העדיפות הזו כגבוהה מבטיחה שהמשימות הקריטיות יקבלו עדיפות על פני משימות אופציונליות. |
יצירת הבקשה וקבלת תשובה
כדי ליצור תוכנית מסלולים באמצעות Route Optimization API, צריך לבצע את השלבים הבאים:
- הגדרת הסביבה: מגדירים את הפרויקט ב-Google Cloud, מפעילים את ה-API ומגדירים אימות. הוראות מפורטות מופיעות במאמר תחילת העבודה. צריך לבצע את השלב הזה רק פעם אחת.
- שליחת הבקשה: יוצרים את גוף הבקשה באמצעות מיפוי הנתונים שהוגדר בקטע הקודם. מידע על נקודות קצה (endpoints), כותרות ופורמט בקשות מופיע במאמר שליחת בקשת API.
- הבנת התגובה: אחרי שמקבלים תגובה מה-API, חשוב להבין את תוכנית המסלול ואת המשמעות של כל פרמטר. הסבר על תשובה
שיפור תוכנית המסלול
תרגום של לוגיסטיקה בעולם האמיתי לעלויות ולאילוצים של API הוא משימה מורכבת. יכול להיות שתוכנית המסלול הראשונית לא תתאים ליעדים העסקיים שלכם או לציפיות של הנהגים. שיפור תוכנית המסלולים הוא תהליך איטרטיבי שבו בודקים את המסלולים שהוחזרו ומשנים את הפרמטרים עד שמוצאים הגדרה שמשיגה את היעדים.
שינוי היעדים והמגבלות
אם תוכנית המסלול שנוצרה לא מתאימה לצרכים שלכם, תוכלו לשנות פרמטרים מסוימים כדי לקבל תוצאות שונות. הידוק או הרחבה של פרמטרים משנים את האופן שבו מטרות סותרות נפתרות בתוכנית המסלול, והרחבת פרמטרים היא דרך יעילה לגלות את הפרמטרים שגורמים לשגיאות בתוכניות המסלול.
בטבלה הבאה מפורטות בעיות נפוצות בניתוב ופרמטרים שאפשר לשנות כדי לפתור אותן.
| תרחיש | פרמטר | התאמה | תיאור |
|---|---|---|---|
| משלוח חשוב לא נסרק | shipments[].penaltyCost |
להגדיל את הערך שלו או להוסיף עלויות קנס למשלוחים אחרים | אם המשלוח הוא אופציונלי, כדאי להגדיל את עלות הקנס שלו כדי לתת לו עדיפות. אם המשלוח הוא חובה (אין עלות קנס), מוסיפים את עלויות הקנס למשלוחים אחרים, שהם פחות קריטיים. כך הן הופכות לאופציונליות, ומתפנה זמן וקיבולת ברכב למשלוח החשוב. |
| דילוג על משלוח בגלל תזמון | softStartTime / softEndTime |
הוספת חלונות זמן גמישים | חלונות זמן קשיחים מבטלים משימות שאפילו איחרו בדקה אחת. חלונות זמן גמישים מאפשרים לנהג להגיע באיחור קל מהלוח הזמנים, על ידי תשלום 'עלות' במקום פסילת ההקצאה. |
| דילגת על המשלוח החודש בגלל המשקל | loadLimits[].softMaxLoad וגם costPerUnitAbove |
הוספת דרישות לטעינה רכה | מאפשרת לרכב לחרוג מעט מהקיבולת האידיאלית שלו (בתוספת קנס) במקום להשאיר חבילה מאחור. |
| דילגת על המשלוח החודש כי העומס על צי הרכבים גדול מדי | model.vehicles[] או shipments[].timeWindows |
הוספת כלי רכב או חלונות זמן להפסקות | אם יש יותר מדי משלוחים לצי הנוכחי, במיוחד בשעות השיא, כדאי להוסיף עוד כלי רכב או להרחיב את חלונות הזמן למשלוח כדי לפזר את עומס העבודה. |
| המסלולים ארוכים מדי או לא יעילים | vehicles[].costPerKilometer / costPerHour |
הוספת עלויות או הגדלת הערך שלהן | ההגדרה הזו מציינת לממשק ה-API שהנסיעה יקרה, ולכן הוא צריך להשמיט עצירות מרוחקות ומבודדות כדי ליצור מסלולים קצרים יותר לצי הרכב. |
| משמרות הנהגים ארוכות מדי | vehicles[].routeDurationLimit או model.vehicles[] |
הוספת מגבלות משך, או הוספת רכבים ומגבלות | מגדיר מכסה מקסימלית (לדוגמה, 8 שעות) לזמן הכולל שבו הנהג נמצא על הכביש. הוספת כלי רכב בלבד לא תקצר את המסלולים, אלא אם תגדירו גם מגבלות משך כדי לאלץ את פותר הבעיות לחלק את עומס העבודה בין כלי הרכב הרבים יותר. |
עדכון של תוכנית מסלול
לפעמים צריך לעדכן תוכנית מסלול בלי לשנות את הבסיס, למשל להוסיף איסוף ללוח הזמנים של נהג פעיל. כדי לעשות את זה, משתמשים בפרמטרים של הזרקה, שמספקים ל-API נקודת התחלה על סמך הפתרון הקודם, וכך מאפשרים לו לשנות את התוכנית הקיימת במקום לחשב תוכנית חדשה מאפס.
יש כמה דרכים לעדכן תוכנית מסלול באמצעות פרמטרים של הזרקה:
- מעבירים את המסלולים מתשובה קודמת לשדה
injectedFirstSolutionRoutesשל הבקשה החדשה. השימוש בשיטה הזו מקצר את זמן החיפוש של האופטימיזציה, והיא שימושית לתכנון מחדש לפני תחילת הפעולות היומיות, למשל שילוב של משלוחים ברגע האחרון. - כדי לשלוט במידת השינוי, משתמשים בשדה
injectedSolutionConstraint. האפשרות הזו שימושית כשהפעולות כבר בעיצומן, כי היא מאפשרת לשמור על הרצף הנוכחי של הנהג או לתקן חלקים בתוכנית שכבר בוצעו. - כדי לוודא שהמסלול המעודכן עדיין משויך לרכב הנכון, צריך להגדיר את
interpretInjectedSolutionsUsingLabelsלערךtrue. השימוש הזה מועיל בניסויים כשמוסיפים או מסירים משלוחים וכלי רכב, כי הוא מתאים מסלולים באמצעות תוויות במקום אינדקסים. לכן, כל התוויות של כלי הרכב והמשלוחים צריכות להיות ייחודיות.
שילוב של תוכנית המסלול
תוכנית המסלול הסופית היא אובייקט נתונים שמייצג ניהול אופטימלי של המשאבים והמשימות שלכם, תוך התחשבות במגבלות וביעדים שהגדרתם. כדי להשתמש בתוכנית המסלול הזו בפעילות היומיומית, צריך לשלב אותה במערכת. בדרך כלל זה כולל הצגה חזותית של תוכנית המסלול למנהלי צי רכב ושיגור הוראות מפורטות לנהגים.
הצגה חזותית
כדי לאפשר למנהלי צי רכב לאמת ולנטר את תוכנית המסלולים שלכם, אתם יכולים להציג את תוכנית המסלולים בדרכים הבאות:
כדי לאפשר למנהלי צי רכב לאמת ולעקוב אחרי תוכנית המסלול שלכם, אתם יכולים להציג אותה במפה של מרכז הבקרה. בהתאם לשלב הפיתוח הנוכחי, אפשר להציג את תוכנית המסלול בדרכים הבאות:
- בלי קוד: אפשר להשתמש באפליקציית אופטימיזציית המסלולים בקוד פתוח כדי לראות איך ה-API מתרגם את הנתונים שלכם לנתיבים פיזיים במפה. אפליקציית האינטרנט הזו משמשת ככלי מחקר שמאפשר לכם ליצור תרחישים, לשנות פרמטרים של אילוצים ולעבד חזותית את תוכניות המסלול שנוצרות לפני שכותבים קוד.
- הצגת סדר הביקורים: אפשר להציג את רצף הביקורים כנקודות ממוספרות במפה כדי להעריך את תוכניות האופטימיזציה והשיגור במערכת שלכם. כדי לעשות את זה, מאתרים את מערך
visitsבכל נתיב בתגובת ה-API. הפריטים במערך הזה מסודרים בדיוק כמו שהדרייבר צריך לבצע אותם. אפשר לעבור על הרשימה הזו, להשתמש ב-shipmentIndexכדי לאחזר את קואורדינטות המיקום של כל עצירה ולהשתמש בספריית המיפוי כדי להציג סמנים ממוספרים במפה על סמך הסדר שלהם ברשימה. - שרטוט המסלול הפיזי: אפשר לראות את המסלול המתוכנן המדויק במפה כדי להבין למה הכלי לאופטימיזציה בחר ברצף מסוים. הקו המקוטע הזה מייצג את הנתיב המיועד לתכנון ולהערכה, ולא את המסלול בזמן אמת שבו הנהג נוסע. מגדירים את
populatePolylines: trueבבקשה כדי לקבל שדהencodedPolylineלכל מסלול, ומפענחים אותו באמצעות השיטהgoogle.maps.geometry.encoding.decodePath()מ-Maps JavaScript API.
שיגור לנהגים
אתם יכולים לשלב ניווט במסלול מפורט באפליקציית הנהג באמצעות Navigation SDK, או לספק קישורי עומק לאפליקציית מפות Google לצרכנים.
- Navigation SDK: אם יש לכם אפליקציית נהגים בהתאמה אישית, אתם יכולים לשלב את Navigation SDK ל-Android או ל-iOS כדי לקבל הנחיות מסלול מפורט באפליקציה.
אתם יכולים לשלב את פרטי המשימה מתגובת ה-API במערכת שלכם ולהשתמש ב-SDK לניווט. כדי להעביר את המסלולים מהתגובה של ה-API אל ה-SDK, צריך להגדיר את
populateTransitionPolylines: trueבבקשה. הפעולה הזו יוצרתrouteTokenלכל מעבר בתגובה. - Fleet Engine: לניהול מתקדם של צי הרכבים, אפשר לייבא את תוכנית המסלולים שנוצרה על ידי ה-API אל Fleet Engine כדי לעקוב אחרי הביצוע של המסלולים בזמן אמת. ממשק ה-API מספק קו פוליגוני של הנתיב המיועד לצורך הערכה, אבל Fleet Engine משייך את רצף הביקורים המתוכנן שלכם למעקב בזמן אמת אחרי הרכב.