Method: projects.optimizeTours

Wysyła OptimizeToursRequest zawierający ShipmentModel i zwraca OptimizeToursResponse zawierający ShipmentRoute, czyli zestaw tras, które mają być wykonane przez pojazdy w taki sposób, aby zminimalizować łączny koszt.

Model ShipmentModel składa się głównie z Shipment, które muszą być wykonywane, oraz z Vehicle, które mogą być używane do transportu Shipment. ShipmentRoute przypisuje Shipment do Vehicle. W szczególności przypisują do każdego pojazdu serię Visit, gdzie Visit odpowiada VisitRequest, czyli odbiór lub dostawę dla Shipment.

Celem jest przypisanie ShipmentRoute do Vehicle, które minimalizuje łączny koszt, gdzie koszt ma wiele komponentów zdefiniowanych w ShipmentModel.

Żądanie HTTP

POST https://routeoptimization.googleapis.com/v1/{parent=projects/*}:optimizeTours

Adres URL używa składni transkodowania gRPC.

Parametry ścieżki

Parametry
parent

string

Wymagane. Wybierz docelowy projekt lub lokalizację, aby zadzwonić.

Format: * projects/{project-id} * projects/{project-id}/locations/{location-id}

Jeśli nie określisz lokalizacji, region zostanie wybrany automatycznie.

Treść żądania

Treść żądania zawiera dane o następującej strukturze:

Zapis JSON
{
  "timeout": string,
  "model": {
    object (ShipmentModel)
  },
  "solvingMode": enum (SolvingMode),
  "searchMode": enum (SearchMode),
  "injectedFirstSolutionRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "injectedSolutionConstraint": {
    object (InjectedSolutionConstraint)
  },
  "refreshDetailsRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "interpretInjectedSolutionsUsingLabels": boolean,
  "considerRoadTraffic": boolean,
  "populatePolylines": boolean,
  "populateTransitionPolylines": boolean,
  "allowLargeDeadlineDespiteInterruptionRisk": boolean,
  "useGeodesicDistances": boolean,
  "label": string,
  "geodesicMetersPerSecond": number,
  "maxValidationErrors": integer
}
Pola
timeout

string (Duration format)

Jeśli ten czas oczekiwania jest ustawiony, serwer zwraca odpowiedź przed upłynięciem limitu czasu lub upłynięciem terminu dla żądań synchronicznych (w zależności od tego, co nastąpi wcześniej).

W przypadku żądań asynchronicznych serwer wygeneruje rozwiązanie (jeśli będzie to możliwe) przed upływem czasu oczekiwania.

Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „s”. Przykład: "3.5s".

model

object (ShipmentModel)

Model dostawy do rozwiązania.

solvingMode

enum (SolvingMode)

Domyślny tryb rozwiązywania to DEFAULT_SOLVE (0).

searchMode

enum (SearchMode)

Tryb wyszukiwania użyty do rozwiązania żądania.

injectedFirstSolutionRoutes[]

object (ShipmentRoute)

Pomaganie algorytmu optymalizacji w znalezieniu pierwszego rozwiązania podobnego do poprzedniego.

Model jest ograniczony podczas tworzenia pierwszego rozwiązania. Przesyłki, które nie zostały wykonane na danej trasie, są domyślnie pominięte w pierwszym rozwiązaniu, ale można je realizować w kolejnych rozwiązaniach.

Rozwiązanie musi spełniać pewne podstawowe założenia dotyczące poprawności:

  • w przypadku wszystkich tras vehicleIndex musi mieścić się w zakresie i nie może być powielany.
  • dla wszystkich wizyt shipmentIndex i visitRequestIndex muszą się mieścić w zakresie.
  • dostawa może być wskazana tylko na jednej trasie.
  • odbiór przesyłki z odbiorem i dostawą musi zostać wykonany przed dostawą.
  • nie można wykonać więcej niż 1 alternatywy odbioru lub dostawy przesyłki;
  • w przypadku wszystkich tras czasy wydłużają się (tzn. vehicleStartTime <= visits[0].start_time <= visits[1].start_time ... <= vehicleEndTime).
  • wysyłka może zostać zrealizowana wyłącznie za pomocą dozwolonego pojazdu. Pojazd jest dozwolony, jeśli Shipment.allowed_vehicle_indices jest pusty lub jego vehicleIndex jest zawarty w Shipment.allowed_vehicle_indices.

Jeśli wstrzyknięty kod nie jest wykonalny, niekoniecznie zwracany jest błąd weryfikacji. Zamiast tego może zostać zwrócony błąd wskazujący na brak możliwości wykonania.

injectedSolutionConstraint

object (InjectedSolutionConstraint)

Ograniczenie algorytmu optymalizacji do znalezienia ostatecznego rozwiązania podobnego do poprzedniego. Można go na przykład użyć do zamrożenia części tras, które zostały już ukończone lub mają zostać ukończone, ale nie mogą być modyfikowane.

Jeśli wstrzyknięty kod nie jest wykonalny, niekoniecznie zwracany jest błąd weryfikacji. Zamiast tego może zostać zwrócony błąd wskazujący na brak możliwości wykonania.

refreshDetailsRoutes[]

object (ShipmentRoute)

