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 Shipmentzasobów, które mają zostać wykonane, oraz Vehicleelementów, które można wykorzystać do transportu Shipment. Elementy typu ShipmentRoute przypiszą elementy Shipment do elementów 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 zasobów typu ShipmentRoute do komponentów typu Vehicle, co minimalizuje całkowity koszt, gdy koszt ma wiele komponentów zdefiniowanych w tabeli 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 projekt lub lokalizację, do których chcesz zadzwonić.

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

Jeśli nie podasz 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 trwania w sekundach składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „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)

Pomaga algorytmowi optymalizacji w znalezieniu pierwszego rozwiązania, które jest podobne do poprzedniego.

Podczas tworzenia pierwszego rozwiązania model jest ograniczony. W pierwszym rozwiązaniu wszystkie przesyłki, które nie zostały zrealizowane na trasie, są domyślnie pomijane, ale mogą być realizowane 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.
  • w przypadku wszystkich wizyt wartości shipmentIndexvisitRequestIndex muszą mieścić się w zakresie.
  • dostawa może być wskazana tylko na jednej trasie.
  • Odbiór przesyłki z odbiorem lub dostawą musi zostać zrealizowany przed dostawą.
  • nie można wybrać więcej niż jednej opcji odbioru lub dostawy będącej alternatywą dla dostawy.
  • dla wszystkich tras wydłuża się (np. 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 pole Shipment.allowed_vehicle_indices jest puste lub jego vehicleIndex znajduje się w: Shipment.allowed_vehicle_indices.
  • jeśli zasada avoidUTurns ma wartość Prawda, zasada injectedSolutionLocationToken musi być skonfigurowana w przypadku odpowiednich wizyt;

Jeśli wstrzyknięte rozwiązanie nie jest możliwe, błąd weryfikacji nie musi być zwracany i zamiast niego może pojawić się błąd wskazujący na niewykonalność.

injectedSolutionConstraint

object (InjectedSolutionConstraint)

Ograniczenie algorytmu optymalizacji do znalezienia ostatecznego rozwiązania podobnego do poprzedniego. Na przykład tej opcji można użyć do zablokowania części tras, które zostały już zakończone lub są jeszcze zakończone, ale nie można ich modyfikować.

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 nie jest pusty, dane trasy zostaną odświeżone bez zmiany ich sekwencji wizyt lub czasu podróży: zostaną zaktualizowane tylko inne szczegóły. Nie rozwiązuje to problemu.

Od listopada 2020 r. ta opcja wypełnia tylko linie wielokątów na niepustych trasach i wymaga, aby parametr populatePolylines miał wartość Prawda.

Pola routePolyline w przekazanych trasach mogą być niezgodne z trasą transitions.

Nie można używać tego pola razem z polem injectedFirstSolutionRoutes ani injectedSolutionConstraint.

Shipment.ignoreVehicle.ignore nie mają wpływu na sposób działania. 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 ma zastosowanie do pól injectedFirstSolutionRoutes, injectedSolutionConstraint i refreshDetailsRoutes. Można go użyć, gdy indeksy przesyłek lub pojazdów w prośbie uległy zmianie od czasu utworzenia rozwiązania, np. dlatego, że przesyłki lub pojazdy zostały usunięte z prośby lub dodane do niej.

Jeśli ma wartość true, etykiety w tych kategoriach mogą się pojawiać maksymalnie raz w danej kategorii:

Jeśli wartość vehicleLabel we wstrzykiwanym roztworze nie odpowiada pojazdowi, którego dotyczy żądanie, odpowiednia trasa jest usuwana z rozwiązania razem z wizytami. Jeśli wartość shipmentLabel we wstrzykiwanym rozwiązaniu nie odpowiada wysyłce żądania, odpowiednia wizyta zostanie usunięta z rozwiązania. Jeśli SkippedShipment.label w roztworze wstrzykniętym do rozwiązania nie odpowiada wysyłce żądania, SkippedShipment zostaje usunięty z roztworu.

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: rozmówca musi upewnić się, że każde Vehicle.label (odp. Shipment.label) jednoznacznie identyfikuje pojazd (odpowiedź do przesyłki) użyty w 2 odpowiednich żądaniach: wcześniejsze żądanie, które spowodowało wygenerowanie kodu OptimizeToursResponse użytego we wstrzykiwanym roztworze, oraz bieżące żądanie, które obejmuje wstrzykiwany roztwór. Opisane powyżej kontrole unikalnych treści nie wystarczają do spełnienia tego wymagania.

considerRoadTraffic

boolean

Przy obliczaniu wartości pól Transition.travel_duration, Visit.start_time i vehicleEndTime (ShipmentRoute) uwzględniaj szacowany ruch, a także podczas ustawiania pola ShipmentRoute.has_traffic_infeasibilities i 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, w odpowiedzi ShipmentRoute.transitions zostaną wypełnione ścieżki poliliniowe.

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 żądania długotrwałe wiążą się ze znacznie większym (ale i mniejszym) ryzykiem przerw w działaniu.

useGeodesicDistances

boolean

Jeśli to ustawienie ma wartość true, odległości przebytej zostaną obliczone na podstawie odległości geodezyjnych zamiast odległości w Mapach Google, a czas podróży zostanie obliczony na podstawie odległości geodezyjnej przy prędkości określonej przez parametr geodesicMetersPerSecond.

label

string

Etykieta, która może służyć do identyfikowania tego żądania, zgłoszonego w formularzu OptimizeToursResponse.request_label.

geodesicMetersPerSecond

number

Jeśli useGeodesicDistances ma wartość true (prawda), to pole musi być skonfigurowane i określa prędkość używaną 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 limit jest ograniczony do 10 000.

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ń uprawnień w zasobie parent:

  • routeoptimization.locations.use

Więcej informacji znajdziesz w dokumentacji uprawnień.