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

ההודעה 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 תגדיל את העדיפות של השלמת כל המשלוחים מוקדם יותר.

מאפייני עלות בתגובה של Route Optimization

להודעה 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 הנמוך של המשלוח בהשוואה לערכי costPerHour של 40.0 ו-costPerKilometer של 10.0 ב-Vehicle, מאפשרים לכם לחסוך בעלויות אם תדלגו על המשלוח במקום להשלים אותו.

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

כמה מאפייני ההודעות של 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 מפורטים במאמר דרישות עומס ומגבלות. המגבלות של TimeWindow מפורטות בקטע מגבלות על חלון הזמנים לאיסוף ולמסירה.