Jeśli pole nie jest puste, podane trasy zostaną odświeżone bez zmiany bazowej sekwencji wizyt czy czasów podróży. Zostaną zaktualizowane tylko inne szczegóły. Nie rozwiązuje to problemów z modelem.

Od 2020 roku wypełnia tylko linie łamane niepustych tras i wymaga, aby atrybut populatePolylines miał wartość prawda.

Pola routePolyline w przekazanych trasach mogą być niespójne z trasą transitions.

Tego pola nie można używać razem z polami injectedFirstSolutionRoutes ani injectedSolutionConstraint.

Shipment.ignore i Vehicle.ignore nie mają wpływu na działanie. Linie łamane są nadal wypełniane dla wszystkich wizyt na wszystkich niepustych trasach niezależnie od tego, czy powiązane dostawy lub pojazdy są ignorowane.

interpretInjectedSolutionsUsingLabels

boolean

Jeśli ma wartość prawda:

Ta interpretacja dotyczy pól injectedFirstSolutionRoutes, injectedSolutionConstraintrefreshDetailsRoutes. Możesz go użyć, gdy indeksy przesyłek lub pojazdów w żądaniu uległy zmianie od czasu utworzenia rozwiązania, np. gdy dostawy lub pojazdy zostały usunięte z prośby lub do niej dodane.

Jeśli wartość to prawda, etykiety z poniższych kategorii mogą pojawić się w danej kategorii co najwyżej raz:

Jeśli vehicleLabel w wstrzykniętym rozwiązaniu nie odpowiada pojazdowi w żądaniu, odpowiednia trasa wraz z wizytami jest usuwana z rozwiązania. Jeśli shipmentLabel w wstrzykniętym rozwiązaniu nie odpowiada wysyłce żądania, odpowiednia wizyta zostaje usunięta z rozwiązania. Jeśli wartość SkippedShipment.label we wstrzykiwanym rozwiązaniu nie odpowiada wysyłce żądania, SkippedShipment jest usuwany z rozwiązania.

Usunięcie wizyt na trasie lub całych tras z wstrzykniętego rozwiązania może mieć wpływ na implikowane ograniczenia, co może spowodować zmianę rozwiązania, błędy walidacji lub niemożliwość jego wykonania.

UWAGA: osoba dzwoniąca musi się upewnić, że każda wartość Vehicle.label (odpowiednio Shipment.label) jednoznacznie identyfikuje element pojazdu (odpowiednio przesyłki) używany w 2 odpowiednich żądaniach: poprzednie żądanie, które wygenerowało OptimizeToursResponse użyte w wstrzykniętym rozwiązaniu, i obecne żądanie, które zawiera wstrzyknięte rozwiązanie. Opisane powyżej kontrole unikalnych treści nie wystarczają do spełnienia tego wymagania.

considerRoadTraffic

boolean

Warto uwzględnić prognozę ruchu podczas obliczania pól ShipmentRoute Transition.travel_duration, Visit.start_timevehicleEndTime, ustawiania pola ShipmentRoute.has_traffic_infeasibilities oraz obliczania pola OptimizeToursResponse.total_cost.

populatePolylines

boolean

Jeśli ma wartość prawda, linie łamane będą wypełniane w odpowiedzi ShipmentRoutes.

populateTransitionPolylines

boolean

Jeśli ma wartość prawda, linie łamane zostaną wypełnione w odpowiedzi ShipmentRoute.transitions.

allowLargeDeadlineDespiteInterruptionRisk

boolean

Jeśli ta wartość jest ustawiona, termin żądania (patrz https://grpc.io/blog/deadlines) może wynosić maksymalnie 60 minut. W przeciwnym razie maksymalny termin to tylko 30 minut. Pamiętaj, że w przypadku długotrwałych żądań występuje znacznie większe (choć nadal niewielkie) ryzyko przerwania.

useGeodesicDistances

boolean

Jeśli wartość to prawda, odległości będą obliczane na podstawie odległości geodezyjnych zamiast z Map Google, a czasy podróży będą obliczane na podstawie odległości geodezyjnych z prędkością określoną przez geodesicMetersPerSecond.

label

string

Etykieta, która pozwala zidentyfikować to żądanie. Zostanie ona zgłoszona w OptimizeToursResponse.request_label.

geodesicMetersPerSecond

number

Gdy useGeodesicDistances ma wartość true, to pole musi być ustawione i określa szybkość stosowaną do obliczania czasu podróży. Jego wartość musi wynosić co najmniej 1 m/s.

maxValidationErrors

integer

Obcina zwracaną liczbę błędów weryfikacji. Te błędy są zwykle dołączane do ładunku błędu INVALID_ARGUMENT jako szczegóły błędu BadRequest (https://cloud.google.com/apis/design/errors#error_details), chyba że parametr solvingMode=VALIDATE_ONLY: patrz pole OptimizeToursResponse.validation_errors. Domyślna wartość to 100, a maksymalna – 10 tys.

Treść odpowiedzi

W przypadku powodzenia treść odpowiedzi obejmuje wystąpienie elementu OptimizeToursResponse.

Zakresy autoryzacji

Wymaga następującego zakresu OAuth:

  • https://www.googleapis.com/auth/cloud-platform

Uprawnienia

Wymaga tych uprawnień IAM do zasobu parent:

  • routeoptimization.locations.use

Więcej informacji znajdziesz w dokumentacji uprawnień.