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, aby zminimalizować ogólny koszt.

ShipmentModel model składa się głównie z Shipment, które należy wykonać, oraz Vehicle, które można wykorzystać do transportu Shipment. ShipmentRoute przypisuje Shipment do Vehicle. Przypisują one do każdego pojazdu serię Visit, gdzie Visit odpowiada VisitRequest, czyli odbiorowi lub dostawie dla Shipment.

Chodzi o przypisanie ShipmentRoute do Vehicle, które minimalizuje łączny koszt, przy czym 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 projekt lub lokalizację, do której 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ływem czasu oczekiwania lub przed osiągnięciem terminu serwera dla żądań synchronicznych, w zależności od tego, co nastąpi wcześniej.

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

Czas trwania w sekundach z maksymalnie 9 miejscami po przecinku, zakończony znakiem „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)

Pomóż algorytmowi optymalizacji znaleźć pierwsze rozwiązanie podobne do poprzedniego.

Model jest ograniczany podczas tworzenia pierwszego rozwiązania. Wszystkie wysyłki, które nie zostały zrealizowane na trasie, są w pierwszym rozwiązaniu pomijane, ale mogą być realizowane w kolejnych rozwiązaniach.

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

  • W przypadku wszystkich tras wartość vehicleIndex musi mieścić się w zakresie i nie może być zduplikowana.
  • W przypadku wszystkich wizyt wartości shipmentIndexvisitRequestIndex muszą mieścić się w zakresie.
  • przesyłka może być powiązana tylko z jedną trasą.
  • odbiór przesyłki z odbiorem i dostawą musi nastąpić przed dostawą.
  • można zrealizować nie więcej niż 1 alternatywną opcję odbioru lub dostawy przesyłki.
  • w przypadku wszystkich tras czas się wydłuża (tzn. vehicleStartTime <= visits[0].start_time <= visits[1].start_time ... <= vehicleEndTime).
  • przesyłkę można zrealizować tylko w przypadku pojazdu, który jest dozwolony. Pojazd jest dozwolony, jeśli pole Shipment.allowed_vehicle_indices jest puste lub jego vehicleIndex znajduje się w Shipment.allowed_vehicle_indices.

Jeśli wstrzyknięte rozwiązanie jest niewykonalne, niekoniecznie zwracany jest błąd weryfikacji. Zamiast tego może zostać zwrócony błąd wskazujący na niewykonalność.

injectedSolutionConstraint

object (InjectedSolutionConstraint)

Ogranicz algorytm optymalizacji, aby znaleźć rozwiązanie końcowe podobne do poprzedniego. Może to być na przykład przydatne do zamrażania części tras, które zostały już ukończone lub mają zostać ukończone, ale nie mogą być modyfikowane.

Jeśli wstrzyknięte rozwiązanie jest niewykonalne, niekoniecznie zwracany jest błąd weryfikacji. Zamiast tego może zostać zwrócony błąd wskazujący na niewykonalność.

refreshDetailsRoutes[]

object (ShipmentRoute)

Jeśli nie jest pusta, podane trasy zostaną odświeżone bez modyfikowania ich podstawowej sekwencji wizyt ani czasów podróży: zaktualizowane zostaną tylko inne szczegóły. Nie rozwiązuje to modelu.

Od listopada 2020 r. wypełnia ona tylko linie łamane niepustych tras i wymaga, aby wartość populatePolylines była ustawiona na „prawda”.

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

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

Zasady Shipment.ignoreVehicle.ignore nie mają wpływu na to zachowanie. Linie łamane są nadal wypełniane między wszystkimi wizytami na wszystkich niepustych trasach, niezależnie od tego, czy powiązane przesyłki lub pojazdy są ignorowane.

interpretInjectedSolutionsUsingLabels

boolean

Jeśli ma wartość prawda:

Ta interpretacja dotyczy pól injectedFirstSolutionRoutes, injectedSolutionConstraintrefreshDetailsRoutes. Może być używany, gdy indeksy przesyłek lub pojazdów w żądaniu uległy zmianie od czasu utworzenia rozwiązania, np. z powodu usunięcia lub dodania przesyłek lub pojazdów.

Jeśli ma wartość true, etykiety w tych kategoriach mogą pojawiać się w swojej kategorii co najwyżej raz:

Jeśli vehicleLabel w wstrzykniętym rozwiązaniu nie odpowiada pojazdowi z prośby, odpowiednia trasa jest usuwana z rozwiązania wraz z wizytami. Jeśli shipmentLabel w rozwiązaniu nie odpowiada przesyłce z żądaniem, odpowiednia wizyta jest usuwana z rozwiązania. Jeśli SkippedShipment.label w wstrzykniętym rozwiązaniu nie odpowiada przesyłce z prośbą, SkippedShipment jest usuwany z rozwiązania.

Usunięcie wizyt na trasie lub całych tras z wstrzykniętego rozwiązania może wpłynąć na domniemane ograniczenia, co może spowodować zmianę rozwiązania, błędy weryfikacji lub niemożliwość jego zastosowania.

UWAGA: dzwoniący musi zapewnić, że każdy Vehicle.label (odpowiednio Shipment.label) jednoznacznie identyfikuje pojazd (lub przesyłkę) używany w 2 odpowiednich żądaniach: poprzednim żądaniu, które wygenerowało OptimizeToursResponse użyte w wstrzykniętym rozwiązaniu, oraz bieżącym żądaniu, które zawiera wstrzyknięte rozwiązanie. Opisane powyżej kontrole unikalności nie wystarczą, aby zagwarantować spełnienie tego wymagania.

considerRoadTraffic

boolean

W obliczeniach pól ShipmentRoute, Transition.travel_duration, Visit.start_timevehicleEndTime, w ustawianiu pola ShipmentRoute.has_traffic_infeasibilities oraz w obliczeniach pola OptimizeToursResponse.total_cost uwzględniaj szacunkową liczbę wizyt.

populatePolylines

boolean

Jeśli ma wartość true, w odpowiedziach ShipmentRoute będą wypełniane polilinie.

populateTransitionPolylines

boolean

Jeśli ma wartość true, w odpowiedzi ShipmentRoute.transitions będą wypełnione polilinie i tokeny trasy.

allowLargeDeadlineDespiteInterruptionRisk

boolean

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

useGeodesicDistances

boolean

Jeśli wartość to „prawda”, odległości podróży będą obliczane na podstawie odległości geodezyjnych zamiast odległości w Mapach 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 może służyć do identyfikowania tego żądania i jest zwracana w parametrze OptimizeToursResponse.request_label.

geodesicMetersPerSecond

number

Jeśli wartość useGeodesicDistances to „true”, to pole musi być ustawione i określa szybkość stosowaną do obliczania czasu podróży. Jej wartość musi wynosić co najmniej 1,0 m/s.

maxValidationErrors

integer

Obcina liczbę zwracanych 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 solvingMode=VALIDATE_ONLY: patrz pole OptimizeToursResponse.validation_errors. Domyślna wartość to 100,a maksymalna to 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ń IAM w zasobie parent:

  • routeoptimization.locations.use

Więcej informacji znajdziesz w dokumentacji IAM.