פרמטרים של מודל עלות

ההודעה OptimizeToursRequest (REST, gRPC) מכילה מספר מאפיינים שקשורים לעלויות. ביחד, הפרמטרים האלה מייצגים את מודל העלות של הבקשה. מודל העלות עונה על רבים מיעדי האופטימיזציה ברמה העליונה של הבקשה, כמו:

  • מתן עדיפות למסלולי Vehicle מהירים יותר על פני מסלולים קצרים יותר או להפך
  • ההחלטה אם העלות של הצגת Shipment שווה לערך של השלמת Shipment
  • ביצוע איסופים ומשלוחים בטווחי זמן מסוימים בלבד הוא משתלם

ראה בקשה לדוגמה עם עלויות

{
  "model": {
    "globalStartTime": "2023-01-13T16:00:00-08:00",
    "globalEndTime": "2023-01-14T16:00:00-08:00",
    "shipments": [
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789456,
              "longitude": -122.390192
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 100.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 5.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 50.0
      }
    ],
    "vehicles": [
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0
      }
    ]
  }
}
    

Vehicle מאפייני עלות

להודעה ב-Vehicle (REST, gRPC) יש כמה מאפייני עלות:

  • Vehicle.cost_per_hour: מייצג את עלות תפעול הרכב לשעה, כולל זמני תחבורה ציבורית, המתנה, ביקור והפסקה.
  • Vehicle.cost_per_kilometer: מייצג את העלות לקילומטר שנסע ברכב.
  • Vehicle.cost_per_traveled_hour: מייצג את עלות השימוש ברכב רק בזמן הנסיעה, לא כולל זמני המתנה, ביקור והפסקה.

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

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

Shipment מאפייני עלות

להודעה ב-Shipment (REST, gRPC) יש גם כמה פרמטרים של עלות:

  • Shipment.penalty_cost מייצג את העלות של דילוג על המשלוח.
  • הערך Shipment.VisitRequest.cost מייצג את העלות של איסוף או משלוח ספציפיים, ומשמש בעיקר כדי לאזן בין כמה אפשרויות של איסוף או מסירה של משלוח יחיד.

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

ShipmentModel מאפייני עלות

ההודעה ב-ShipmentModel (REST, gRPC) כוללת מאפיין עלות יחידה, globalDurationCostPerHour. העלות הזו מבוססת על הזמן הכולל שנדרש לכל כלי הרכב כדי להשלים את ShipmentRoute. הגדלת globalDurationCostPerHour נותנת עדיפות להשלמה מוקדמת של כל המשלוחים.

מאפייני עלות של תגובה לאופטימיזציה של ניתוב

להודעה OptimizeToursResponse (REST, gRPC) יש מאפייני עלות שמייצגים את העלויות שנצברו בתהליך השלמת ה-ShipmentRoute. המאפיינים metrics.costs ו-metrics.totalCost מייצגים את מספר יחידות העלות שנצברו בכל הנתיבים בתגובה. לכל רשומה של routes יש את המאפיינים routeCosts ו-routeTotalCosts שמייצגים את העלויות של המסלול הספציפי הזה.

צפייה בתשובה לבקשה לדוגמה עם עלויות

