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

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