Wiadomość OptimizeToursRequest
(REST, gRPC) zawiera kilka właściwości związanych z kosztami. Te parametry kosztów razem reprezentują model kosztów żądania. Model kosztów uwzględnia wiele ogólnych celów optymalizacji żądania, takich jak:
- Nadawanie priorytetu szybszym trasom
Vehicle
kosztem krótszych lub odwrotnie - Określanie, czy koszt dostarczenia
Shipment
jest wart wartości ukończeniaShipment
. - Realizowanie odbiorów i dostaw w określonych przedziałach czasowych tylko wtedy, gdy jest to opłacalne.
Zobacz przykładowe żądanie z kosztami
{ "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
Wiadomość Vehicle
(REST, gRPC) ma kilka właściwości związanych z kosztem:
Vehicle.cost_per_hour
: oznacza koszt eksploatacji pojazdu na godzinę, w tym czas przejazdu, oczekiwania, wizyty i przerwy.Vehicle.cost_per_kilometer
: oznacza koszt przejechania kilometra przez pojazd.Vehicle.cost_per_traveled_hour
: reprezentuje koszt eksploatacji pojazdu tylko podczas przejazdu, z wyłączeniem czasu oczekiwania, wizyty i przerwy.
Te parametry kosztów umożliwiają optymalizatorowi dokonywanie kompromisów między czasem a przebytą odległością. Koszty poniesione na optymalnej trasie pojawiają się w odpowiedzi jako metrics.costs
:
Wraz ze wzrostem wartości costPerHour
optymalizator próbuje znaleźć szybsze trasy, które mogą nie być najkrótsze. W tym przykładzie najszybsza trasa jest jednocześnie najkrótsza, więc zmiany parametrów kosztu mają niewielki wpływ.
Shipment
właściwości kosztu
Wiadomość Shipment
(REST, gRPC) ma też kilka parametrów kosztu:
Shipment.penalty_cost
reprezentuje koszt poniesiony w wyniku pominięcia przesyłki. Nie ustawienie parametrupenalty_cost
przesyłki sprawia, że przesyłka jest obowiązkowa, co oznacza, że zostanie pominięta tylko wtedy, gdy nie można jej zrealizować z uwzględnieniem określonych ograniczeń.Shipment.VisitRequest.cost
reprezentuje koszt konkretnego odbioru lub dostawy. Jest używany głównie do umożliwienia kompromisu między wieloma opcjami odbioru lub dostawy w przypadku jednej przesyłki.
Parametry kosztu Shipment
używają tych samych jednostek bezwymiarowych co parametry kosztu Vehicle
. Koszt poniesiony w celu ukończenia Shipment
przekracza koszt kary, więc Shipment
nie jest uwzględniony na trasie żadnego Vehicle
, ale pojawia się na liście skipped_shipments
w wiadomości z odpowiedzią.
ShipmentModel
właściwości kosztu
Wiadomość ShipmentModel
(REST, gRPC) zawiera jedną właściwość cost (koszt) – globalDurationCostPerHour
. Ten koszt jest ponoszony na podstawie łącznego czasu potrzebnego wszystkim pojazdom na wykonanie ShipmentRoute
. Zwiększenie
globalDurationCostPerHour
priorytetu wcześniejszego ukończenia wszystkich przesyłek.
Właściwości kosztów odpowiedzi Optymalizacji tras
Wiadomość OptimizeToursResponse
(REST, gRPC) ma właściwości kosztów, które reprezentują koszty poniesione w procesie realizacji ShipmentRoute
.
Właściwości metrics.costs
i metrics.totalCost
reprezentują liczbę jednostek kosztu poniesionych na wszystkich trasach w odpowiedzi. Każdy wpis routes
ma właściwości routeCosts
i routeTotalCosts
, które reprezentują koszty na danej trasie.
Zobacz 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ętych przesyłek. Właściwość skippedShipments
zawiera listę pominiętych przesyłek.
W tym przykładzie pomijany jest tylko parametr model.shipments[1]
w przykładowym żądaniu.
model.shipments[1]
ma koszt kary w wysokości 5 jednostek, co odpowiada kluczowi model.shipments.penalty_cost
w przykładzie odpowiedzi. Niska wartość przesyłki
penaltyCost
w porównaniu z wartością Vehicle
40,0 costPerHour
i 10,0
costPerKilometer
sprawia, że bardziej opłaca się zrezygnować z przesyłki niż ją
dostarczyć.
Temat zaawansowany: koszty i łagodne ograniczenia
Kilka właściwości OptimizeToursRequest
wiadomości (REST, gRPC) reprezentuje miękkie ograniczenia, czyli ograniczenia, które generują koszt, 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
. Łącznie generują one koszt proporcjonalny do jednostek obciążenia przekraczających softMaxLoad
, co pozwala przekroczyć limit tylko wtedy, gdy ma to sens z punktu widzenia kosztów.
Podobnie TimeWindow
ograniczenia (REST, gRPC) mają właściwości soft_start_time
i soft_end_time
, z odpowiednimi właściwościami cost_per_hour_before_soft_start_time
i cost_per_hour_after_soft_end_time
, które są naliczane w zależności od tego, jak wcześnie lub późno wystąpi ograniczone zdarzenie w stosunku do TimeWindow
.
Podobnie jak w przypadku wszystkich parametrów modelu kosztów, koszty ograniczeń miękkich są wyrażane w tych samych jednostkach bezwymiarowych co inne parametry kosztów.
Ograniczenia LoadLimit
są szczegółowo omówione w artykule Wymagania dotyczące obciążenia i limity. Ograniczenia TimeWindow
są szczegółowo omówione w artykule Ograniczenia dotyczące przedziału czasu odbioru i dostawy.