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 derShipment
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 ShipmentRoute
s 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 ShipmentRoute
s 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.