Kostenmodellparameter

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

  • Schnellere Vehicle-Routen werden gegenüber kürzeren Routen oder umgekehrt priorisiert
  • Entscheiden, ob die Kosten für die Bereitstellung einer Shipment den Wert der Ausführung von Shipment wert sind
  • Abholungen und Lieferungen innerhalb von Zeitfenstern nur dann ausfü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 Kosten-Property

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

  • Vehicle.cost_per_hour: Entspricht den Kosten für den Betrieb eines Fahrzeugs pro Stunde, einschließlich der Zeit für öffentliche Verkehrsmittel, der Wartezeiten, der Besuche und der Pausen.
  • Vehicle.cost_per_kilometer: die Kosten pro Kilometer, die mit dem Fahrzeug zurückgelegt wurden.
  • Vehicle.cost_per_traveled_hour: entspricht den Kosten für den Betrieb eines Fahrzeugs nur während der Fahrt, ohne Warte-, Besuchs- und Pausenzeiten.

Diese Kostenparameter ermöglichen es dem Optimierungstool, Kompromisse zwischen Zeit- und Entfernungsangaben einzugehen. Die durch die optimierte Route entstehenden Kosten werden in der Antwortnachricht 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. Änderungen an den Kostenparametern haben daher nur geringe Auswirkungen.

Shipment Kosten-Property

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

  • Shipment.penalty_cost steht für die Kosten, die durch das Überspringen der Sendung entstehen.
  • Shipment.VisitRequest.cost steht für die Kosten für eine bestimmte Abholung oder Lieferung. Sie dient in erster Linie dazu, einen Kompromiss zwischen mehreren Abhol- oder Lieferoptionen für eine einzelne Sendung zu finden.

Shipment-Kostenparameter verwenden dieselben Dimensionen ohne Einheiten wie Vehicle-Kostenparameter. Angefallene Kosten bis zum Ende einer Shipment übersteigen die Strafkosten. Shipment ist in keiner Vehicle-Route enthalten und wird stattdessen in der Antwortnachricht in der skipped_shipments-Liste angezeigt.

ShipmentModel Kosten-Property

Die ShipmentModel-Nachricht (REST, gRPC) enthält ein einzelnes Kostenattribut, globalDurationCostPerHour. Diese Kosten basieren auf der Gesamtzeit, die alle Fahrzeuge benötigen, um ihre ShipmentRoutes abzuschließen. Durch das Erhöhen von globalDurationCostPerHour wird ein früherer Abschluss aller Sendungen priorisiert.

Kostenattribute der Antwort für die Routenoptimierung

Die OptimizeToursResponse-Nachricht (REST, gRPC) hat 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 für alle Routen in der Antwort anfallen. Jeder routes-Eintrag hat die Attribute routeCosts und routeTotalCosts, die die Kosten für die jeweilige Route darstellen.

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. Das Attribut skippedShipments listet auf, welche Sendungen übersprungen wurden.

In diesem Beispiel wird nur model.shipments[1] in der Beispielanfrage übersprungen. model.shipments[1] hat eine Strafgebühr von 5 Einheiten, was dem gesamten model.shipments.penalty_cost-Schlüssel in der Beispielantwort entspricht. Die geringe penaltyCost der Sendung im Vergleich zu den 40,0 costPerHour und 10,0 costPerKilometer der Vehicle der Vehicle macht es kostengünstiger, die Sendung zu überspringen, als sie abzuschließen.

Weiterführendes Thema: Kosten und weiche Einschränkungen

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

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

In ähnlicher Weise haben TimeWindow-Einschränkungen (REST, gRPC) die Attribute soft_start_time und soft_end_time. Die entsprechenden Attribute cost_per_hour_before_soft_start_time und cost_per_hour_after_soft_end_time hängen davon ab, wie früh oder spät das eingeschränkte Ereignis in Bezug auf TimeWindow eintritt.

Wie bei allen Kostenmodellparametern werden die Kosten für eine weiche Einschränkung in denselben Maßstäben ausgedrückt wie bei anderen Kostenparametern.

LoadLimit-Einschränkungen werden unter Lastanforderungen und -limits ausführlich behandelt. TimeWindow-Einschränkungen werden unter Einschränkungen für Abhol- und Lieferzeitfenster ausführlich behandelt.