Kostenmodellparameter

Die OptimizeToursRequest-Nachricht (REST, gRPC) enthält eine Reihe von Eigenschaften im Zusammenhang mit Kosten. Zusammengenommen 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 Fertigstellung der Shipment wert sind
  • Abholungen und Lieferungen nur innerhalb von Zeitfenstern 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 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, den das Fahrzeug zurücklegt.
  • Vehicle.cost_per_traveled_hour: Gibt die Kosten für den Betrieb eines Fahrzeugs nur während der Fahrt an, ausgenommen Warte-, Besuchs- und Pausenzeiten.

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

Wenn costPerHour steigt, versucht der Optimierer, schnellere Routen zu finden, die nicht unbedingt die kürzesten sind. In diesem Beispiel ist die schnellste Route die kürzeste. Änderungen an den Kostenparametern haben daher nur geringe Auswirkungen.

Shipment Kosteneigenschaften

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

  • Shipment.penalty_cost entspricht den 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.

Für Shipment-Kostenparameter werden dieselben dimensionslosen Einheiten wie für Vehicle-Kostenparameter verwendet. Wenn die Kosten für die Ausführung einer Shipment die Kostenpauschale übersteigen, ist die Shipment nicht in der Route einer Vehicle enthalten und wird stattdessen in der Antwortnachricht in der Liste skipped_shipments aufgeführt.

ShipmentModel Kosten-Property

Die ShipmentModel-Nachricht (REST, gRPC) enthält eine einzelne Kosteneigenschaft, globalDurationCostPerHour. Diese Kosten ergeben sich aus der Gesamtzeit, die alle Fahrzeuge benötigen, um ihre ShipmentRoutes abzuschließen. Wenn Sie globalDurationCostPerHour erhöhen, werden alle Sendungen früher abgeschlossen.

Kostenattribute der Antwort für die Routenoptimierung

Die OptimizeToursResponse-Nachricht (REST, gRPC) enthält Kosteneigenschaften, die die Kosten für die Ausführung von ShipmentRoutes darstellen. Die Eigenschaften 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 Eigenschaften routeCosts und routeTotalCosts, die die Kosten für diese 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 entspricht den Kosten, die durch übersprungene Sendungen entstanden sind. In der Property skippedShipments werden die übersprungenen Sendungen aufgeführt.

In diesem Beispiel wird nur model.shipments[1] in der Beispielanfrage übersprungen. model.shipments[1] hat eine Strafgebühr von 5 Einheiten, was dem Schlüssel „total“model.shipments.penalty_cost in der Beispielantwort entspricht. Da der Wert für penaltyCost der Sendung im Vergleich zu den 40,0 costPerHour und 10,0 costPerKilometer der Vehicle niedrig ist, ist es kostengünstiger, die Sendung zu überspringen, als sie abzuschließen.

Fortgeschrittenes Thema: Kosten und weiche Einschränkungen

Mehrere Eigenschaften von OptimizeToursRequest-Nachrichten (REST, gRPC) stellen weiche Einschränkungen dar. Das sind Einschränkungen, die Kosten verursachen, wenn sie nicht erfüllt werden.

Beispiel: Fahrzeugeinschränkungen vom Typ LoadLimit (REST, gRPC) haben die Properties softMaxLoad und costPerUnitAboveSoftMax. Zusammen verursachen diese Kosten, die proportional zu den Lasteinheiten sind, die softMaxLoad überschreiten. Das Limit kann daher nur überschritten werden, wenn dies aus Kostengründen sinnvoll ist.

Ähnlich haben TimeWindow-Einschränkungen (REST, gRPC) soft_start_time- und soft_end_time-Properties mit entsprechenden cost_per_hour_before_soft_start_time- und cost_per_hour_after_soft_end_time-Werten, die davon abhängen, wie früh oder spät das eingeschränkte Ereignis im Verhältnis zur TimeWindow eintritt.

Wie alle Parameter des Kostenmodells werden die Kosten für weiche Einschränkungen in denselben dimensionslosen Einheiten wie andere Kostenparameter ausgedrückt.

LoadLimit-Einschränkungen werden unter Anforderungen und Limits für die Auslastung ausführlich behandelt. TimeWindow-Einschränkungen werden unter Einschränkungen für Abhol- und Lieferzeitfenster ausführlich behandelt.