{
  "routes": [
    {
      "vehicleStartTime": "2023-01-14T00:00:00Z",
      "vehicleEndTime": "2023-01-14T00:28:22Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2023-01-14T00:00:00Z",
          "detour": "0s"
        },
        {
          "shipmentIndex": 2,
          "isPickup": true,
          "startTime": "2023-01-14T00:02:30Z",
          "detour": "150s"
        },
        {
          "startTime": "2023-01-14T00:08:55Z",
          "detour": "150s"
        },
        {
          "shipmentIndex": 2,
          "startTime": "2023-01-14T00:21:21Z",
          "detour": "572s"
        }
      ],
      "transitions": [
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-14T00:00:00Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-14T00:02:30Z"
        },
        {
          "travelDuration": "235s",
          "travelDistanceMeters": 795,
          "waitDuration": "0s",
          "totalDuration": "235s",
          "startTime": "2023-01-14T00:05:00Z"
        },
        {
          "travelDuration": "496s",
          "travelDistanceMeters": 1893,
          "waitDuration": "0s",
          "totalDuration": "496s",
          "startTime": "2023-01-14T00:13:05Z"
        },
        {
          "travelDuration": "171s",
          "travelDistanceMeters": 665,
          "waitDuration": "0s",
          "totalDuration": "171s",
          "startTime": "2023-01-14T00:25:31Z"
        }
      ],
      "metrics": {
        "performedShipmentCount": 2,
        "travelDuration": "902s",
        "waitDuration": "0s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "800s",
        "totalDuration": "1702s",
        "travelDistanceMeters": 3353
      },
      "routeCosts": {
        "model.vehicles.cost_per_kilometer": 33.53,
        "model.vehicles.cost_per_hour": 18.911111111111111
      },
      "routeTotalCost": 52.441111111111113
    }
  ],
  "skippedShipments": [
    {
      "index": 1
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 2,
      "travelDuration": "902s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "800s",
      "totalDuration": "1702s",
      "travelDistanceMeters": 3353
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2023-01-14T00:00:00Z",
    "latestVehicleEndTime": "2023-01-14T00:28:22Z",
    "totalCost": 57.441111111111113,
    "costs": {
      "model.vehicles.cost_per_kilometer": 33.53,
      "model.vehicles.cost_per_hour": 18.911111111111111,
      "model.shipments.penalty_cost": 5
    }
  }
}
    

בתשובה לדוגמה, metrics.costs ברמה העליונה הם:

{
  "metrics": {
    ...
    "costs": {
      "model.vehicles.cost_per_hour": 18.911111111111111,
      "model.vehicles.cost_per_kilometer": 33.53,
      "model.shipments.penalty_cost": 5
    }
  }
}

הערך של model.shipments.penalty_cost מייצג את העלות שנובעת ממשלוחים שדילגו. במאפיין skippedShipments מצוין על אילו משלוחים דילגתם.

בדוגמה הזו, המערכת תדלג רק על model.shipments[1] בבקשה לדוגמה. ל-model.shipments[1] יש עלות קנס של 5 יחידות, שזהה למפתח model.shipments.penalty_cost הכולל בתשובה לדוגמה. הערך penaltyCost הנמוך של המשלוח בהשוואה לגרסאות 40.0 costPerHour ו-10.0 של Vehicle, ולכן משתלם יותר לדלג על המשלוח מאשר להשלים אותו.costPerKilometer

נושא מתקדם: עלויות ומגבלות רכות

חלק ממאפייני ההודעה OptimizeToursRequest (REST, gRPC) מייצגים אילוצים רכים, שהם אילוצים שמובילים לעלות כשלא ניתן למלא אותם.

לדוגמה, לאילוצים של רכב LoadLimit (REST, gRPC) יש מאפיינים softMaxLoad ו-costPerUnitAboveSoftMax. יחד, כל העלויות האלה כפופות לעלות היחסית ליחידות העומס שחורגות מ-softMaxLoad, וכך ניתן לחרוג מהמגבלה רק אם הדבר הגיוני מבחינת העלות.

באופן דומה, לאילוצים של TimeWindow (REST, gRPC) יש מאפיינים soft_start_time ו-soft_end_time, עם מאפיינים cost_per_hour_before_soft_start_time ו-cost_per_hour_after_soft_end_time תואמים, שנצברו בהתאם למועד המוקדם או המאוחר של האירוע המוגבל, תוך התייחסות ל-TimeWindow.

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

פירוט לגבי האילוצים של LoadLimit מופיע בקטע Load Demands and Limits (ביקוש ומגבלות). פירוט האילוצים על TimeWindow מפורט בקטע מגבלות על חלון זמן האיסוף והמסירה.