בדוגמה הזו מוסבר איך להשתמש במאפייני המעבר כדי לתעדף מסלולים שבהם אותם כלי רכב מבצעים באותו חלון זמן איסופים ומשלוחים בסביבה הקרובה. מידע נוסף על מאפייני מעבר זמין במאמר יצירת מודל לוגיקה עסקית באמצעות מאפייני מעבר.
בדוגמה הזו:
- המשלוחים 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 |
אחר→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) כפול מרחק הנסיעה הכולל מעל הסף (3710 מ' = 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→other | 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 |
בכל גרסה, העלות הכוללת הנמוכה מבין שתי האפשרויות מודגשת בכתב מודגש. אפשר לראות שכאשר משתמשים בעלות גבוהה מעל הסף, העלות הכוללת של המסלול שבו הביקורים מקובצים גבוהה יותר עכשיו, בניגוד למה שרצית להשיג.