עלויות טעינה

עלויות הטעינה מוגדרות במאפיין loadLimits של Vehicle בקטע ShipmentModel.

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

אפשר להגדיר עלויות טעינה כדי לתמוך ביעדים כמו:

  • צריך לקחת בחשבון את עלויות הדלק שעולות ככל שמשקל המטען עולה.
  • מומלץ להימנע מניתוב כלי רכב עמוסים למרחקים ארוכים.
  • קחו בחשבון את הבלאי של הרכב כתוצאה ממטען כבד.

מאפיינים

מציינים את עלויות הטעינה במאפיין loadLimits של Vehicle. בדומה לכל פרמטרי העלות האחרים, העלויות של העומס מבוססות על יחידות עלות יחסיות חסרות ממד.

אפשר להגדיר עלויות טעינה באמצעות המאפיינים הבאים:

נכס סוג תיאור
costPerKilometer אובייקט כולל אובייקט מסוג LoadCost לחישוב עלויות נסיעה על סמך קילומטרים שנסעו.
costPerTraveledHour אובייקט מכיל אובייקט מסוג LoadCost לחישוב עלויות נסיעה על סמך שעות הנסיעה, לא כולל זמני המתנה, ביקורים והפסקות.

LoadCost

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

אובייקט LoadCost מכיל את פרמטרים ההגדרה הבאים:

פרמטר סוג תיאור
loadThreshold מחרוזת (פורמט int64) רמת העומס שבה משתנה קצב חישוב העלות. ברירת המחדל היא 0.
costPerUnitAboveThreshold מספר העלות שחלה על כל יחידת עומס מעל loadThreshold. ברירת המחדל היא 0.
costPerUnitBelowThreshold מספר העלות שחלה על כל יחידת עומס שקטנה או שווה ל-loadThreshold. ברירת המחדל היא 0.

התאמה בין עלויות טעינה למשלוחים

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

דוגמאות

בקטע הזה מופיעות שלוש דוגמאות:

דוגמאות קוד

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

{
  "model": {
    "vehicles": [{
      "loadLimits": {
        "LOAD_TYPE": {
          "maxLoad": "MAX_LOAD",
          "costPerKilometer": {
            "loadThreshold": "LOAD_THRESHOLD",
            "costPerUnitAboveThreshold": COST_ABOVE,
            "costPerUnitBelowThreshold": COST_BELOW
          }
        }
      }
    }]
  }
}

תרחיש לדוגמה

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

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

הורה נכס סוג ערך תרחיש
loadLimits סוג העמסה מחרוזת weightKg הגדרה של סוג הקיבולת למעקב. בדוגמה הזו, הערך weightKg מייצג את משקל המטען בקילוגרמים.
loadLimits maxLoad מחרוזת 100 משקל המטען המקסימלי שהרכב יכול לשאת.
costPerKilometer loadThreshold מחרוזת 15 ההגדרה קובעת את סף עומס הבסיס. על כל משקל מטען מעל 15 ק"ג חלה קנס על עלות הדלק שמבוסס על העומס.
costPerKilometer costPerUnitAboveThreshold number 1 הערך הזה משמש כמקדם של עלות הדלק. על כל קילומטר נסיעה, כל קילוגרם של מטען מעל סף 15 ק"ג מחויב ביחידת עלות אחת.
loadDemands amount מחרוזת משלוח 1: 50
משלוח 2: 10
משלוח 3: 80
מציינים את משקל המטען לכל אחת משלוש המשלוחים.

בתרחיש הזה, לערכים שהגדרתם יש את ההשפעות הבאות:

  • הכלי לאופטימיזציה מסדר את המסלולים כך שהחבילות הכבדות ביותר יסופקו ראשונות. הפתרון שמתקבל מתזמן את המשלוחים של 80 ק"ג ו-50 ק"ג בתחילת המסלול כדי למזער את המרחק שנוסעים עם משקל כבד.
  • הכלי לאופטימיזציה מסדר את המסלולים כדי לצמצם את המרחק שנוסעים עם מטען כבד. כדי לראות איך ההגדרות האלה משפיעות על המסלולים, אפשר להגדיל את costPerUnitAboveThreshold מ-1 ל-5. אם מגדילים את קנס המשקל, המערכת תפעל עוד יותר כדי למזער את המרחק שיידרש לנסיעה עם מטען כבד יותר. יכול להיות שהיא תסדר מחדש את רשימת המשלוחים או שתפצל את המשלוחים בין כמה כלי רכב.

דוגמה לבקשה

בדוגמה הבאה מוצג המבנה של בקשת optimizeTours בסיסית שכוללת את ערכי עלות הטעינה מהתרחיש לדוגמה:

{
  "model": {
    "shipments": [
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789456,
              "longitude": -122.390192
            },
            "duration": "250s"
          }
        ],
        "penaltyCost": 100.0,
        "loadDemands": {
          "weightKg": {
            "amount": "50"
          }
        }
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s"
          }
        ],
        "penaltyCost": 30.0,
        "loadDemands": {
          "weightKg": {
            "amount": "10"
          }
        }
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s"
          }
        ],
        "penaltyCost": 50.0,
        "loadDemands": {
          "weightKg": {
            "amount": "80"
          }
        }
      }
    ],
    "vehicles": [
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0,
        "loadLimits": {
          "weightKg": {
            "maxLoad": "100",
            "costPerKilometer": {
              "loadThreshold": "15",
              "costPerUnitAboveThreshold": 1
            }
          }
        }
      }
    ]
  }
}

נוסחאות חישוב

הכלי לאופטימיזציה מחשב את עלויות הטעינה באמצעות הנוסחאות הבאות.

חישוב מלא של סכום הסף

אם מציינים גם costPerUnitAboveThreshold וגם costPerUnitBelowThreshold, העלויות של המשלוחים יהיו שונות בהתאם לסכום המטען, אם הוא גבוה מ-loadThreshold או נמוך ממנו. הנוסחה היא:

cost = max(carried_load - load_threshold, 0) * distance_or_time * cost_per_unit_above_threshold
       + min(carried_load, load_threshold) * distance_or_time * cost_per_unit_below_threshold

לדוגמה, אם משתמשים בערכים מדוגמת הבקשה, שבהם הערך של costPerUnitBelowThreshold הוא 2, ואם הרכב נוסע 10 קילומטרים עם מטען של 50, החישוב הוא:

max(50 - 15, 0) * 10 * 1 + min(50, 15) * 10 * 2 = 650 cost units

חישוב מעל הסף

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

cost = max(carried_load - load_threshold, 0) * distance_or_time * cost_per_unit_above_threshold

לדוגמה, אם משתמשים בערכים מבקשה לדוגמה שבהם loadThreshold הוא 15 ו-costPerUnitAboveThreshold הוא 1, והרכב נוסע 10 קילומטרים עם מטען של 50, החישוב הוא:

max(50 - 15, 0) * 10 * 1 = 350 cost units

חישוב מתחת לסף

באופן סימטרי, אם מציינים רק costPerUnitBelowThreshold, החישוב הוא מקרה מיוחד נוסף של נוסחת הסף המלאה, שבו העלות מעל הסף היא אפס. הנוסחה היא:

cost = min(carried_load, load_threshold) * distance_or_time * cost_per_unit_below_threshold