אופטימיזציית מסלולים ב-AI: היכן מתבזבז הקילומטראז' וחלונות הזמן נשברים
המשמרת מתחילה במאות כתובות, שמהן יש להרכיב נסיעות בהתאם לחלונות המשלוח, הטונאז', המידות ומשטר עבודת הנהג. תכנון ידני מתבצע באופן סדרתי: המוקדן מפזר נקודות לפי אזורים וממלא את הרכב עד שהוא נתקל במגבלה — ולכן כתובות שכנות יוצאות בנסיעות שונות.
כאשר יש 40–60 עצירות במסלול, מעבר ידני על כל האפשרויות כבר בלתי אפשרי: מספר הצירופים הקבילים גדול בסדרי גודל ממה שהמוקדן מספיק לבדוק במשמרת, והקילומטראז' העודף של התחבורה גדל יחד עם מספר הנקודות.
צוואר הבקבוק בניתוב הוא לא מחסור ברכבים, אלא התנגשות בין אילוצים. לא ניתן לבצע אופטימיזציה של מרווחי משלוח קשיחים, משקל, נפח, זמן פריקה, הפסקות ואיסורי נסיעה לרכב משא בזה אחר זה: שיפור של מדד אחד שובר אחר.
כללי התכנון שהוטבעו לפני שנים — אזורים קבועים, «כל רכב לפי הכיוון שלו» — לא תואמים את מפת הביקוש בפועל. גם הנתונים על הנקודות מפוזרים: כתובות ללא קואורדינטות, חלונות בטקסט חופשי בהערה, זמן נסיעה ממדריכים ממוצעים במקום מדידות בפועל לפי שעות וימי שבוע.
מכאן נובעת חריגה שיטתית, ולא טעות חד-פעמית של המוקדן: קילומטראז' גבוה מהאופטימלי, שבירת חלונות משלוח בחלק מהנסיעות, תיקונים ידניים ממש בדרך.
אנחנו מפרטים כיצד זה נסגר: כיצד האילוצים מוצאים למודל מפורש, מהיכן נלקחים זמני הנסיעה בפועל ומדוע הבעיה נפתרת על ידי סריקה עם פסילת אפשרויות לא קבילות, ולא על ידי יוריסטיקה «לפי אזורים» — לשם כך משתמשים בפותרים מסוג בעיות ניתוב צי, למשל Google OR-Tools.
האפקט של היישום: קילומטראז', עומס תחבורה, שבירת חלונות
את האפקט אנחנו מחשבים לא מהמתמטיקה האידיאלית, אלא מקו הבסיס: שבועיים-שלושה של טלמטריה לפני היישום, אותה נומנקלטורה של הזמנות, אותם חלונות ואותו צי. השוואה כזו מציגה את התרומה של המתכנן לתוצאה, ולא תנודות עונתיות של הביקוש — אחרת אי אפשר להגן על המספרים בפני ההנהלה.
| מדד | כיצד מודדים | מה משתנה |
|---|---|---|
| קילומטראז' | סכום לפי מסלולים במשמרת | נעלמות נסיעות מיותרות בין אזורים |
| עומס תחבורה | משקל ונפח תפוסים ביחס לזמין | נקודות שכנות נאספות לנסיעה אחת |
| נסיעות ריקות | חלק הדרך ללא מטען | עומס חוזר מתבצע באותו חלון |
| חלונות משלוח | שיעור המשלוחים בתוך המרווח | זמן ההגעה מחושב מחדש תוך כדי |
| תיקונים ידניים | מספר התיקונים של המוקדן במשמרת | העברות והחזרות הופכות לכללים |
תוצאה נפרדת היא סוג התקלות שחוסל, שבו איחור לנקודה אחת שובר את כל המסלול: הנהג מגיע ללקוח מחוץ לחלון, הלקוח דוחה את הקבלה, שאר הכתובות נדחות בשרשרת. המתכנן מחזיק אילוצים של זמן וקיבולת בו-זמנית, ולכן שרשראות כאלה פשוט לא נבנות, ושבירת חלונות מפסיקה להיות תופעה המונית.
גרף הדרכים והאילוצים נבנים על נתונים פתוחים של OpenStreetMap עם תיקון לפי מסלולים בפועל ואיסורי גישה, ולכן הערכת ההגעה לא מתבדלת מהמציאות. את המדידות מבצעים על אותה טלמטריה שלפיה מתקבלת לאחר מכן התוצאה.
הצפויות של החלונות חשובה יותר מהמינימום המוחלט של הקילומטראז': מסלול שנכנס באופן יציב למרווחים מסיר את הצורך בפיקוח ידני. המוקדן עוסק בחריגים, ולא בהרכבה מחדש של המשמרת.
פורמטים של אופטימיזציה: חישוב מחדש מקוון, חבילה לילית, היברידי
את מצב החישוב בוחרים לא לפי ה«עוצמה» של האלגוריתם, אלא לפי קצב המשמרת ואיכות נתוני הקלט. אם הזמנות מגיעות במהלך היום, והכתובות והנפחים משתנים תוך כדי — יש צורך בחישוב מחדש מקוון; אם המסלול נקבע ליממה והנתונים מאושרים מראש, יציבה יותר החבילה. להלן השוואה של גישות לניתוב לפי התאמה ומגבלות.
| מצב | מתי מתאים | מגבלות |
|---|---|---|
| חישוב מחדש מקוון של מסלולים | הזמנות וסטטוסים זורמים ברצף: משלוח עירוני, בקשות דחופות | נדרש ערוץ תקשורת קבוע וסטטוסים עדכניים; ללא מגבלה על תיקונים התוכנית «רועדת» ומאבדת את אמון הנהגים |
| חישוב חבילתי של נסיעות | המסלול נקבע למשמרת, החלונות והנפחים מאושרים: בין-עירוני, נסיעות סדירות | לא מגיב לאירועים בתוך היום; ירידה מהקו או עיכוב — הרכבה מחדש ידנית אצל המוקדן |
| מצב תכנון היברידי | בלילה נבנית תוכנית בסיס, ביום — תיקונים נקודתיים לפי סטייה | נדרשים כללים: סף סטייה, מגבלת תיקונים לנסיעה, גרסאות של התוכנית — אחרת התיקונים מצטברים בכאוס |
את הגבולות בין המצבים קובעת לא הלוגיקה של החישוב, אלא סבילות לשינויים: כמה תיקונים במשמרת יחזיקו המוקדן, הנהג והלקוח. היברידי נלקח במקום שבו נדרש מעגל מקוון, אבל הרכבה מחדש מתמדת מפריעה — סף סטייה ומגבלת תיקונים לנסיעה משאירים את התוכנית צפויה.
אם זרימת הסטטוסים חלקית או מגיעה באיחור, המעגל המקוון מחזיר מסלולים אשפתיים: תחילה מסדירים את איסוף הנתונים, אחר כך מפעילים את החישוב מחדש.
כיצד נבנה היישום: מביקורת נתונים ועד מסירה לעבודה
את השלבים מסדרים כך שכל אחד מסתיים בארטיפקט שאפשר לבדוק לפני המעבר לבא. אנחנו מתחילים לא מהאלגוריתם, אלא מהנתונים והכללים: אם בהפקות אין זמני הגעה בפועל לנקודות או שאזורי הזמן של הסניפים התפצלו, הניתוב יחזיר לוח זמנים שהמוקדן יבטל ביום השני.
שלבי היישום של הניתוב
- ביקורת נתונים לוגיסטיים. אוספים הפקות ממערכת הנה"ח, טלמטיקה ויומני נסיעה, מאמתים שלמות לפי תקופות, מחפשים כפילויות, קרעים לפי גיאוזונים ונסיעות ללא סגירה.
- פורמליזציה של אילוצים. חלונות משלוח, סוג וקיבולת המרכב, משטר עבודת הנהגים, עדיפויות לקוחות — מאחדים לסכימה אחת ומתאמים אותה עם המוקדנים, ולא עם תפיסתם את התהליך.
- הכנת נתונים גיאוגרפיים. מנרמלים כתובות, מצמידים נקודות למפה, מתקנים קואורדינטות פגומות, אוספים מדריך מחסנים ותחבורה.
- הגדרת פונקציית המטרה. קובעים מה מייעלים — קילומטראז', זמן נסיעה או אחידות העומס — ומגדירים משקולות קנסות על הפרת חלונות.
- בדיקה על נתונים היסטוריים. מריצים את הפתרון על נסיעות עבר ומשווים את התוכנית למציאות: היכן הפער מוסבר, והיכן הוא מצביע על חור בכללים.
- מסירה לעבודה. המוקדנים מקבלים עמדת עבודה עם תיקון ידני, תקנון לניתוח סטיות ומדדים שלפיהם נראית איכות התכנון מיום ליום.
תיעוד ומסירה: קונפיגורציות, סכמות, תקנונים
אנחנו מוסרים לא שירות עובד, אלא ערכה שצוות שלכם ממשיך לעבוד איתה בעצמו. קונפיגורציות נשמרות כטקסט במערכת בקרת גרסאות, סכמות מתוארות במילים, ולא נשארות בראשיהם של המהנדסים. להלן מה בדיוק נשאר אצל המזמין.
- קונפיגורציית ניתוב: מטריצת אילוצים — חלונות משלוח, טונאז' ומידות, משטר טמפרטורה, מקטעים אסורים, עדיפויות לקוחות.
- סכמות ניתוב: כיצד הזמנות מתחלקות לנסיעות והיכן הגבול בין החלטת המוקדן לחישוב האוטומטי.
- תפקידי גישה של המוקדנים: מי משנה אילוצים, מי רק מאשר, מי רשאי לעקוף את המסלול ידנית וכיצד זה מתועד.
- תקנונים לעדכון כללים: יוזם התיקון, בדיקה על היסטוריית ימים קודמים, החזרה בטוחה לגרסה הקודמת של הקונפיגורציה.
- תיעוד מסלולים: תיאור שדות, מדריכים, פורמטים של החלפה עם מערכות הנה"ח והמחסן, כולל ניתוח פערים.
- יומן עקיפות: מה המוקדנים שינו, היכן ומדוע — בסיס לבחינה הבאה של הכללים.
- הוראות הפעלה: תקלות אופייניות, מה לבדוק ראשון, למי לפנות.
לפני המסירה אנחנו עוברים על כל סעיף יחד עם המוקדנים והמהנדס שלכם: הם עצמם משנים אילוץ ורואים את התוצאה. אם אי אפשר להכניס תיקון בלעדינו — המסירה לא סגורה.
ניתוח היישום: קילומטראז' ושבירת חלונות לפני ואחרי
נקודת ההתחלה
המסלולים הורכבו בטבלה לפי אזורים קבועים: המוקדן השלים ידנית הזמנות לגליונות שכבר נוצרו, ואת סדר הנקודות קבע ניסיונו של הנהג. בעומס צפוף הכתובות הראשונות יצאו מחוץ לחלון, וכל הגליון בהמשך המשיך באיחור של שעה-שעה וחצי.
בנקודת ההתחלה הקילומטראז' העודף ביחס למינימום המחושב עמד על 9-12%, שבירת חלונות — 7-8% מהמשלוחים. התוכנית היומית הורכבה במשך 3-4 שעות ותוקנה במהלך המשמרת, ולכן אי אפשר היה לאשר חלונות מראש.
מה שינו
הרכבנו מודל אילוצים: חלונות זמן, טונאז' ונפח המרכב, משטר עבודת הנהגים, איסורי נסיעה לרכב משא. את זמן הנסיעות חישבנו לא לפי מהירות ממוצעת, אלא לפי נתונים היסטוריים של טלמטריה מעל גרף הדרכים מ-Яндекс.Карты — תוך התחשבות בשעות השיא.
המסלולים מחושבים מחדש בערב על בסיס המציאות של היום שחלף: ביטולים, כתובות חדשות וזמן העצירות בפועל נכנסים למודל מיד. המוקדן רואה את הסטייה ברגע הופעתה, ולא בבוקר שלמחרת.
מה יצא
לאחר שמונה שבועות של עבודה קבועה: קילומטראז' עודף 3%, שבירת חלונות 2%, הרכבת התוכנית — 25 דקות במקום חצי משמרת. התוצאה נשמרה הודות לכך שהכללים והמשקולות חיים בהגדרות לצד המוקדן, ולא בקוד: אזור חדש או משטר נקודה שהשתנה מוכנסים באותו יום.
נשארה מגבלה אחת: חלונות של 15 דקות האלגוריתם סוגר רק אם יש בקרבת מקום הזמנה שנייה. כתובות כאלה מוציאים ברשימה נפרדת — המוקדן מתכנן אותן ידנית.
במה חישוב מחדש מקוון נבדל מחישוב חבילתי לילי
ההבדל בין מצבי הניתוב הוא באופק שלפיו מחושבת התוכנית. חישוב חבילתי מופעל לפי לוח זמנים, רואה את כל נפח ההזמנות שנצבר ומחפש אופטימום גלובלי: מינימום קילומטראז', עומס אחיד של הרכבים, חלונות משלוח ברי ביצוע.
המצב המקוון פועל לא לפי לוח זמנים, אלא לפי אירועים — הגיעה הזמנה, בוטלה, רכב התקלקל, לוח הזמנים נשבר. הוא נוגע לא בתוכנית כולה, אלא במקטע שעדיין אפשר להזיז בלי נזק.
הפיתוי להריץ חישוב מלא מחדש על כל אירוע מובן, אבל התוכנית מתחילה לרעוד: הנהג מקבל מסלול חדש באמצע המשמרת, ונסיעה שכבר יצאה מהמחסן בכלל אי אפשר לשנות בחישוב.
לכן החישוב מחדש במהלך המשמרת נבנה על גבול קשיח — נסיעות שהתחילו קופאות ומשתתפות רק כאילוץ: רכב תפוס, מטען על הסיפון, זמן חזרה.
את בחירת מצב החישוב מצמידים לאירוע ולמחיר השינוי. כל עוד ההיסט מקומי, מספיק המצב המקוון; כשהשינויים מצטברים מעבר לסף — לפי שיעור ההזמנות הגמישות או לפי מספר הרכבים המושפעים — הפתרון עובר לחישוב חבילתי ומורכב מחדש בשלמותו.
כדי שהתוכנית לא תומצא מחדש כל כמה דקות, לפונקציית המטרה מוסיפים קנס על שינוי מסלול שכבר הובטח ומגבלה על מספר הנסיעות שנוגעים בהן. הנהג רואה רצף נקודות אחד, ובמקביל אירועים קריטיים מטופלים מיד.
כך החישוב החבילתי והמצב המקוון לא מתנגשים: הלילה קובע תוכנית בסיס ואופטימום גלובלי, המשמרת — תיקון נקודתי בתוך האזור הנע. ככל שהמשמרת מתקדמת האזור הנע מצטמצם, וכל מה שנשאר גמיש עובר להרכבה הלילית הבאה.
ספקות ומגבלות: איכות נתונים, אינטגרציות, החזרה לאחור
איכות המסלול בפלט היא בדיוק איכות מדריך הנקודות: כפילויות כתובות, חלונות זמן מיושנים, נקודות ללא קואורדינטות וכתובות כמו «מחסן ליד הכיכר» הופכים מסלול אופטימלי פורמלית לבלתי ניתן לביצוע.
לכן הצעד הראשון הוא לא חישוב, אלא ניתוח המדריך: נרמול כתובות, איחוד כפילויות לפי קואורדינטות, בדיקת אילוצים לפי משקל, מידות וזמן פריקה.
עם מערכת הנה"ח הפתרון עובד כתוספת, ולא כתחליף: הזמנות, גורמים וסטטוסים נשארים בה, האופטימייזר קורא אותם ומחזיר תוכנית סיור וסדר נקודות.
ההחלפה מתבצעת לפי לוח זמנים ולפי מפתחות ההזמנות, ולכן הפקה חוזרת לא יוצרת כפילויות ולא שוברת משלוח שכבר התחיל; אם אין קשר, המסלול מחושב לפי ההפקה המוצלחת האחרונה.
מדריך הנקודות בבלגן — ממה מתחילים?
תחילה מנתחים את הנתונים: מנרמלים כתובות, מאחדים כפילויות לפי קואורדינטות וגורם, מסמנים נקודות ללא חלונות זמן ועם פריקה לא תקנית. אחר כך מפעילים פיילוט על כיוון אחד ומאמתים את החישוב מול נסיעות בפועל — רואים היכן הנתונים טועים, והיכן כללי החישוב.
המוקדן מכיר את המסלול טוב יותר — מה אז?
החישוב הוא הצעה, לא פקודה. המוקדן יכול לקבע נקודה, להזיז חלון, להשאיר סדר סיור רגיל; המערכת זוכרת תיקונים כאלה ככללים ומתחשבת בהם בחישובים הבאים. נקודות שנויות במחלוקת מוציאים ברשימה נפרדת ומנתחים יחד עם שירות המשלוחים.
כיצד מחזירים שינויים בכללים לאחור?
הכללים מנוהלים בגרסאות: סט בסיס, עדיפויות, חריגים לפי נקודות וסוגי תחבורה. החזרה לגרסה קודמת לא עוצרת את המשלוח — מחליפים סט כללים ומחשבים מחדש מסלולים ליום הבא, וסדר הסיור הקודם נשאר עובד.
נדון במשימה ונחזור עם הערכה ותוכנית
כדי שההערכה תישען על נתונים, ולא על השערות, יש צורך בכמה חומרי קלט. מספיקות הפקות בצורה שבה הן נמצאות כעת — הניקוי וההבאה לפורמט אחיד הם חלק מהעבודה שלנו.
- רשימת נקודות משלוח או שירות: כתובות, חלונות קבלה, מגבלות גישה ופריקה.
- היסטוריית נסיעות ל-2-3 חודשים: מסלולים בפועל, זמן נסיעה, עצירות סרק, סטיות מהתוכנית.
- צי ומשטרי עבודה: סוגי רכבים, כושר העמסה, משמרות נהגים, הפסקות חובה.
- כללים שאסור להפר: עדיפויות לקוחות, איסור על רחובות מסוימים לתחבורה גדולה, תקנונים לחומרים מסוכנים.
- התהליך הנוכחי של התכנון: מי ובמה בונה מסלולים היום, היכן מתקנים אותם ידנית.
- מה נחשב לתוצאה: צמצום קילומטראז', מספר רכבים בקו, עמידה בחלונות זמן.
הניתוח מתבצע בשני מעברים. תחילה אנחנו בוחנים את הנתונים ואת התהליך הנוכחי: היכן התוכנית חורגת מהמציאות, אילו אילוצים בכלל לא נלקחים בחשבון, כמה תיקונים ידניים יש ביום.
אחר כך מחשבים מה תיתן האוטומציה על הנפח שלכם — לפי אילו מקטעים הקילומטראז' יורד, אילו נסיעות אפשר לאחד, היכן צוואר הבקבוק הוא לא במסלולים, אלא בלוח הזמנים של המחסן.
להערכה ולתוכנית היישום נכנסים: סכמת המטרה לחישוב מסלולים, רשימת הנתונים והאחראים על הפקתם, שלבי עבודה עם תוצאה ניתנת לבדיקה בכל אחד, שיטת ההשוואה «לפני ואחרי» לפי קילומטראז' וזמן, דרישות לאינטגרציה עם מערכת הנה"ח וסדר ההפעלה בלי לעצור את הלוגיסטיקה הנוכחית. תארו את המשימה — נחזור עם הערכה ותוכנית.







