Wiadomość OptimizeToursRequest
(REST, gRPC) zawiera wiele właściwości związanych z kosztami. Te parametry kosztów razem stanowią model kosztowy prośby. Model kosztów uwzględnia wiele ogólnych celów optymalizacji żądania, takich jak:
- priorytetem są szybsze
Vehicle
trasy, a nie krótsze, - Decyzja, czy koszt realizacji
Shipment
jest wart wartości wynikającej z ukończeniaShipment
- odbiór i dostawę w określonych przedziałach czasowych tylko wtedy, gdy jest to opłacalne;
Przykładowe zgłoszenie z koszty
{ "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
właściwości kosztu
Komunikat Vehicle
(REST, gRPC) ma kilka właściwości kosztu:
Vehicle.cost_per_hour
: koszt eksploatacji pojazdu na godzinę, w tym czas przejazdu, oczekiwania, wizyty i przerw.Vehicle.cost_per_kilometer
: koszt przejechania 1 km przez pojazd.Vehicle.cost_per_traveled_hour
: reprezentuje koszt eksploatacji pojazdu tylko w trakcie przejazdu, z wyłączeniem czasu oczekiwania, wizyt i przerwy.
Te parametry kosztów umożliwiają optymalizatorowi dokonywanie kompromisów między czasem a przebytą odległością. Koszty poniesione na podstawie zoptymalizowanej trasy są widoczne w odpowiedzi w formie metrics.costs
:
W miarę wzrostu wartości costPerHour
optymalizator próbuje znaleźć szybsze trasy, które mogą nie być najkrótsze. W tym przykładzie najszybsza trasa jest też najkrótsza, więc zmiany parametrów kosztów mają niewielki wpływ.
Shipment
właściwości kosztu
Wiadomość Shipment
(REST, gRPC) zawiera też kilka parametrów kosztów:
Shipment.penalty_cost
to koszt poniesiony w wyniku pominięcia przesyłki.Shipment.VisitRequest.cost
to koszt określonego odbioru lub dostawy, który służy głównie do porównywania kosztów różnych opcji odbioru lub dostawy w przypadku jednej przesyłki.
Parametry kosztów Shipment
używają tych samych bezwymiarowych jednostek co parametry kosztów Vehicle
. Jeśli koszt poniesiony w ramach Shipment
przekracza koszt kary, Shipment
nie jest uwzględniany na żadnym z trasa Vehicle
, a zamiast tego pojawia się na liście skipped_shipments
w wiadomości z odpowiedzią.
ShipmentModel
właściwości kosztu
Komunikat ShipmentModel
(REST, gRPC) zawiera jedną właściwość kosztu globalDurationCostPerHour
. Koszt ten jest ponoszony na podstawie łącznego czasu wymaganego na wykonanie ShipmentRoute
przez wszystkie pojazdy. Zwiększenie wartości globalDurationCostPerHour
spowoduje, że priorytetem będzie wcześniejsze zrealizowanie wszystkich przesyłek.
Właściwości odpowiedzi z optymalizacji trasy dotyczące kosztów
Komunikat OptimizeToursResponse
(REST, gRPC) ma właściwości kosztu, które reprezentują koszty poniesione w procesie realizacji ShipmentRoute
.
Właściwości metrics.costs
i metrics.totalCost
w odpowiedzi reprezentują liczbę jednostek kosztu poniesionych na wszystkich trasach. Każdy wpis routes
ma właściwości routeCosts
i routeTotalCosts
, które przedstawiają koszty na danej trasie.
Odpowiedź na przykładowe zgłoszenie z koszty
{ "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 } } }
W przykładowej odpowiedzi elementy najwyższego poziomu metrics.costs
to:
{
"metrics": {
...
"costs": {
"model.vehicles.cost_per_hour": 18.911111111111111,
"model.vehicles.cost_per_kilometer": 33.53,
"model.shipments.penalty_cost": 5
}
}
}
Wartość model.shipments.penalty_cost
to koszt poniesiony z powodu pominięć dostawy. Właściwość skippedShipments
zawiera listę pominanych przesyłek.
W tym przykładzie pominięto tylko element model.shipments[1]
w przykładowym żądaniu.
model.shipments[1]
ma koszt kary równy 5 jednostkom, który jest zgodny z kluczem total
model.shipments.penalty_cost
w przykładowej odpowiedzi. Wysyłka z niskim
penaltyCost
w porównaniu z Vehicle
40,0 costPerHour
i 10,0
costPerKilometer
sprawia, że pominięcie wysyłki jest bardziej opłacalne niż jej zrealizowanie.
Zaawansowany temat: koszty i miękkie ograniczenia
Niektóre właściwości wiadomości OptimizeToursRequest
(REST, gRPC) stanowią miękkie ograniczenia, które powodują powstanie kosztów, gdy nie mogą zostać spełnione.
Na przykład ograniczenia dotyczące pojazdu LoadLimit
(REST, gRPC) mają właściwości softMaxLoad
i costPerUnitAboveSoftMax
. Razem powodują one koszty proporcjonalne do jednostek obciążenia, które przekraczają wartość softMaxLoad
, co pozwala przekroczyć limit tylko wtedy, gdy ma to sens z punktu widzenia kosztów.
Podobnie ograniczenia TimeWindow
(REST, gRPC) mają właściwości soft_start_time
i soft_end_time
oraz odpowiadające im właściwości cost_per_hour_before_soft_start_time
i cost_per_hour_after_soft_end_time
, które są generowane na podstawie tego, jak wcześnie lub późno zdarzenie ograniczone występuje w stosunku do TimeWindow
.
Podobnie jak w przypadku wszystkich parametrów modelu kosztu, koszty ograniczeń miękkich są wyrażone w tych samych bezwymiarowych jednostkach co inne parametry kosztu.
Ograniczenia LoadLimit
są szczegółowo omawiane w artykule Potrzeby i limity obciążenia. Ograniczenia TimeWindow
są szczegółowo opisane w ograniczeniach dotyczących czasu odbioru i dostawy.