Wiadomość OptimizeToursRequest (REST, gRPC) zawiera szereg 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
Vehiclekosztem krótszych lub odwrotnie - Określanie, czy koszt dostarczenia
Shipmentjest 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: reprezentuje 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 w postaci 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 kosztów:
Shipment.penalty_costreprezentuje koszt poniesiony w wyniku pominięcia przesyłki. Nieustawienie parametrupenalty_costw przypadku przesyłki sprawia, że przesyłka jest obowiązkowa, co oznacza, że zostanie pominięta tylko wtedy, gdy nie można jej zrealizować z powodu określonych ograniczeń.Shipment.VisitRequest.costreprezentuje 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 na ukończenie Shipment przekracza koszt kary, Shipment nie jest uwzględniony na trasie żadnego Vehicle i zamiast tego 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ść kosztu, 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 elementami najwyższego poziomu metrics.costs są:
{
"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 pominięto tylko 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. Niski wskaźnik penaltyCost przesyłki w porównaniu do 40,0 costPerHour i 10,0 costPerKilometer Vehicle sprawia, że pominięcie przesyłki jest bardziej opłacalne niż jej dokończenie.
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 liczby jednostek obciążenia przekraczających softMaxLoad, co pozwala na przekroczenie limitu tylko wtedy, gdy jest to uzasadnione z punktu widzenia kosztów.
Podobnie ograniczenia TimeWindow (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 i limity dotyczące obciążenia. Ograniczenia TimeWindow omówiono szczegółowo w sekcji Ograniczenia dotyczące przedziałów czasowych odbioru i dostawy.