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