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 vor 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 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: Die Kosten für den Betrieb eines Fahrzeugs pro Stunde, einschließlich Fahrt-, Warte-, Besuchs- und Pausenzeiten.
  • 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 auch die kürzeste, sodass Änderungen an den Kostenparametern nur wenig Auswirkungen haben.

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 einer bestimmten Abholung oder Lieferung. Dieses Attribut wird hauptsächlich verwendet, um Kostenvergleiche 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 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 Kosteneigenschaften

Die ShipmentModel-Nachricht (REST, gRPC) enthält eine einzelne Kosteneigenschaft, globalDurationCostPerHour. Diese Kosten beruhen auf der Gesamtzeit, die für die Durchführung der ShipmentRoute aller Fahrzeuge erforderlich ist. Wenn Sie globalDurationCostPerHour erhöhen, werden alle Sendungen früher abgeschlossen.

Eigenschaften für Antwortkosten bei 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 angefallen sind. Jeder routes-Eintrag hat die Eigenschaften routeCosts und routeTotalCosts, die die Kosten für diese Route darstellen.

Beispielantwort 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.

Beispielsweise haben Fahrzeugeinschränkungen vom Typ LoadLimit (REST, gRPC) die Properties 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 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 je nachdem, wie früh oder spät das eingeschränkte Ereignis im Verhältnis zur TimeWindow eintritt, anfallen.

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 Zeitfenster für Abholung und Lieferung ausführlich behandelt.