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 dostawa w wyznaczonych 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.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 dostawy.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
. Koszt poniesiony w całości Shipment
przekracza koszt kary. Element Shipment
nie jest uwzględniony na trasie żadnej z instancji Vehicle
i zamiast tego pojawia się na liście skipped_shipments
w wiadomości z odpowiedzią.
ShipmentModel
właściwości kosztowe
Komunikat ShipmentModel
(REST, gRPC) zawiera jedną właściwość kosztu globalDurationCostPerHour
. Koszt ten jest ponoszony na podstawie łącznego czasu wymaganego na ukończenie ShipmentRoute
przez wszystkie pojazdy. Zwiększenie wartości globalDurationCostPerHour
spowoduje priorytetowe traktowanie wszystkich przesyłek.
Właściwości odpowiedzi 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.
Wyświetl odpowiedź na przykładowe żądanie z kosztami
{ "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 model.shipments[1]
w żą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. Przesyłka jest krótka
penaltyCost
w porównaniu z urządzeniami Vehicle
40,0 costPerHour
i 10,0costPerKilometer
tańszymi jest więc pominięcie przesyłki niż jej ukończenie.
Zaawansowany temat: koszty i miękkie ograniczenia
Kilka właściwości komunikatu OptimizeToursRequest
(REST, gRPC) reprezentuje miękkie ograniczenia, czyli ograniczenia, które powodują naliczanie kosztów, gdy nie można ich spełnić.
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.