Die OptimizeToursRequest-Nachricht (REST, gRPC) enthält eine Reihe von Eigenschaften, die sich auf Kosten beziehen. Zusammen bilden diese Kostenparameter das Kostenmodell der Anfrage. Das Kostenmodell berücksichtigt viele der übergeordneten Optimierungsziele der Anfrage, z. B.:
- Schnellere
Vehicle-Routen gegenüber kürzeren Routen priorisieren oder umgekehrt - Entscheiden, ob die Kosten für die Bereitstellung eines
Shipmentden Wert der Fertigstellung desShipmentwert sind. - Abholungen und Lieferungen innerhalb von Zeitfenstern nur dann durchführen, wenn dies kosteneffizient 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 Nachricht Vehicle (REST, gRPC) hat mehrere Kostenattribute:
Vehicle.cost_per_hour: Die Kosten für den Betrieb eines Fahrzeugs pro Stunde, einschließlich Fahr-, Warte-, Besuchs- und Pausenzeiten.Vehicle.cost_per_kilometer: Die Kosten pro Kilometer, die das Fahrzeug zurückgelegt hat.Vehicle.cost_per_traveled_hour: Die Kosten für den Betrieb eines Fahrzeugs nur während der Fahrt, ohne Warte-, Besuchs- und Pausenzeiten.
Mit diesen Kostenparametern kann der Optimierer Kompromisse zwischen Zeit und zurückgelegter Entfernung eingehen. Die Kosten für die optimierte Route werden in der Antwortnachricht als metrics.costs angezeigt:
Mit zunehmendem costPerHour versucht der Optimierer, schnellere Routen zu finden, die möglicherweise nicht die kürzesten Routen sind. In diesem Beispiel ist die schnellste Route zufällig auch die kürzeste, daher haben Änderungen der Kostenparameter nur geringe Auswirkungen.
Shipment – Kosteneigenschaften
Die Shipment-Nachricht (REST, gRPC) hat auch mehrere Kostenparameter:
Shipment.penalty_coststellt die Kosten dar, die durch Auslassen der Lieferung entstehen. Nicht wird derpenalty_costParameter einer Sendung festgelegt, was bedeutet, dass die Sendung obligatorisch ist. Dies bedeutet, dass die Sendung nur dann übersprungen wird, wenn sie aufgrund der festgelegten Einschränkungen nicht abgeschlossen werden kann.Shipment.VisitRequest.coststeht für die Kosten einer bestimmten Abholung oder Lieferung. Sie wird hauptsächlich verwendet, um Kostenabwägungen zwischen mehreren Abhol- oder Lieferoptionen für eine einzelne Sendung zu ermöglichen.
Die Kostenparameter Shipment verwenden dieselben dimensionslosen Einheiten wie die Kostenparameter Vehicle. Wenn die Kosten für die Fertigstellung von Shipment die Strafkosten übersteigen, wird Shipment nicht in die Route von Vehicle aufgenommen, sondern in der Antwortnachricht in der Liste skipped_shipments angezeigt.
ShipmentModel – Kosteneigenschaften
Die Nachricht ShipmentModel (REST, gRPC) enthält eine einzelne Kosteneigenschaft, globalDurationCostPerHour. Diese Kosten entstehen auf Basis der Gesamtzeit, die alle Fahrzeuge für die Durchführung ihrer ShipmentRoutes benötigen. Durch Erhöhen von globalDurationCostPerHour wird die frühere Fertigstellung aller Sendungen priorisiert.
Kostenbezogene Eigenschaften der Antwort für die Routenoptimierung
Die OptimizeToursResponse-Nachricht (REST, gRPC) enthält Kosteneigenschaften, die die Kosten darstellen, die bei der Ausführung von ShipmentRoute anfallen.
Die Attribute metrics.costs und metrics.totalCost geben die Anzahl der Kosten-Einheiten an, die für alle Routen in der Antwort angefallen sind. 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 durch übersprungene Sendungen entstanden sind. In der Property skippedShipments wird aufgeführt, welche Sendungen übersprungen wurden.
In diesem Beispiel wird nur model.shipments[1] in der Beispielanfrage übersprungen.
model.shipments[1] hat Strafkosten von 5 Einheiten, was dem Gesamtschlüssel model.shipments.penalty_cost in der Beispielantwort entspricht. Die niedrige penaltyCost der Sendung im Vergleich zu den 40,0 costPerHour und 10,0 costPerKilometer des Vehicle macht es kostengünstiger, die Sendung zu überspringen, als sie abzuschließen.
Erweitertes Thema: Kosten und weiche Einschränkungen
Mehrere OptimizeToursRequest-Nachrichteneigenschaften (REST, gRPC) stellen weiche Einschränkungen dar. Das sind Einschränkungen, die Kosten verursachen, wenn sie nicht erfüllt werden können.
Die Einschränkungen für das Fahrzeug LoadLimit (REST, gRPC) haben beispielsweise die Eigenschaften softMaxLoad und costPerUnitAboveSoftMax. Zusammen verursachen diese Kosten einen Betrag, der proportional zu den Lasteinheiten ist, die softMaxLoad überschreiten. Die Grenze darf nur dann überschritten werden, wenn dies aus Kostengründen sinnvoll ist.
Ähnlich verhält es sich mit TimeWindow-Einschränkungen (REST, gRPC). Sie haben die Eigenschaften soft_start_time und soft_end_time 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 Vergleich zu TimeWindow eintritt.
Wie bei allen Parametern des Kostenmodells werden die Kosten für Soft Constraints in denselben dimensionslosen Einheiten wie andere Kostenparameter ausgedrückt.
LoadLimit-Einschränkungen werden ausführlich unter Load Demands and Limits (Lastanforderungen und ‑limits) behandelt. TimeWindow-Einschränkungen werden ausführlich unter Einschränkungen für Zeitfenster für Abholung und Lieferung behandelt.