Parameter für das Kostenmodell

Entwickler im Europäischen Wirtschaftsraum (EWR)

Die OptimizeToursRequest-Nachricht (REST, gRPC) enthält eine Reihe von Eigenschaften, die sich auf Kosten beziehen. Zusammen bilden diese Kostenparameter das Kostenmodell der Anfrage. Das Kostenmodell berücksichtigt viele der übergeordneten Optimierungsziele der Anfrage, z. B.:

  • Schnellere Vehicle-Routen gegenüber kürzeren Routen priorisieren oder umgekehrt
  • Entscheiden, ob die Kosten für die Bereitstellung einer Shipment den Wert der Fertigstellung der Shipment wert sind.
  • Abholungen und Lieferungen innerhalb von Zeitfenstern nur dann durchführen, wenn dies kosteneffizient ist

Beispielanfrage mit Kosten ansehen

{
  "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 – Kostenattribute

Die Nachricht Vehicle (REST, gRPC) hat mehrere Kostenattribute:

  • Vehicle.cost_per_hour: Die Kosten für den Betrieb eines Fahrzeugs pro Stunde, einschließlich Fahr-, Warte-, Besuchs- und Pausenzeiten.
  • Vehicle.cost_per_kilometer: Die Kosten pro Kilometer, die das Fahrzeug zurückgelegt hat.
  • Vehicle.cost_per_traveled_hour: Die Kosten für den Betrieb eines Fahrzeugs nur während der Fahrt, ohne Warte-, Besuchs- und Pausenzeiten.

Mit diesen Kostenparametern kann der Optimierer Kompromisse zwischen Zeit und zurückgelegter Entfernung eingehen. Die Kosten für die optimierte Route werden in der Antwortnachricht als metrics.costs angezeigt:

Wenn costPerHour zunimmt, versucht der Optimierer, schnellere Routen zu finden, die möglicherweise nicht die kürzesten Routen sind. In diesem Beispiel ist die schnellste Route zufällig auch die kürzeste, sodass sich Änderungen an den Kostenparametern nur geringfügig auswirken.

Shipment – Kostenattribute

Die Shipment-Nachricht (REST, gRPC) hat auch mehrere Kostenparameter:

  • Shipment.penalty_cost steht für die Kosten, die durch das Überspringen der Sendung entstehen. Wenn Sie den penalty_cost-Parameter einer Sendung nicht festlegen, ist die Sendung erforderlich. Das bedeutet, dass die Sendung nur übersprungen wird, wenn sie aufgrund der angegebenen Einschränkungen nicht abgeschlossen werden kann.
  • Shipment.VisitRequest.cost steht für die Kosten einer bestimmten Abholung oder Lieferung. Sie wird hauptsächlich verwendet, um Kostenabwägungen zwischen mehreren Abhol- oder Lieferoptionen für eine einzelne Sendung zu ermöglichen.

Für Shipment-Kostenparameter werden dieselben dimensionslosen Einheiten wie für Vehicle-Kostenparameter verwendet. Wenn die Kosten für die Durchführung von Shipment die Strafkosten übersteigen, wird Shipment nicht in die Route von Vehicle aufgenommen, sondern in der Antwortnachricht in der Liste skipped_shipments angezeigt.

ShipmentModel – Kostenattribute

Die Nachricht ShipmentModel (REST, gRPC) enthält die einzelne Kosten-Property globalDurationCostPerHour. Diese Kosten fallen basierend auf der Gesamtzeit an, die alle Fahrzeuge für die Ausführung ihrer ShipmentRoute benötigen. Wenn Sie globalDurationCostPerHour erhöhen, werden alle Sendungen früher abgeschlossen.

Eigenschaften für Reaktionskosten für Route Optimization

Die OptimizeToursResponse-Nachricht (REST, gRPC) enthält Kosteneigenschaften, die die Kosten darstellen, die bei der Ausführung von ShipmentRoutes anfallen. Die Attribute metrics.costs und metrics.totalCost geben die Anzahl der Kosten-Einheiten an, die für alle Routen in der Antwort angefallen sind. Jeder routes-Eintrag hat die Attribute routeCosts und routeTotalCosts, die die Kosten für die jeweilige Route darstellen.

Antwort auf die Beispielanfrage mit Kosten

{
  "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
    }
  }
}
    

In der Beispielantwort sind die metrics.costs der obersten Ebene:

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

Der Wert model.shipments.penalty_cost steht für die Kosten, die durch übersprungene Sendungen entstanden sind. In der Property skippedShipments wird aufgeführt, welche Sendungen übersprungen wurden.

In diesem Beispiel wird nur model.shipments[1] in der Beispielanfrage übersprungen. model.shipments[1] hat Strafkosten von 5 Einheiten, was dem Gesamtschlüssel model.shipments.penalty_cost in der Beispielantwort entspricht. Die niedrige penaltyCost der Sendung im Vergleich zu den 40,0 costPerHour und 10,0 costPerKilometer des Vehicle machen es kostengünstiger, die Sendung zu überspringen, als sie abzuschließen.

Erweitertes Thema: Kosten und weiche Einschränkungen

Mehrere OptimizeToursRequest-Nachrichteneigenschaften (REST, gRPC) stellen weiche Einschränkungen dar. Das sind Einschränkungen, die Kosten verursachen, wenn sie nicht erfüllt werden können.

Die Einschränkungen für das Fahrzeug LoadLimit (REST, gRPC) haben beispielsweise die Eigenschaften softMaxLoad und costPerUnitAboveSoftMax. Zusammen verursachen diese Kosten, die proportional zu den Lasteinheiten sind, die softMaxLoad überschreiten. Das Limit kann also nur überschritten werden, wenn dies aus Kostensicht sinnvoll ist.

Ähnlich verhält es sich mit TimeWindow-Einschränkungen (REST, gRPC). Sie haben die Eigenschaften soft_start_time und soft_end_time mit den entsprechenden cost_per_hour_before_soft_start_time und cost_per_hour_after_soft_end_time, die je nachdem anfallen, wie früh oder spät das eingeschränkte Ereignis in Bezug auf TimeWindow eintritt.

Wie bei allen Parametern des Kostenmodells werden die Kosten für Soft Constraints in denselben dimensionslosen Einheiten wie andere Kostenparameter ausgedrückt.

LoadLimit-Einschränkungen werden ausführlich unter Load Demands and Limits (Lastanforderungen und ‑limits) behandelt. TimeWindow-Einschränkungen werden ausführlich unter Einschränkungen für Zeitfenster für Abholung und Lieferung behandelt.