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

במצב כזה, ובבקשה שמשתמשת רק בעלות לשעה ובעלות לקילומטר, המסלול האופטימלי יכול לכלול את A ו-B בבוקר ואת C בערב, ועלות הפתרון תהיה זהה למצב שבו כל השלושה מטופלים בו-זמנית.
עלות לקילומטר עם סף
כדי לקבץ ביקורים קרובים, קודם צריך לבחור מרחק סף. זהו המרחק המקסימלי בין שני ביקורים שאתם מחשיבים כקרובים. בדוגמה הזו, הסף הוא 100 מטרים, שזה בערך בלוק אחד באזור עירוני. אתם יכולים להגדיל או להקטין את הסף בהתאם לצרכים העסקיים ולהעדפות של הנהגים.
כדי לקבץ ביקורים קרובים שנמצאים במרחק של עד 100 מטרים זה מזה, מגדירים עלות גבוהה ל-100 המטרים הראשונים של כל מעבר, ועלות נמוכה יותר לכל מטר נוסף במעבר. מכיוון ש-100 המטרים הראשונים הם היקרים ביותר, הכלי לאופטימיזציה חוסך הכי הרבה כסף על ידי שימוש במעברים קצרים יותר מסף 100 המטרים, גם אם זה אומר להאריך את המסלול הכולל.
כדי להגדיר את העלויות, מוסיפים רשומה חדשה ל-ShipmentModel.transition_attributes עם המאפיינים הבאים:
- כדי להתאים את כל המעברים האפשריים, בוחרים תג שלא נמצא בשימוש בשום מקום במודל, למשל
UNUSED_TAG. מגדירים אתTransitionAttributes.excluded_src_tagואתTransitionAttributes.excluded_dst_tagלתג הזה. - מגדירים את
TransitionAttributes.distance_limitעם המרחק ועלויות הסף:- מגדירים את
DistanceLimit.soft_max_metersלסף שנבחר. - מגדירים את
DistanceLimit.cost_per_kilometer_below_soft_maxלעלות לקילומטר מתחת לסף. - מגדירים את
DistanceLimit.cost_per_kilometer_above_soft_maxלעלות לקילומטר מעל הסף.
- מגדירים את
{
"model": {
"transitionAttributes": [
{
"excluded_dst_tag": "UNUSED_TAG",
"excluded_src_tag": "UNUSED_TAG",
"distanceLimit": {
"softMaxMeters": 100,
"costPerKilometerBelowSoftMax": 50,
"costPerKilometerAboveSoftMax": 1,
}
}
]
}
}
כדי להתאים לכל המעברים האפשריים, אסור להשתמש בתג #unused_tag# באף משלוח או רכב. מידע נוסף זמין במאמר איך להתאים את כל בקשות הביקור.
איך פועלת עלות גבוהה מתחת לסף
בקטע הזה מוסבר איך העלות מתחת לסף ומעליו משפיעה על העלות הכוללת של פתרונות שונים בתרחיש לדוגמה.
פתרון 1: מבצעים את A ו-B בדרך לשם, ואת C בדרך חזרה
בפתרון הזה, המשלוחים מפוצלים לשתי הנסיעות בכביש הזה. שניים מהם נשלחים במעבר הראשון, והשלישי נשלח במעבר השני. יש 5 מעברים:
| מעבר | מרחק | מתחת לסף | מעל הסף | ||
|---|---|---|---|---|---|
| מרחק | עלות | מרחק | עלות | ||
| depot →A | 1,000 מ' | 100 מ' | 5 | 900 מ' | 0.9 |
| A→B | 50 מטרים | 50 מטרים | 2.5 | 0 מטרים | 0 |
| B→other | 1,030 מ' | 100 מ' | 5 | 930 מטרים | 0.93 |
| other→C | 1,000 מ' | 100 מ' | 5 | 900 מ' | 0.9 |
| C→depot | 1,080 מ' | 100 מ' | 5 | 980 מ' | 0.98 |
| סה"כ | 450 מ' | 22.5 | 3,710 מ' | 3.71 | |
העלות הכוללת מחושבת כסכום של שתי העלויות לקילומטר:
- העלות לקילומטר מתחת לסף (50) כפול מרחק הנסיעה הכולל מתחת לסף (450 מטרים = 0.45 ק"מ),
- העלות לקילומטר מעל הסף (1) כפול המרחק הכולל מעל הסף (3,710 מטרים = 3.71 ק"מ).
העלות הכוללת היא 0.45 * 50 + 3.71 * 1 = 22.5 + 3.71 = 26.21.
פתרון 2: מבצעים את A, B ו-C בדרך לשם, ולא עושים כלום בדרך חזרה
בפתרון הזה, בניגוד לפתרון 1, כל שלושת המשלוחים נמסרים "כקבוצה" במהלך נסיעה אחת בכביש. בנסיעה השנייה, הרכב לא עוצר בכלל. גם כאן יש 5 מעברים, אבל האורך וההרכב שלהם שונים:
| מעבר | מרחק | מתחת לסף | מעל הסף | ||
|---|---|---|---|---|---|
| מרחק | עלות | מרחק | עלות | ||
| depot →A | 1,000 מ' | 100 מ' | 5 | 900 מ' | 0.9 |
| A→B | 50 מטרים | 50 מטרים | 2.5 | 0 מטרים | 0 |
| B→C | 30 דקות | 30 דקות | 1.5 | 0 מטרים | 0 |
| C→אחר | 1,000 מ' | 100 מ' | 5 | 900 מ' | 0.9 |
| other→depot | 2,080 מ' | 100 מ' | 5 | 1,980 מ' | 1.98 |
| סה"כ | 380 מ' | 19 | 3,780 מ' | 3.78 | |
באמצעות אותו חישוב כמו בפתרון 1, העלות הכוללת היא 0.38 * 50 + 3.78 * 1 = 19 + 3.78 = 22.78, וביצוע כל הביקורים במשבצת זמן אחת זול יותר מאשר ביצוע שלהם בשתי קבוצות. כדי לחזק את ההשפעה הזו, אפשר להגדיל את DistanceLimit.cost_per_kilometer_below_soft_max.
למה עלות נמוכה לקילומטר מתחת לסף לא עובדת
מכיוון שאתם רוצים להעדיף מעברים קצרים על פני מעברים ארוכים, יכול להיות שתתפתו לתת עלות גבוהה לקילומטר למעברים ארוכים, ולשמור על העלות הנמוכה לקילומטר למעברים קצרים. אבל בפועל, יש לזה השפעה הפוכה: מכיוון ש-100 המטרים הראשונים של המעבר הם הזולים ביותר, הכלי לאופטימיזציה משתמש במטרים ה "זולים" האלה בצורה היעילה ביותר על ידי העדפת מעברים שקרובים ל-100 מטרים או יותר.
אפשר לראות את ההשפעה הזו בשני הפתרונות לדוגמה. אם מחליפים את העלות לקילומטר מתחת לסף ומעליו, העלויות של המסלול משתנות:
| עלות גבוהה מעל הסף | עלות גבוהה מתחת לסף | |||
|---|---|---|---|---|
| פתרון 1 | פתרון 2 | פתרון 1 | פתרון 2 | |
| מספר הקילומטרים נמוך מהסף | 0.45 | 0.38 | 0.45 | 0.38 |
| העלות לק"מ מתחת לסף | 1.00 | 1.00 | 50.00 | 50.00 |
| ק"מ מעל הסף | 3.71 | 3.78 | 3.71 | 3.78 |
| עלות לק"מ מעל הסף | 50.00 | 50.00 | 1.00 | 1.00 |
| עלות כוללת | 185.95 | 189.38 | 26.21 | 22.78 |
בכל גרסה, העלות הכוללת הנמוכה יותר מבין שני הפתרונות מודגשת. אפשר לראות שכאשר משתמשים בעלות גבוהה מעל הסף, העלות הכוללת של המסלול גבוהה יותר במסלול שבו הביקורים מקובצים, וזה ההפך ממה שרציתם להשיג.