Kostenmodellparameter

Die OptimizeToursRequest-Nachricht (REST, gRPC) enthält eine Reihe von Attributen im Zusammenhang mit den Kosten. Zusammen bilden diese Kostenparameter das Kostenmodell der Anfrage. Das Kostenmodell erfasst viele übergeordnete Optimierungsziele der Anfrage, z. B.:

  • Priorisierung schnellerer Vehicle-Routen gegenüber kürzeren Routen oder umgekehrt
  • Entscheiden, ob die Kosten für die Bereitstellung eines Shipment den Wert des Abschlusses von Shipment wert sind
  • Abholungen und Lieferungen innerhalb von Zeitfenstern nur dann durchführen, wenn dies kostengünstig 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 Kosteneigenschaften

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

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

Diese Kostenparameter ermöglichen es dem Optimierer, Kompromisse zwischen der Reisezeit und der zurückgelegten Entfernung vorzunehmen. Die Kosten, die für die optimierte Route anfallen, werden in der Antwort als metrics.costs angezeigt:

Wenn costPerHour zunimmt, versucht die Optimierung, schnellere Routen zu finden, die möglicherweise nicht die kürzesten Routen sind. In diesem Beispiel ist die schnellste Route die kürzeste, daher haben Änderungen an den Kostenparametern nur geringe Auswirkungen.

Shipment Kosteneigenschaften

Die Shipment-Nachricht (REST, gRPC) enthält ebenfalls mehrere Kostenparameter:

  • Shipment.penalty_cost steht für die Kosten, die dadurch entstehen, dass die Lieferung übersprungen wird.
  • Shipment.VisitRequest.cost steht für die Kosten einer bestimmten Abholung oder Lieferung. Sie wird hauptsächlich dazu verwendet, einen Kompromiss zwischen mehreren Abhol- oder Lieferoptionen für eine einzelne Sendung zu schaffen.

Die Kostenparameter Shipment verwenden die gleichen Dimensionslosen Einheiten wie Vehicle-Kostenparameter. Die anfallenden Kosten eines Shipment überschreiten die Strafkosten. Das Shipment ist auf der Route von Vehicle nicht enthalten und wird stattdessen in der Liste skipped_shipments in der Antwortnachricht angezeigt.

ShipmentModel Kosteneigenschaften

Die ShipmentModel-Nachricht (REST, gRPC) enthält das Kostenattribut globalDurationCostPerHour. Diese Kosten werden basierend auf der Gesamtzeit berechnet, die für den Abschluss der ShipmentRoutes aller Fahrzeuge benötigt wird. Durch Erhöhen von globalDurationCostPerHour wird der frühere Abschluss aller Lieferungen priorisiert.

Antwortkostenattribute für die Routenoptimierung

Die OptimizeToursResponse-Nachricht (REST, gRPC) enthält Kostenattribute, die die Kosten darstellen, die beim Ausführen von ShipmentRoutes anfallen. Die Attribute metrics.costs und metrics.totalCost geben die Anzahl der Kosteneinheiten an, die auf allen Routen in der Antwort anfallen. Jeder routes-Eintrag hat die Attribute routeCosts und routeTotalCosts, die die Kosten für die jeweilige Route angeben.

Antwort auf die Beispielanfrage mit Kosten ansehen

{
  "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 aufgrund übersprungener Sendungen anfallen. Die Property skippedShipments listet auf, welche Sendungen übersprungen wurden.

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

Weiterführendes Thema: Kosten und weiche Einschränkungen

Mehrere Attribute von OptimizeToursRequest-Nachrichten (REST, gRPC) stellen weiche Einschränkungen dar. Dies sind Einschränkungen, für die Kosten anfallen, wenn sie nicht erfüllt werden können.

Beispielsweise haben Einschränkungen für LoadLimit (REST, gRPC) für Fahrzeuge die Attribute softMaxLoad und costPerUnitAboveSoftMax. Zusammen verursachen diese Kosten proportional zu den Ladeeinheiten, die softMaxLoad überschreiten. Daher kann das Limit nur dann überschritten werden, wenn dies aus Kostensicht sinnvoll ist.

In ähnlicher Weise haben TimeWindow-Einschränkungen (REST, gRPC) die Attribute soft_start_time und soft_end_time, mit entsprechenden cost_per_hour_before_soft_start_time und cost_per_hour_after_soft_end_time, die abhängig davon 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 weiche Einschränkungen in denselben Dimensionslosen Einheiten wie bei anderen Kostenparametern ausgedrückt.

Einschränkungen vom Typ LoadLimit werden unter Lastanforderungen und -limits ausführlich behandelt. Die Einschränkungen für TimeWindow werden unter Einschränkungen für Abhol- und Lieferzeiten ausführlich behandelt.