עדיפות לביקורים בקרבת מקום באמצעות מאפייני מעבר

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

בדוגמה הזו:

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

דוגמה למסירות של משלוחים באותה דרך. יש שלוש משלוחים, A,‏ B ו-C, בדרך מהמחסן למשלוחים אחרים. נקודה A נמצאת במרחק 1, 000 מ' מהמחסן, נקודה B נמצאת במרחק 50 מ' נוסף מהמחסן ונקודה C נמצאת במרחק 30 מ' נוסף באותו כיוון. יש משלוחים אחרים במרחק 1,000 מ' מ-C.

במצב כזה, ובבקשה שמשתמשת רק בעלות לשעה ובעלות לקילומטר, יכול להיות שבמסלול המותאם אישית הטיפול בבקשות A ו-B יתבצע בבוקר והטיפול בבקשה C יתבצע בערב, והעלות של הפתרון תהיה זהה לזו שתהיה אם כל שלוש הבקשות יטופלו בו-זמנית.

עלות לקילומטר עם סף

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

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

כדי להגדיר את העלויות, מוסיפים רשומה חדשה ל-ShipmentModel.transition_attributes עם המאפיינים הבאים:

{
  "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

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