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

מפתחים באזור הכלכלי האירופי (EEA)

ההודעה 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 מייצג את העלות שנובעת מדילוג על המשלוח. אם לא מגדירים את הפרמטר 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, בהשוואה ל-40.0 costPerHour ו-10.0 costPerKilometer, הופך את דילוג על המשלוח למשתלם יותר מאשר השלמתו.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 מוסברות בפירוט במאמר Load Demands and Limits. TimeWindow מפורטות במאמר הגבלות על חלונות זמן לאיסוף ולמשלוח.