Package google.maps.routeoptimization.v1

Indeks

RouteOptimization

Usługa optymalizacji trasy pojazdu.

Ważność niektórych typów pól:

  • google.protobuf.Timestamp
    • Czas jest podawany w czasie uniksowym: sekundy od 1970-01-01T00:00:00+00:00.
    • sekundy musi zawierać się w przedziale [0, 253402300799], czyli w przedziale [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • Wartość nanos musi być nieskonfigurowana lub ustawiona na 0.
  • google.protobuf.Duration
    • sekundy musi zawierać się w przedziale [0, 253402300799], czyli w przedziale [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • Wartość nanos musi być nieskonfigurowana lub ustawiona na 0.
  • google.type.LatLng
    • szerokość geograficzna musi się mieścić w zakresie [-90,0, 90,0].
    • Długość geograficzna musi mieścić się w przedziale [-180,0, 180,0].
    • co najmniej jedna z długości i szerokości geograficznej musi być różna od zera.
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

Optymalizuje wycieczki samochodowe dla co najmniej 1 wiadomości w OptimizeToursRequest jako grupy.

Jest to długo trwająca operacja (LRO). Dane wejściowe do optymalizacji (wiadomości: OptimizeToursRequest) i dane wyjściowe (wiadomości: OptimizeToursResponse) są odczytywane z lub do Cloud Storage w formacie określonym przez użytkownika. Tak jak w przypadku metody OptimizeTours, każdy element OptimizeToursRequest zawiera ShipmentModel i zwraca OptimizeToursResponse zawierający ShipmentRoute, czyli zestaw tras, które pokonują pojazdy minimalizujące całkowity koszt.

Użytkownik może wysłać zapytanie operations.get, aby sprawdzić stan LRO:

Jeśli pole done LRO ma wartość Fałsz, oznacza to, że co najmniej 1 żądanie jest nadal przetwarzane. Inne żądania mogły zostać zrealizowane, a ich wyniki są dostępne w GCS.

Jeśli pole done w LRO ma wartość true, wszystkie żądania zostały przetworzone. Wyniki wszystkich przetworzonych żądań będą dostępne w GCS. Wyniki nieudanych żądań nie będą dostępne w GCS. Jeśli pole error LRO jest ustawione, zawiera ono błąd z jednego z nieudanych żądań.

Zakresy autoryzacji

Wymaga następującego zakresu OAuth:

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

Wymaga tego uprawnienia IAM w zasobie parent:

  • routeoptimization.operations.create

Więcej informacji znajdziesz w dokumentacji uprawnień.

OptimizeTours

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

Wysyła OptimizeToursRequest z ShipmentModel i zwraca OptimizeToursResponse zawierający ShipmentRoute, czyli zestaw tras, które mają wykonać pojazdy minimalizujące całkowity 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. Dokładniej rzecz ujmując, do każdego pojazdu przypisywane są ciągi Visit, gdzie Visit odpowiada elementowi VisitRequest oznaczającemu odbiór lub dostawę w przypadku Shipment.

Celem jest przydzielenie zasobów typu ShipmentRoute do elementów typu Vehicle, co minimalizuje całkowity koszt, gdy koszt ma wiele komponentów zdefiniowanych w tabeli ShipmentModel.

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 usługi IAM.

AggregatedMetrics

Dane zbiorcze dotyczące ShipmentRoute (odpowiednio OptimizeToursResponse dla wszystkich elementów Transition lub Visit (odpowiednio dla wszystkich elementów ShipmentRoute).

Pola
performed_shipment_count

int32

Liczba zrealizowanych przesyłek. Pamiętaj, że para „odbiór” i „dostawa” jest liczona tylko raz.

travel_duration

Duration

Całkowity czas podróży dla danej trasy lub rozwiązania.

wait_duration

Duration

Całkowity czas oczekiwania dla trasy lub rozwiązania.

delay_duration

Duration

Łączny czas opóźnienia na trasie lub w rozwiązaniu.

break_duration

Duration

Całkowity czas trwania przerwy dla trasy lub rozwiązania.

visit_duration

Duration

Łączny czas trwania wizyty dla trasy lub rozwiązania.

total_duration

Duration

Łączny czas trwania powinien być równy sumie wszystkich okresów powyżej. W przypadku tras odpowiada też:

[ShipmentRoute.vehicle_end_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_end_time] - [ShipmentRoute.vehicle_start_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_start_time]
travel_distance_meters

double

Całkowita odległość pokonywana w przypadku danej trasy lub rozwiązania.

max_loads

map<string, VehicleLoad>

Maksymalne obciążenie osiągnięte na całej trasie (odpowiednio: w rozwiązaniu) dla każdej ilości na tej trasie (odpowiednio: w rozwiązaniu) obliczone jako maksimum wszystkich Transition.vehicle_loads (odpowiednio: ShipmentRoute.metrics.max_loads.

BatchOptimizeToursMetadata

Ten typ nie zawiera pól.

Metadane operacji dotyczące BatchOptimizeToursRequest wywołań.

BatchOptimizeToursRequest

Żądanie zbiorczej optymalizacji wycieczek jako operacji asynchronicznej. Każdy plik wejściowy powinien zawierać 1 element OptimizeToursRequest, a każdy plik wyjściowy – 1 element OptimizeToursResponse. Żądanie zawiera informacje potrzebne do odczytu i zapisu oraz analizy plików. Wszystkie pliki wejściowe i wyjściowe powinny należeć do tego samego projektu.

Pola
parent

string

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

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

Jeśli nie podasz lokalizacji, region zostanie wybrany automatycznie.

model_configs[]

AsyncModelConfig

Wymagane. Informacje wejściowe/wyjściowe dotyczące każdego modelu zakupu, takie jak ścieżki plików i formaty danych.

AsyncModelConfig

Informacje dotyczące asynchronicznego rozwiązania jednego modelu optymalizacji.

Pola
display_name

string

Opcjonalnie: Zdefiniowana przez użytkownika nazwa modelu, która może być używana przez użytkowników jako alias do śledzenia modeli.

input_config

InputConfig

Wymagane. Informacje o modelu wejściowym.

output_config

OutputConfig

Wymagane. Wymagane informacje o lokalizacji wyjściowej.

BatchOptimizeToursResponse

Ten typ nie zawiera pól.

Odpowiedź na: BatchOptimizeToursRequest. Jest on zwracany w ramach długo trwającej operacji po jej zakończeniu.

BreakRule

Reguły generowania przerw na przejazd pojazdem (np. przerwy na lunch). Przerwa to ciągły okres, w którym pojazd pozostaje nieaktywny w swojej aktualnej pozycji i nie może wykonać żadnej wizyty. Przerwa może wystąpić:

  • podczas przemieszczania się między 2 wizytami (co obejmuje czas tuż przed wizytą lub tuż po niej, ale nie w jej trakcie), w którym przypadku wydłuża się czas przemieszczania się między wizytami,
  • lub przed uruchomieniem pojazdu (pojazd może nie uruchomić się w trakcie przerwy) – w takim przypadku nie ma to wpływu na czas uruchomienia pojazdu.
  • lub po zakończeniu pojazdu (edytuj, z godziną zakończenia pojazdu).
Pola
break_requests[]

BreakRequest

Sekwencja przerw. Zobacz wiadomość BreakRequest.

frequency_constraints[]

FrequencyConstraint

Może obowiązywać kilka zasad (FrequencyConstraint). BreakRequest: BreakRule musi spełnić wszystkie wymagania. Zobacz FrequencyConstraint.

BreakRequest

Sekwencja przerw (tj. ich liczba i kolejność) musi być wcześniej znana. Powtarzające się elementy BreakRequest definiują tę sekwencję w kolejności, w jakiej muszą wystąpić. Przedziały czasu (earliest_start_time / latest_start_time) mogą się pokrywać, ale muszą być zgodne z zamówieniem (jest to zaznaczone).

Pola
earliest_start_time

Timestamp

Wymagane. Dolna granica (włącznie) na początku przerwy.

latest_start_time

Timestamp

Wymagane. Górna granica (włącznie) na początku przerwy.

min_duration

Duration

Wymagane. Minimalny czas trwania przerwy. Musi być liczbą dodatnią.

FrequencyConstraint

Można jeszcze bardziej ograniczyć częstotliwość i czas trwania przerw określonych powyżej przez wymuszenie minimalnej częstotliwości, na przykład „Co 12 godzin musi być przerwa co najmniej 1 godzinę”. Zakładając, że można to zinterpretować w ten sposób: „W każdym przesuwającym się przedziale czasu wynoszącym 12 godzin musi istnieć co najmniej jedna przerwa o długości co najmniej 1 godziny”, przykłada prezentuje się tak: FrequencyConstraint:

{
   min_break_duration { seconds: 3600 }         # 1 hour.
   max_inter_break_duration { seconds: 39600 }  # 11 hours (12 - 1 = 11).
}

Czas i czas trwania przerw w rozwiązaniach uwzględniają wszystkie takie ograniczenia, a także przedziały czasowe i minimalne czasy trwania określone w zasadzie BreakRequest.

FrequencyConstraint może w praktyce mieć zastosowanie do przerw, które nie następują po sobie. Na przykład w ramach harmonogramu „1 godzina co 12 godzin”:

  04:00 vehicle start
   .. performing travel and visits ..
  09:00 1 hour break
  10:00 end of the break
   .. performing travel and visits ..
  12:00 20-min lunch break
  12:20 end of the break
   .. performing travel and visits ..
  21:00 1 hour break
  22:00 end of the break
   .. performing travel and visits ..
  23:59 vehicle end
Pola
min_break_duration

Duration

Wymagane. Minimalny czas trwania przerwy dla tego ograniczenia. Nieujemna. Zobacz opis FrequencyConstraint.

max_inter_break_duration

Duration

Wymagane. Maksymalny dozwolony przedział czasu na trasie, który nie obejmuje co najmniej częściowego przerwania duration >= min_break_duration. Musi być liczbą dodatnią.

DataFormat

Formaty danych dla plików wejściowych i wyjściowych.

Wartości w polu enum
DATA_FORMAT_UNSPECIFIED Nieprawidłowa wartość. Format nie może być UNSPECIFIED.
JSON w formacie JavaScript Object Notation.
PROTO_TEXT Format tekstowy buforów protokołu. Więcej informacji: https://protobuf.dev/reference/protobuf/textformat-spec/

DistanceLimit

Ograniczenie określające maksymalną odległość, jaką można przebyć. Może być twarda lub miękka.

Jeśli zdefiniowany jest limit tymczasowy, muszą być zdefiniowane zarówno soft_max_meters, jak i cost_per_kilometer_above_soft_max, i nie mogą być ujemne.

Pola
max_meters

int64

Stały limit ogranicza odległość do maksymalnej wartości max_meters. Limit nie może być ujemny.

soft_max_meters

int64

Limit częściowy nie egzekwuje maksymalnego limitu odległości, ale jego naruszenie powoduje naliczenie kosztów, które wliczają się do innych kosztów określonych w modelu z tą samą jednostką.

Jeśli zdefiniowana wartość parametru soft_max_meters jest mniejsza niż wartość max_meters, musi być ona nieujemna.

cost_per_kilometer_below_soft_max

double

Poniesiony koszt za kilometr, rosnący do soft_max_meters, według wzoru:

  min(distance_meters, soft_max_meters) / 1000.0 *
  cost_per_kilometer_below_soft_max.

Ten koszt nie jest obsługiwany w: route_distance_limit.

cost_per_kilometer_above_soft_max

double

Koszt za kilometr naliczany, jeśli odległość przekracza limit soft_max_meters. Jeśli odległość jest mniejsza od limitu, dodatkowy koszt wynosi 0. W przeciwnym razie koszt jest obliczany według tego wzoru:

  (distance_meters - soft_max_meters) / 1000.0 *
  cost_per_kilometer_above_soft_max.

Koszt nie może być ujemny.

GcsDestination

Lokalizacja w Google Cloud Storage, w której będą zapisywane pliki wyjściowe.

Pola
uri

string

Wymagane. Identyfikator URI obiektu w Google Cloud Storage.

GcsSource

Lokalizacja w Google Cloud Storage, z której zostanie odczytany plik wejściowy.

Pola
uri

string

Wymagane. Identyfikator URI obiektu Google Cloud Storage w formacie gs://bucket/path/to/object.

InjectedSolutionConstraint

Rozwiązanie podane w żądaniu, w tym informacje o tym, które wizyty należy ograniczyć i jak należy to robić.

Pola
routes[]

ShipmentRoute

Trasy roztworu do wstrzykiwania. Niektóre trasy mogą zostać pominięte w pierwotnym rozwiązaniu. Trasy i pominięte przesyłki muszą spełniać podstawowe założenia dotyczące ważności wymienione dla: injected_first_solution_routes.

skipped_shipments[]

SkippedShipment

Pominięto dostawy roztworu do wstrzykiwania. Niektóre z nich mogą zostać pominięte w pierwotnym rozwiązaniu. Zobacz pole routes.

constraint_relaxations[]

ConstraintRelaxation

W przypadku zerowej lub większej liczby grup pojazdów określa, kiedy i jak bardzo złagodzą ograniczenia. Jeśli to pole jest puste, wszystkie niepuste trasy pojazdów są w pełni ograniczone.

ConstraintRelaxation

W przypadku grupy pojazdów określa progi i poziomy ograniczeń dotyczących wizyt. Przesyłki wymienione w polu skipped_shipment nie można pominąć. tzn. nie można ich wykonać.

Pola
relaxations[]

Relaxation

Wszystkie złagodzenia ograniczeń dotyczących wizyt, które będą miały zastosowanie do wizyt na trasach z pojazdami w: vehicle_indices.

vehicle_indices[]

int32

Określa indeksy pojazdów, do których ma zastosowanie ograniczenie wizyty relaxations. Jeśli pole jest puste, jest ono uważane za domyślne, a relaxations dotyczy wszystkich pojazdów, które nie są określone w innych constraint_relaxations. Może być maksymalnie 1 wartość domyślna, czyli maksymalnie 1 pole z opcją zniesienia ograniczenia może być puste vehicle_indices. Indeks pojazdu może być wymieniony tylko raz, nawet w obrębie kilku constraint_relaxations.

Indeks pojazdu jest mapowany tak samo jak ShipmentRoute.vehicle_index, jeśli pole interpret_injected_solutions_using_labels ma wartość prawda (zobacz komentarz fields).

Relaks

Jeśli relaxations jest pusty, czas rozpoczęcia i kolejność wszystkich wizyt na relaxations są całkowicie ograniczone, a do tych tras nie można dodawać nowych wizyt. Poza tym godzina rozpoczęcia i zakończenia pojazdu w regionie routes jest całkowicie ograniczona, chyba że pojazd jest pusty (np. nie ma wizyt, a wartość used_if_route_is_empty w modelu ma wartość Fałsz).

relaxations(i).level określa poziom złagodzenia ograniczeń zastosowany do wizyty nr j, która jest satysfakcjonująca:

  • route.visits(j).start_time >= relaxations(i).threshold_time ORAZ
  • j + 1 >= relaxations(i).threshold_visit_count

I analogicznie, uruchomienie pojazdu jest ustawione na relaxations(i).level, jeśli spełnione są następujące warunki:

  • vehicle_start_time >= relaxations(i).threshold_time ORAZ
  • relaxations(i).threshold_visit_count == 0, a na końcu pojazdu relaxations(i).level, jeśli spełnia te wymagania:
  • vehicle_end_time >= relaxations(i).threshold_time ORAZ
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

Aby zastosować poziom relaksacji, jeśli wizyta spełnia threshold_visit_count LUB threshold_time, dodaj 2 obiekty relaxations z tymi samymi wartościami level: jeden z ustawionym tylko parametrem threshold_visit_count, a drugi z tylko threshold_time. Jeśli wizyta spełnia warunki wielu relaxations, stosowany jest poziom najbardziej zrelaksowany. W efekcie, gdy pojazd zaczyna się od zwiedzania trasy, aż do jego końca, poziom relaksacji staje się bardziej relaksujący: tj. poziom relaksacji nie maleje w miarę postępów trasy.

Czas i kolejność wizyt w trasach, które nie spełniają warunków progowych dotyczących dowolnego relaxations, są całkowicie ograniczone i nie można wstawiać w tych sekwencjach żadnych wizyt. Ponadto, jeśli początek lub koniec pojazdu nie spełnia warunków relaksacji, czas jest ustalony, chyba że pojazd jest pusty.

Pola
level

Level

Poziom zniesienia ograniczenia, który ma zastosowanie, gdy warunki na poziomie lub po poziomie threshold_time są spełnione ALE co najmniej threshold_visit_count.

threshold_time

Timestamp

Czas, po którym lub po upływie tego czasu może zostać zastosowane złagodzenie level.

threshold_visit_count

int32

Liczba wizyt, po których można zastosować level. Jeśli zasada threshold_visit_count ma wartość 0 (lub jest nieskonfigurowana), zasada level może zostać zastosowana bezpośrednio przy uruchamianiu pojazdu.

Jeśli ma wartość route.visits_size() + 1, level można przyłożyć tylko na końcu pojazdu. Jeśli jest większa niż route.visits_size() + 1, zasada level w ogóle nie jest stosowana do tej trasy.

Poziom

Wyraża różne poziomy złagodzeń ograniczeń, które są stosowane do wizyty i te, które nastąpią po spełnieniu warunków progowych.

Poniższe wyliczenie ułożone jest w kolejności rosnącej złagodzenia.

Wartości w polu enum
LEVEL_UNSPECIFIED

Domyślny poziom relaksacji: żadne ograniczenia nie są łagodzone, tj. wszystkie wizyty są w pełni ograniczone.

Ta wartość nie może być bezpośrednio używana w elemencie level.

RELAX_VISIT_TIMES_AFTER_THRESHOLD Godziny rozpoczęcia i zakończenia wizyt w pojeździe zostaną skrócone, ale każda wizyta będzie powiązana z tym samym pojazdem i należy przestrzegać jej sekwencji: nie można wstawiać pomiędzy nimi ani przed nimi.
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD To samo co RELAX_VISIT_TIMES_AFTER_THRESHOLD, ale z mniej restrykcyjną sekwencją wizyt: wizyty mogą być wykonywane tylko przez ten pojazd, ale mogą też zostać anulowane.
RELAX_ALL_AFTER_THRESHOLD Tak samo jak w przypadku usługi RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD, ale pojazd jest też w prostym stylu: wizyty są całkowicie bezpłatne po osiągnięciu progu lub później i mogą stać się nieskuteczne.

InputConfig

Podaj dane wejściowe dla [BatchOptimizeTours][google.maps.routeOptimization.v1.RouteOptimizationService.BatchOptimizeTours].

Pola
data_format

DataFormat

Wymagane. Format danych wejściowych.

Pole sumy source. Wymagane. source może być tylko jednym z tych elementów:
gcs_source

GcsSource

Lokalizacja w Google Cloud Storage. Musi to być pojedynczy obiekt (plik).

Lokalizacja

Zawiera lokalizację (punkt geograficzny i opcjonalnie nagłówek).

Pola
lat_lng

LatLng

Współrzędne geograficzne punktu pośredniego.

heading

int32

Nagłówek kompasu powiązany z kierunkiem ruchu. Ta wartość służy do określenia strony drogi, z której ma nastąpić odbiór i zwrot. Wartości kierunku mogą wynosić od 0 do 360, gdzie 0 to kierunek na północ, 90 to kierunek na wschód itd.

OptimizeToursRequest

Prośba o przekazanie danych do rozwiązywania problemu optymalizacji trasy, który definiuje model dostawy do rozwiązania, a także parametry optymalizacji.

Pola
parent

string

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

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

Jeśli nie podasz lokalizacji, region zostanie wybrany automatycznie.

timeout

Duration

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 to możliwe) przed upływem limitu czasu.

model

ShipmentModel

Model dostawy do rozwiązania.

solving_mode

SolvingMode

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

search_mode

SearchMode

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

injected_first_solution_routes[]

ShipmentRoute

Pomaganie algorytmowi optymalizacji w znalezieniu pierwszego rozwiązania podobnego 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ć podstawowe założenia dotyczące ważności:

  • w przypadku wszystkich tras vehicle_index musi należeć do zakresu i nie może się powtarzać.
  • dla wszystkich wizyt shipment_index i visit_request_index muszą się mieścić w zakresie.
  • przesyłka może być uwzględniona tylko na jednej trasie;
  • Odbiór przesyłki z odbiorem lub dostawą musi zostać zrealizowany przed dostawą.
  • nie może być dostępna więcej niż jedna opcja odbioru lub alternatywna opcja dostawy.
  • dla wszystkich tras wydłuża się (np. vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time).
  • dostawa może być realizowana tylko w pojazdach, które są do tego uprawnione; Pojazd jest dozwolony, jeśli pole Shipment.allowed_vehicle_indices jest puste lub jego vehicle_index znajduje się 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.

injected_solution_constraint

InjectedSolutionConstraint

Ogranicz algorytm optymalizacji, aby znaleźć ostateczne rozwiązanie podobne 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.

refresh_details_routes[]

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 problemu.

Od listopada 2020 r. wypełnia to tylko wielokąty na niepustych trasach i wymaga, aby parametr populate_polylines miał wartość Prawda.

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

Tego pola nie można używać razem z polami injected_first_solution_routes ani injected_solution_constraint.

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.

interpret_injected_solutions_using_labels

bool

Jeśli ma wartość prawda:

Ta interpretacja ma zastosowanie do pól injected_first_solution_routes, injected_solution_constraint i refresh_details_routes. 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 wartość to prawda, etykiety z tych kategorii mogą pojawić się w danej kategorii co najwyżej raz:

Jeśli wartość vehicle_label we wstrzykiwanym roztworze nie odpowiada pojazdowi, którego dotyczy żądanie, odpowiednia trasa jest usuwana z rozwiązania razem z wizytami. Jeśli shipment_label 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 dostawie żądania, SkippedShipment jest usuwany z rozwiązania.

Usunięcie wizyt na trasie lub całych tras z wstrzykiwanego rozwiązania może mieć wpływ na domniemane ograniczenia, co może prowadzić do zmiany rozwiązania, błędów weryfikacji lub niewykonalności.

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.

consider_road_traffic

bool

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

populate_polylines

bool

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

populate_transition_polylines

bool

Jeśli ma wartość Prawda, w odpowiedzi ShipmentRoute.transitions zostaną wypełnione ścieżki polilinii.

allow_large_deadline_despite_interruption_risk

bool

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.

use_geodesic_distances

bool

Jeśli to ustawienie ma wartość true, odległości przebycia zostaną obliczone na podstawie odległości geodezyjnych zamiast odległości w Mapach Google, a czasy przejazdu zostaną obliczone na podstawie odległości geodezyjnych przy prędkości określonej przez parametr geodesic_meters_per_second.

label

string

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

geodesic_meters_per_second

double

Jeśli use_geodesic_distances 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.

max_validation_errors

int32

Skraca liczbę zwróconych błędów weryfikacji. Błędy te są zwykle dołączone do ładunku błędu Błędn_AR jako szczegóły błędu BadRequest (https://cloud.google.com/apis/design/errors#error_details), chyba że troubleshooting_mode=VALIDATE_ONLY: zobacz pole OptimizeToursResponse.validation_errors. Domyślna wartość to 100, a maksymalna – 10 tys.

SearchMode

Tryb określający działanie wyszukiwania, kompensujący czas oczekiwania z jakością rozwiązania. We wszystkich trybach egzekwowany jest globalny termin żądań.

Wartości w polu enum
SEARCH_MODE_UNSPECIFIED Nieokreślony tryb wyszukiwania, odpowiednik funkcji RETURN_FAST.
RETURN_FAST Zatrzymaj wyszukiwanie po znalezieniu pierwszego dobrego rozwiązania.
CONSUME_ALL_AVAILABLE_TIME Poświęć cały dostępny czas na szukanie lepszych rozwiązań.

SolvingMode

Określa sposób obsługi żądania przez rozwiązanie. Jeśli żądanie będzie nieprawidłowe, we wszystkich trybach oprócz VALIDATE_ONLY, wystąpi błąd INVALID_REQUEST. Informacje o ograniczaniu liczby zwracanych błędów znajdziesz w sekcji max_validation_errors.

Wartości w polu enum
DEFAULT_SOLVE Rozwiąż model. Ostrzeżenia mogą być wyświetlane w [OptimizeToursResponse.validation_errors][google.cloud.optymalizacja.v1.OptimizeToursResponse.validation_errors].
VALIDATE_ONLY Sprawdza tylko model bez rozwiązania problemu: wypełnia jak najwięcej parametrów OptimizeToursResponse.validation_errors.
DETECT_SOME_INFEASIBLE_SHIPMENTS

Wypełnia tylko pola OptimizeToursResponse.validation_errors lub OptimizeToursResponse.skipped_shipments, a nie rozwiązuje reszty żądania (w odpowiedzi nie są ustawione pola status ani routes). Jeśli zostaną wykryte problemy na trasach (injected_solution_constraint), zostaną one wypełnione w polu OptimizeToursResponse.validation_errors, a pole OptimizeToursResponse.skipped_shipments pozostanie puste.

WAŻNE: zwracane są tylko te przesyłki, które zostały wykryte jako niemożliwe do zrealizowania podczas wstępnego przetwarzania.

OptimizeToursResponse

Odpowiedź po rozwiązaniu problemu optymalizacji wycieczki obejmującego trasy, które należy pokonywać w przypadku każdego pojazdu, pominięte przesyłki i całkowity koszt rozwiązania.

Pola
routes[]

ShipmentRoute

trasy wyznaczone dla każdego pojazdu; i-ta trasa odpowiada i-temu pojazdowi w modelu.

request_label

string

Kopia OptimizeToursRequest.label, jeśli w żądaniu określono etykietę.

skipped_shipments[]

SkippedShipment

Lista wszystkich pominiętych przesyłek.

validation_errors[]

OptimizeToursValidationError

Lista wszystkich błędów weryfikacji, które udało nam się wykryć niezależnie. Zobacz „WIELE BŁĘDÓW” wyjaśnienie dotyczące komunikatu OptimizeToursValidationError. Zamiast błędów pojawią się ostrzeżenia, jeśli solving_mode ma wartość DEFAULT_SOLVE.

metrics

Metrics

Dane o czasie trwania, odległości i użytkowaniu tego rozwiązania.

Dane

Zbiorcze wskaźniki, zagregowane dla wszystkich tras.

Pola
aggregated_route_metrics

AggregatedMetrics

Dane zagregowane na trasach. Poszczególne dane to suma (lub maksimum, w przypadku obciążeń) we wszystkich polach ShipmentRoute.metrics o tej samej nazwie.

skipped_mandatory_shipment_count

int32

Liczba pominiętych przesyłek obowiązkowych.

used_vehicle_count

int32

Liczba wykorzystywanych pojazdów. Uwaga: jeśli trasa pojazdu jest pusta, a Vehicle.used_if_route_is_empty ma wartość prawda, pojazd jest uznawany za używany.

earliest_vehicle_start_time

Timestamp

Najwcześniejszy czas rozpoczęcia używania pojazdu, obliczony jako minimalny dla wszystkich używanych pojazdów ShipmentRoute.vehicle_start_time.

latest_vehicle_end_time

Timestamp

Najpóźniejszy czas zakończenia dla używanego pojazdu, obliczony jako maksymalny dla wszystkich używanych pojazdów ShipmentRoute.vehicle_end_time.

costs

map<string, double>

Koszt rozwiązania z podziałem na pola żądania związane z kosztami. Klucze to ścieżki proto, odnoszące się do wejścia OptimizeToursRequest, np. „model.shipments.pickups.cost”, a wartości to łączny koszt wygenerowany przez odpowiednie pole kosztu, zsumowany w całym rozwiązaniu. Inaczej mówiąc, koszt["model.shipments.pickups.cost"] to suma wszystkich kosztów odbioru w ramach danego rozwiązania. Wszystkie koszty zdefiniowane w modelu są uwzględnione w szczegółowym raporcie z wyjątkiem kosztów związanych z atrybutami przejścia, które od 2022 roku są raportowane tylko w postaci zbiorczej.

total_cost

double

Całkowity koszt rozwiązania. Suma wszystkich wartości na mapie kosztów.

OptimizeToursValidationError

Opisuje błąd lub ostrzeżenie występujące podczas sprawdzania OptimizeToursRequest.

Pola
code

int32

Błąd weryfikacji jest definiowany przez parę (code, display_name), która jest zawsze obecna.

Inne pola (poniżej) zawierają więcej informacji o błędzie.

WIELE BŁĘDÓW: gdy występuje wiele błędów, proces weryfikacji próbuje wygenerować kilka z nich. Podobnie jak w przypadku kompilatorów, jest to proces niedoskonały. Niektóre błędy weryfikacji są „krytyczne”, co oznacza, że zatrzymują cały proces weryfikacji. Dotyczy to między innymi display_name="UNSPECIFIED" błędów. Niektóre z nich mogą spowodować pominięcie innych błędów podczas weryfikacji.

Stabilność: rozwiązania code i display_name powinny być bardzo stabilne. Z czasem mogą jednak pojawiać się nowe kody i wyświetlane nazwy, co może spowodować, że dane (nieprawidłowe) żądanie wygeneruje inną parę (code, display_name), ponieważ nowy błąd ukrył starą (patrz „WIELE BŁĘDÓW”).

REFERENCYJNE: lista wszystkich par (kod, nazwa):

  • UNSPECIFIED = 0;
  • VALIDATION_TIMEOUT_ERROR = 10; Nie udało się przeprowadzić weryfikacji w wyznaczonym terminie.
  • REQUEST_OPTIONS_ERROR = 12;

    • REQUEST_OPTIONS_INVALID_SOLVING_MODE = 1201;
    • REQUEST_OPTIONS_INVALID_MAX_VALIDATION_ERRORS = 1203;
    • REQUEST_OPTIONS_INVALID_GEODESIC_METERS_PER_SECOND = 1204;
    • REQUEST_OPTIONS_GEODESIC_METERS_PER_SECOND_TOO_SMALL = 1205;
    • REQUEST_OPTIONS_MISSING_GEODESIC_METERS_PER_SECOND = 1206;
    • REQUEST_OPTIONS_POPULATE_PATHFINDER_TRIPS_AND_GEODESIC_DISTANCE = 1207;
    • REQUEST_OPTIONS_COST_MODEL_OPTIONS_AND_GEODESIC_DISTANCE = 1208;
    • REQUEST_OPTIONS_TRAVEL_MODE_INCOMPATIBLE_WITH_TRAFFIC = 1211;
    • REQUEST_OPTIONS_MULTIPLE_TRAFFIC_FLAVORS = 1212;
    • REQUEST_OPTIONS_INVALID_TRAFFIC_FLAVOR = 1213;
    • REQUEST_OPTIONS_TRAFFIC_ENABLED_WITHOUT_GLOBAL_START_TIME = 1214;
    • REQUEST_OPTIONS_TRAFFIC_ENABLED_WITH_PRECEDENCES = 1215;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_MODE_Nieprawidłowy = 1216;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_ENABLED_WITHOUT_TRAFFIC = 1217;
  • INJECTED_SOLUTION_ERROR = 20;
    • INJECTED_SOLUTION_MISSING_LABEL = 2000;
    • INJECTED_SOLUTION_DUPLICATE_LABEL = 2001;
    • INJECTED_SOLUTION_AMBIGUOUS_INDEX = 2002;
    • INJECTED_SOLUTION_INFEASIBLE_AFTER_GETTING_TRAVEL_TIMES = 2003;
    • INJECTED_SOLUTION_TRANSITION_INCONSISTENT_WITH_ACTUAL_TRAVEL = 2004;
    • INJECTED_SOLUTION_CONCURRENT_SOLUTION_TYPES = 2005;
    • INJECTED_SOLUTION_MORE_THAN_ONE_PER_TYPE = 2006;
    • INJECTED_SOLUTION_REFRESH_WITHOUT_POPULATE = 2008;
    • INJECTED_SOLUTION_CONSTRAINED_ROUTE_PORTION_INFEASIBLE = 2010;
  • SHIPMENT_MODEL_ERROR = 22;
    • SHIPMENT_MODEL_TOO_LARGE = 2200;
    • SHIPMENT_MODEL_TOO_MANY_CAPACITY_TYPES = 2201;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_NEGATIVE_OR_NAN = 2202;
    • SHIPMENT_MODEL_GLOBAL_END_TIME_TOO_LARGE_OR_NAN = 2203;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_AFTER_GLOBAL_END_TIME = 2204;
    • SHIPMENT_MODEL_GLOBAL_DURATION_TOO_LONG = 2205;
    • SHIPMENT_MODEL_MAX_ACTIVE_VEHICLES_NOT_POSITIVE = 2206;
    • SHIPMENT_MODEL_DURATION_MATRIX_TOO_LARGE = 2207;
  • INDEX_ERROR = 24;
  • TAG_ERROR = 26;
  • TIME_WINDOW_ERROR = 28;
    • TIME_WINDOW_INVALID_START_TIME = 2800;
    • TIME_WINDOW_INVALID_END_TIME = 2801;
    • TIME_WINDOW_INVALID_SOFT_START_TIME = 2802;
    • TIME_WINDOW_INVALID_SOFT_END_TIME = 2803;
    • TIME_WINDOW_OUTSIDE_GLOBAL_TIME_WINDOW = 2804;
    • TIME_WINDOW_START_TIME_AFTER_END_TIME = 2805;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_BEFORE_SOFT_START_TIME = 2806;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_AFTER_SOFT_END_TIME = 2807;
    • TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_WITHOUT_SOFT_START_TIME = 2808;
    • TIME_WINDOW_COST_AFTER_SOFT_END_TIME_WITHOUT_SOFT_END_TIME = 2809;
    • TIME_WINDOW_SOFT_START_TIME_WITHOUT_COST_BEFORE_SOFT_START_TIME = 2810;
    • TIME_WINDOW_SOFT_END_TIME_WITHOUT_COST_AFTER_SOFT_END_TIME = 2811;
    • TIME_WINDOW_OVERLAPPING_ADJACENT_OR_EARLIER_THAN_PREVIOUS = 2812;
    • TIME_WINDOW_START_TIME_AFTER_SOFT_START_TIME = 2813;
    • TIME_WINDOW_SOFT_START_TIME_OUTSIDE_GLOBAL_TIME_WINDOW = 2819;
    • TIME_WINDOW_SOFT_END_TIME_OUTSIDE_GLOBAL_TIME_WINDOW = 2820;
    • TIME_WINDOW_SOFT_END_TIME_AFTER_END_TIME = 2816;
    • TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_SET_AND_MULTIPLE_WINDOWS = 2817;
    • TIME_WINDOW_COST_AFTER_SOFT_END_TIME_SET_AND_MULTIPLE_WINDOWS = 2818;
    • TRANSITION_ATTRIBUTES_ERROR = 30;
    • TRANSITION_ATTRIBUTES_INVALID_COST = 3000;
    • TRANSITION_ATTRIBUTES_INVALID_COST_PER_KILOMETER = 3001;
    • TRANSITION_ATTRIBUTES_DUPLICATE_TAG_PAIR = 3002;
    • TRANSITION_ATTRIBUTES_DISTANCE_LIMIT_MAX_METERS_UNSUPPORTED = 3003;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_SOURCE_TAGS = 3004;
    • TRANSITION_ATTRIBUTES_CONFLICTING_SOURCE_TAGS_FIELDS = 3005;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_DESTINATION_TAGS = 3006;
    • TRANSITION_ATTRIBUTES_CONFLICTING_DESTINATION_TAGS_FIELDS = 3007;
    • TRANSITION_ATTRIBUTES_MAX_DURATION_NEGATIVE_OR_NAN = 3008;
    • TRANSITION_ATTRIBUTES_DELAY_DURATION_EXCEEDS_GLOBAL_DURATION = 3009;
  • AMOUNT_ERROR = 31;
    • AMOUNT_NEGATIVE_VALUE = 3100;
  • LOAD_LIMIT_ERROR = 33;
    • LOAD_LIMIT_INVALID_COST_ABOVE_SOFT_MAX = 3303;
    • LOAD_LIMIT_SOFT_MAX_WITHOUT_COST_ABOVE_SOFT_MAX = 3304;
    • LOAD_LIMIT_COST_ABOVE_SOFT_MAX_WITHOUT_SOFT_MAX = 3305;
    • LOAD_LIMIT_NEGATIVE_SOFT_MAX = 3306;
    • LOAD_LIMIT_MIXED_DEMAND_TYPE = 3307;
    • LOAD_LIMIT_MAX_LOAD_NEGATIVE_VALUE = 3308;
    • LOAD_LIMIT_SOFT_MAX_ABOVE_MAX = 3309;
  • INTERVAL_ERROR = 34;
    • INTERVAL_MIN_EXCEEDS_MAX = 3401;
    • INTERVAL_NEGATIVE_MIN = 3402;
    • INTERVAL_NEGATIVE_MAX = 3403;
    • INTERVAL_MIN_EXCEEDS_CAPACITY = 3404;
    • INTERVAL_MAX_EXCEEDS_CAPACITY = 3405;
  • DISTANCE_LIMIT_ERROR = 36;
    • DISTANCE_LIMIT_INVALID_COST_AFTER_SOFT_MAX = 3601;
    • DISTANCE_LIMIT_SOFT_MAX_WITHOUT_COST_AFTER_SOFT_MAX = 3602;
    • DISTANCE_LIMIT_COST_AFTER_SOFT_MAX_WITHOUT_SOFT_MAX = 3603;
    • DISTANCE_LIMIT_NEGATIVE_MAX = 3604;
    • DISTANCE_LIMIT_NEGATIVE_SOFT_MAX = 3605;
    • DISTANCE_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3606;
  • DURATION_LIMIT_ERROR = 38;
    • DURATION_LIMIT_MAX_DURATION_NEGATIVE_OR_NAN = 3800;
    • DURATION_LIMIT_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3801;
    • DURATION_LIMIT_INVALID_COST_PER_HOUR_AFTER_SOFT_MAX = 3802;
    • DURATION_LIMIT_SOFT_MAX_WITHOUT_COST_AFTER_SOFT_MAX = 3803;
    • DURATION_LIMIT_COST_AFTER_SOFT_MAX_WITHOUT_SOFT_MAX = 3804;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3805;
    • DURATION_LIMIT_INVALID_COST_AFTER_QUADRATIC_SOFT_MAX = 3806;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_COST_PER_SQUARE_HOUR = 3807;
    • DURATION_LIMIT_COST_PER_SQUARE_HOUR_WITHOUT_QUADRATIC_SOFT_MAX = 3808;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_MAX = 3809;
    • DURATION_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3810;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_LARGER_THAN_MAX = 3811;
    • DURATION_LIMIT_DIST_BETWEEN_MAX_AND_QUADRATIC_SOFT_MAX_TOO_LARGE = 3812;
    • DURATION_LIMIT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3813;
    • DURATION_LIMIT_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3814;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3815;
  • SHIPMENT_ERROR = 40;
    • SHIPMENT_PD_LIMIT_WITHOUT_PICKUP_AND_DELIVERY = 4014;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_NEGATIVE_OR_NAN = 4000;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4001;
    • SHIPMENT_PD_RELATIVE_DETOUR_LIMIT_INVALID = 4015;
    • SHIPMENT_PD_DETOUR_LIMIT_AND_EXTRA_VISIT_DURATION = 4016;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_NEGATIVE_OR_NAN = 4002;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4003;
    • SHIPMENT_EMPTY_SHIPMENT_TYPE = 4004;
    • SHIPMENT_NO_PICKUP_NO_DELIVERY = 4005;
    • SHIPMENT_INVALID_PENALTY_COST = 4006;
    • SHIPMENT_ALLOWED_VEHICLE_INDEX_OUT_OF_BOUNDS = 4007;
    • SHIPMENT_DUPLICATE_ALLOWED_VEHICLE_INDEX = 4008;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITHOUT_INDEX = 4009;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITH_INDEX = 4010;
    • SHIPMENT_INVALID_COST_FOR_VEHICLE = 4011;
    • SHIPMENT_COST_FOR_VEHICLE_INDEX_OUT_OF_BOUNDS = 4012;
    • SHIPMENT_DUPLICATE_COST_FOR_VEHICLE_INDEX = 4013;
  • VEHICLE_ERROR = 42;
    • VEHICLE_EMPTY_REQUIRED_OPERATOR_TYPE = 4200;
    • VEHICLE_DUPLICATE_REQUIRED_OPERATOR_TYPE = 4201;
    • VEHICLE_NO_OPERATOR_WITH_REQUIRED_OPERATOR_TYPE = 4202;
    • VEHICLE_EMPTY_START_TAG = 4203;
    • VEHICLE_DUPLICATE_START_TAG = 4204;
    • VEHICLE_EMPTY_END_TAG = 4205;
    • VEHICLE_DUPLICATE_END_TAG = 4206;
    • VEHICLE_EXTRA_VISIT_DURATION_NEGATIVE_OR_NAN = 4207;
    • VEHICLE_EXTRA_VISIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4208;
    • VEHICLE_EXTRA_VISIT_DURATION_EMPTY_KEY = 4209;
    • VEHICLE_FIRST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4210;
    • VEHICLE_FIRST_SHIPMENT_IGNORED = 4211;
    • VEHICLE_FIRST_SHIPMENT_NOT_BOUND = 4212;
    • VEHICLE_LAST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4213;
    • VEHICLE_LAST_SHIPMENT_IGNORED = 4214;
    • VEHICLE_LAST_SHIPMENT_NOT_BOUND = 4215;
    • VEHICLE_IGNORED_WITH_USED_IF_ROUTE_IS_EMPTY = 4216;
    • VEHICLE_INVALID_COST_PER_KILOMETER = 4217;
    • VEHICLE_INVALID_COST_PER_HOUR = 4218;
    • VEHICLE_INVALID_COST_PER_TRAVELED_HOUR = 4219;
    • VEHICLE_INVALID_FIXED_COST = 4220;
    • VEHICLE_INVALID_TRAVEL_DURATION_MULTIPLE = 4221;
    • VEHICLE_TRAVEL_DURATION_MULTIPLE_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4223;
    • VEHICLE_MATRIX_INDEX_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4224;
    • VEHICLE_MINIMUM_DURATION_LONGER_THAN_DURATION_LIMIT = 4222;
  • VISIT_REQUEST_ERROR = 44;
    • VISIT_REQUEST_EMPTY_TAG = 4400;
    • VISIT_REQUEST_DUPLICATE_TAG = 4401;
    • VISIT_REQUEST_DURATION_NEGATIVE_OR_NAN = 4404;
    • VISIT_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4405;
  • PRECEDENCE_ERROR = 46;
    • PRECEDENCE_RULE_MISSING_FIRST_INDEX = 4600;
    • PRECEDENCE_RULE_MISSING_SECOND_INDEX = 4601;
    • PRECEDENCE_RULE_FIRST_INDEX_OUT_OF_BOUNDS = 4602;
    • PRECEDENCE_RULE_SECOND_INDEX_OUT_OF_BOUNDS = 4603;
    • PRECEDENCE_RULE_DUPLICATE_INDEX = 4604;
    • PRECEDENCE_RULE_INEXISTENT_FIRST_VISIT_REQUEST = 4605;
    • PRECEDENCE_RULE_INEXISTENT_SECOND_VISIT_REQUEST = 4606;
  • BREAK_ERROR = 48;
    • BREAK_RULE_EMPTY = 4800;
    • BREAK_REQUEST_UNSPECIFIED_DURATION = 4801;
    • BREAK_REQUEST_UNSPECIFIED_EARLIEST_START_TIME = 4802;
    • BREAK_REQUEST_UNSPECIFIED_LATEST_START_TIME = 4803;
    • BREAK_REQUEST_DURATION_NEGATIVE_OR_NAN = 4804; = 4804;
    • BREAK_REQUEST_LATEST_START_TIME_BEFORE_EARLIEST_START_TIME = 4805;
    • BREAK_REQUEST_EARLIEST_START_TIME_BEFORE_GLOBAL_START_TIME = 4806;
    • BREAK_REQUEST_LATEST_END_TIME_AFTER_GLOBAL_END_TIME = 4807;
    • BREAK_REQUEST_NON_SCHEDULABLE = 4808;
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_NEGATIVE_OR_NAN = 4809;
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_NEGATIVE_OR_NAN = 4810;
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4811;
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4812;
    • BREAK_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4813;
    • BREAK_FREQUENCY_MISSING_MAX_INTER_BREAK_DURATION = 4814;
    • BREAK_FREQUENCY_MISSING_MIN_BREAK_DURATION = 4815;
  • SHIPMENT_TYPE_INCOMPATIBILITY_ERROR = 50;
    • SHIPMENT_TYPE_INCOMPATIBILITY_EMPTY_TYPE = 5001;
    • SHIPMENT_TYPE_INCOMPATIBILITY_LESS_THAN_TWO_TYPES = 5002;
    • SHIPMENT_TYPE_INCOMPATIBILITY_DUPLICATE_TYPE = 5003;
    • SHIPMENT_TYPE_INCOMPATIBILITY_INVALID_INCOMPATIBILITY_MODE = 5004;
    • SHIPMENT_TYPE_INCOMPATIBILITY_TOO_MANY_INCOMPATIBILITIES = 5005;
  • SHIPMENT_TYPE_REQUIREMENT_ERROR = 52;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE = 52001;
    • SHIPMENT_TYPE_REQUIREMENT_NO_DEPENDENT_TYPE = 52002;
    • SHIPMENT_TYPE_REQUIREMENT_INVALID_REQUIREMENT_MODE = 52003;
    • SHIPMENT_TYPE_REQUIREMENT_TOO_MANY_REQUIREMENTS = 52004;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_REQUIRED_TYPE = 52005;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_REQUIRED_TYPE = 52006;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE_FOUND = 52007;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_DEPENDENT_TYPE = 52008;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_DEPENDENT_TYPE = 52009;
    • SHIPMENT_TYPE_REQUIREMENT_SELF_DEPENDENT_TYPE = 52010;
    • SHIPMENT_TYPE_REQUIREMENT_GRAPH_HAS_CYCLES = 52011;
  • VEHICLE_OPERATOR_ERROR = 54;
    • VEHICLE_OPERATOR_EMPTY_TYPE = 5400;
    • VEHICLE_OPERATOR_MULTIPLE_START_TIME_WINDOWS = 5401;
    • VEHICLE_OPERATOR_SOFT_START_TIME_WINDOW = 5402;
    • VEHICLE_OPERATOR_MULTIPLE_END_TIME_WINDOWS = 5403;
    • VEHICLE_OPERATOR_SOFT_END_TIME_WINDOW = 5404;
  • DURATION_SECONDS_MATRIX_ERROR = 56;
    • DURATION_SECONDS_MATRIX_DURATION_NEGATIVE_OR_NAN = 5600;
    • DURATION_SECONDS_MATRIX_DURATION_EXCEEDS_GLOBAL_DURATION = 5601;
  • OSTRZEŻENIE = 9;
    • WARNING_INJECTED_FIRST_SOLUTION = 90;
      • WARNING_INJECTED_FIRST_SOLUTION_INFEASIBLE_SHIPMENTS_REMOVED = 9000;
      • WARNING_INJECTED_FIRST_SOLUTION_INFEASIBLE_AFTER_GETTING_TRAVEL_TIMES = 9001;
display_name

string

Wyświetlana nazwa błędu.

fields[]

FieldReference

Kontekst błędu może mieć wartość 0, 1 (w większości przypadków) lub większą liczbę pól. Na przykład w odniesieniu do pojazdu nr 4 i pierwszej dostawy nr 2 można wykonać te czynności:

fields { name: "vehicles" index: 4}
fields { name: "shipments" index: 2 sub_field {name: "pickups" index: 0} }

Pamiętaj jednak, że moc zbioru funkcji fields nie powinna się zmieniać w przypadku danego kodu błędu.

error_message

string

Zrozumiały dla człowieka ciąg tekstowy opisujący błąd. Między code a error_message występuje mapowanie 1:1 (gdy kod != „UNSPECIFIED”).

STABILNOŚĆ: niestabilna: z czasem komunikat o błędzie powiązany z danym code może się zmienić (miejmy nadzieję, że na bardziej przejrzysty). Zamiast nich korzystaj z tych zasad: display_name i code.

offending_values

string

Może zawierać wartości pól. Nie zawsze jest to możliwe. Nie należy się na niego w żaden sposób opierać. Należy go używać tylko do ręcznego debugowania modelu.

Odniesienie do pola

Określa kontekst błędu weryfikacji. FieldReference zawsze odnosi się do danego pola w tym pliku i ma taką samą strukturę hierarchiczną. Możemy na przykład określić element nr 2 w atrybucie start_time_windows pojazdu nr 5 za pomocą:

name: "vehicles" index: 5 sub_field { name: "end_time_windows" index: 2 }

Pomijamy jednak elementy najwyższego poziomu, takie jak OptimizeToursRequest czy ShipmentModel, aby uniknąć zatłoczenia wiadomości.

Pola
name

string

Nazwa pola, np. „pojazdy”.

sub_field

FieldReference

W razie potrzeby zagnieżdżone pole podrzędne.

Pole sumy index_or_key.

index_or_key może mieć tylko jedną z tych wartości:

index

int32

Indeks pola, jeśli się powtarza.

key

string

klucz, jeśli pole jest mapą;

OutputConfig

Określ miejsce docelowe dla wyników [BatchOptimizeTours][google.maps.routeOptimization.v1.RouteOptimizationService.BatchOptimizeTours].

Pola
data_format

DataFormat

Wymagane. Format danych wyjściowych.

Pole sumy destination. Wymagane. destination może mieć tylko jedną z tych wartości:
gcs_destination

GcsDestination

Lokalizacja w Google Cloud Storage, w której będą zapisywane dane wyjściowe.

RouteModifiers

Obejmuje zestaw opcjonalnych warunków, które muszą zostać spełnione przy obliczaniu tras pojazdów. Jest to podobne do RouteModifiers w interfejsie API Preferowane trasy na platformie Mapy Google (https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers).

Pola
avoid_tolls

bool

Określa, czy w uzasadnionych przypadkach unikać dróg płatnych. Preferowane będą trasy, które nie zawierają dróg płatnych. Dotyczy to tylko pojazdów mechanicznych.

avoid_highways

bool

Określa, czy w uzasadnionych przypadkach unikać autostrad. Priorytet będą miały trasy niezawierające autostrad. Dotyczy tylko pojazdów z silnikiem.

avoid_ferries

bool

Określa, czy w uzasadnionych sytuacjach unikać przepraw promowych. Pierwszeństwo będą miały trasy, które nie będą obejmować podróży promami. Dotyczy tylko pojazdów z silnikiem.

avoid_indoor

bool

Opcjonalnie: Określa, czy w uzasadnionych przypadkach unikać przechodzenia do wnętrz. Preferowane będą trasy niezawierające nawigacji wewnątrz budynków. Dotyczy tylko środka transportu WALKING.

Wysyłka

Dostawa pojedynczego produktu, od odbioru do jednej dostawy. Aby przesyłka została uznana za zrealizowaną, musi być dostarczona przez unikalne pojazdy, które odwiedzą najpierw jedno z miejsc odbioru (i odpowiednio zmniejszą liczbę wolnych miejsc), a następnie jedno z miejsc dostawy (i odpowiednio zwiększą liczbę wolnych miejsc).

Pola
display_name

string

Zdefiniowana przez użytkownika wyświetlana nazwa przesyłki. Może składać się z maksymalnie 63 znaków i zawierać znaki UTF-8.

pickups[]

VisitRequest

Zestaw alternatyw odbioru powiązanych z przesyłką. Jeśli nie określono inaczej, pojazd musi tylko odwiedzić lokalizację odpowiadającą dostawom.

deliveries[]

VisitRequest

Zestaw alternatywnych opcji dostawy powiązanych z dostawą. Jeśli go nie podasz, pojazd musi udać się tylko do lokalizacji odpowiadającej punktom odbioru.

load_demands

map<string, Load>

wymagania dotyczące ładunku (np. waga, objętość, liczba palet itp.); Klucze w mapie powinny być identyfikatorami, które opisują typ odpowiadającego im obciążenia. W idealnej sytuacji powinny też zawierać jednostki. Na przykład: „weight_kg”, „volume_gallons”, „pallet_count” itp. Jeśli dany klucz nie pojawi się na mapie, odpowiadające mu obciążenie zostanie uznane za puste.

allowed_vehicle_indices[]

int32

Zestaw pojazdów, które mogą zrealizować tę przesyłkę. Jeśli pole jest puste, wszystkie pojazdy mogą je wykonać. Pojazdy są podawane według indeksu na liście vehicles w: ShipmentModel.

costs_per_vehicle[]

double

Określa koszt, jaki jest naliczany w momencie dostarczenia tej przesyłki przez każdy pojazd. Jeśli pole jest określone, musi zawierać KAŻDY:

  • tyle samo co costs_per_vehicle_indices. costs_per_vehicle[i] odpowiada pojazdowi costs_per_vehicle_indices[i] tego modelu.
  • tyle samo elementów, ile jest w modelu. i-tym element odpowiada pojazdowi nr i modelu.

Te koszty muszą być wyrażone w tych samych jednostkach co penalty_cost i nie mogą być ujemne. Jeśli nie ma takich kosztów, pozostaw to pole puste.

costs_per_vehicle_indices[]

int32

Indeksy pojazdów, do których ma zastosowanie costs_per_vehicle. Jeśli pole nie jest puste, musi zawierać taką samą liczbę elementów jak costs_per_vehicle. Indeks pojazdu nie można określić więcej niż raz. Jeśli pojazd jest wykluczony z programu costs_per_vehicle_indices, jego koszt wynosi 0.

pickup_to_delivery_absolute_detour_limit

Duration

Określa maksymalny bezwzględny czas objazdu w porównaniu z najkrótszą ścieżką od odbioru do dostawy. Jeśli jest określona, nie może być ujemna, a przesyłka musi zawierać co najmniej informacje o odbiorze i dostawie.

Na przykład nie może to być najkrótszy czas, jaki zajmie Ci przejście z wybranej opcji odbioru bezpośrednio do wybranej opcji dostawy. Następnie ustawienie zasady pickup_to_delivery_absolute_detour_limit wymusza:

start_time(delivery) - start_time(pickup) <=
t + pickup_to_delivery_absolute_detour_limit

Jeśli w przypadku tej samej przesyłki określono zarówno limity względne, jak i bezwzględne, dla każdej możliwej pary odbioru/dostawy stosowany jest bardziej restrykcyjny limit. Od 2017 r. objazdy są obsługiwane tylko wtedy, gdy czas podróży nie zależy od pojazdów.

pickup_to_delivery_time_limit

Duration

Określa maksymalny czas od rozpoczęcia odbioru do rozpoczęcia dostawy przesyłki. Jeśli jest określona, nie może być ujemna, a przesyłka musi zawierać co najmniej informacje o odbiorze i dostawie. Nie zależy to od tego, które opcje odbioru i dostawy są wybrane ani od prędkości pojazdu. Można je określić razem z ograniczeniami maksymalnego objazdu: rozwiązanie będzie uwzględniać obie specyfikacje.

shipment_type

string

Niepusty ciąg znaków określający „typ” za tę przesyłkę. Ta funkcja może służyć do definiowania niezgodności lub wymagań między shipment_types (zobacz shipment_type_incompatibilities i shipment_type_requirements w sekcji ShipmentModel).

Różnica w porównaniu z visit_types, który jest określony dla pojedynczej wizyty: wszystkie odbiory i dostawy należące do tego samego zamówienia mają ten sam shipment_type.

label

string

Określa etykietę dla tej przesyłki. Ta etykieta jest podawana w odpowiedzi w shipment_label odpowiedniego elementu ShipmentRoute.Visit.

ignore

bool

Jeśli tak, pomiń tę przesyłkę, ale nie stosuj penalty_cost.

Zignorowanie dostawy powoduje błąd weryfikacji, gdy w modelu występują shipment_type_requirements.

Ignorowanie dostawy realizowanej w ramach injected_first_solution_routes lub injected_solution_constraint jest dozwolone; Solver usuwa powiązane wizyty odbioru/dostawy z trasy. precedence_rules, które odwołują się do ignorowanych przesyłek, również będą ignorowane.

penalty_cost

double

Jeśli przesyłka nie zostanie zrealizowana, ta kara zostanie dodana do łącznego kosztu tras. Wysyłka jest uznawana za zrealizowaną, jeśli dostępna jest jedna z alternatywnych opcji odbioru lub dostawy. Koszt może być wyrażony w tej samej jednostce, która jest używana we wszystkich innych polach związanych z kosztem w modelu, i musi być dodatni.

WAŻNE: jeśli ta kara nie zostanie określona, uznamy ją za nieskończoną, co oznacza, że dostawa musi zostać zrealizowana.

pickup_to_delivery_relative_detour_limit

double

Określa maksymalny czas dojazdu do miejsca docelowego w porównaniu z najkrótszą ścieżką od miejsca odbioru do miejsca dostawy. Jeśli jest określona, nie może być ujemna, a przesyłka musi zawierać co najmniej informacje o odbiorze i dostawie.

Na przykład nie może to być najkrótszy czas, jaki zajmie Ci przejście z wybranej opcji odbioru bezpośrednio do wybranej opcji dostawy. Następnie ustawienie zasady pickup_to_delivery_relative_detour_limit wymusza:

start_time(delivery) - start_time(pickup) <=
std::ceil(t * (1.0 + pickup_to_delivery_relative_detour_limit))

Jeśli w przypadku tej samej przesyłki określono zarówno limity względne, jak i bezwzględne, dla każdej możliwej pary odbioru/dostawy stosowany jest bardziej restrykcyjny limit. Od października 2017 r. objazdy są obsługiwane tylko wtedy, gdy czas podróży nie zależy od pojazdów.

Wczytaj

Podczas wizyty może zostać dodana do ładunku pojazdu wstępnie określona kwota (jeśli jest to odbiór) lub odejmowana w przypadku dostawy. Tę kwotę definiuje ten komunikat. Zobacz load_demands.

Pola
amount

int64

Obciążenie pojazdu wykonującego daną wizytę, o ile będzie się ono zmieniać. Jest to liczba całkowita, dlatego zaleca się wybranie odpowiedniej jednostki, aby uniknąć utraty dokładności. Wartość musi być ≥ 0.

VisitRequest

Prośba o zwiedzanie, którą może zrealizować pojazd: określona lokalizacja geograficzna (lub dwie, patrz poniżej), godziny otwarcia i zamknięcia wyrażone w przedziałach czasowych oraz czas trwania obsługi (czas spędzony przez pojazd po dotarciu do miejsca odbioru lub odesłaniu towarów).

Pola
arrival_location

LatLng

Lokalizacja geograficzna, do której przyjeżdża pojazd podczas wykonywania tej czynności (VisitRequest). Jeśli model dostawy zawiera macierze odległości między czasem trwania, nie można podawać wartości arrival_location.

arrival_waypoint

Waypoint

Punkt orientacyjny, w którym pojazd dociera podczas wykonywania tego VisitRequest. Jeśli model dostawy zawiera macierze odległości między czasem trwania, nie można podawać wartości arrival_waypoint.

departure_location

LatLng

Lokalizacja geograficzna, z której pojazd odjeżdża po ukończeniu tego celu: VisitRequest. Tę wartość można pominąć, jeśli jest taka sama jak arrival_location. Jeśli model dostawy zawiera macierze odległości czasowej, nie można podać parametru departure_location.

departure_waypoint

Waypoint

Punkt orientacyjny, w którym pojazd rusza po zakończeniu tego VisitRequest. Tę wartość można pominąć, jeśli jest taka sama jak arrival_waypoint. Jeśli model dostawy zawiera macierze odległości między czasem trwania, nie można podawać wartości departure_waypoint.

tags[]

string

Określa tagi dołączone do żądania wizyty. Puste lub zduplikowane ciągi znaków są niedozwolone.

time_windows[]

TimeWindow

Przedziały czasu, które ograniczają godzinę przybycia podczas wizyty. Pamiętaj, że pojazd może odjechać poza przedział czasu przyjazdu, tj. godzina przyjazdu + czas przyjazdu nie muszą znajdować się w określonym przedziale czasu. Może to spowodować oczekiwanie, jeśli pojazd dotrze przed TimeWindow.start_time.

Brak wartości TimeWindow oznacza, że pojazd może wykonać tę wizytę w dowolnym momencie.

Okna czasowe muszą być odseparowane, co oznacza, że żadne z nich nie może się pokrywać z innym ani być sąsiadować z innym. Okna czasowe muszą być uporządkowane w rosnącej kolejności.

Wartości cost_per_hour_after_soft_end_time i soft_end_time można ustawić tylko wtedy, gdy istnieje 1 przedział czasu.

duration

Duration

Czas trwania wizyty, czyli czas spędzony przez pojazd między przybyciem a odejściem (dodawany do możliwego czasu oczekiwania; patrz time_windows).

cost

double

Koszt obsługi tej prośby o wizytę w przypadku trasy pojazdu. Umożliwia ona pokrycie różnych kosztów każdego alternatywnego odbioru lub dostawy przesyłki. Koszt musi być w tej samej jednostce co Shipment.penalty_cost i nie może być ujemny.

load_demands

map<string, Load>

Wczytywanie żądań dotyczących tej wizyty. Jest to pole podobne do pola Shipment.load_demands, z tym że ma zastosowanie tylko do tego elementu VisitRequest, a nie do całego elementu Shipment. Wymagania wymienione tutaj są dodawane do wymagań wymienionych w Shipment.load_demands.

visit_types[]

string

Określa typy wizyty. Możesz go wykorzystać, aby zarezerwować dodatkowy czas wymagany na dokonanie tej wizyty (patrz Vehicle.extra_visit_duration_for_visit_type).

Typ może wystąpić tylko raz.

label

string

Określa etykietę elementu VisitRequest. Ta etykieta jest zgłaszany w odpowiedzi jako visit_label w odpowiedniej wartości ShipmentRoute.Visit.

ShipmentModel

Model dostawy zawiera zestaw dostaw, które muszą być realizowane przez zestaw pojazdów, przy jednoczesnym minimalizowaniu łącznego kosztu, który jest sumą:

  • koszt kierowania pojazdami (suma kosztu łącznego czasu, koszt podróży i stały koszt dla wszystkich pojazdów).
  • kary za niewykonaną dostawę.
  • koszt globalnego czasu trwania przesyłek;
Pola
shipments[]

Shipment

Zestaw dostaw, które muszą zostać zrealizowane w ramach modelu.

vehicles[]

Vehicle

Zestaw pojazdów, których można używać do wykonywania wizyt.

global_start_time

Timestamp

Globalny czas rozpoczęcia i zakończenia modelu: żadne okresy spoza tego zakresu nie mogą zostać uznane za prawidłowe.

Zakres czasowy modelu musi być krótszy niż rok, czyli global_end_timeglobal_start_time muszą być oddalone od siebie o maksymalnie 31536000 sekund.

Gdy używasz pól cost_per_*hour, możesz ustawić krótszy przedział czasu, aby zwiększyć skuteczność (np. jeśli modelujesz jeden dzień, ustaw globalne limity czasu na ten dzień). Jeśli nie jest ustawiona, domyślnie jest używany czas 00:00:00 UTC, 1 stycznia 1970 r. (tzn. sekund: 0, nanos: 0).

global_end_time

Timestamp

Jeśli nie zostanie ustawiona, domyślnie używana jest data 1 stycznia 1971 r., godzina 00:00:00 UTC (czyli 31536000 sekund, 0 nanosekund).

global_duration_cost_per_hour

double

„Globalny czas trwania” całego planu to różnica między najwcześniejszym rzeczywistym godzinem rozpoczęcia a najpóźniejszą obowiązującą godziną zakończenia wszystkich pojazdów. Użytkownicy mogą przypisać koszt za godzinę do tej ilości, aby na przykład zoptymalizować zadanie pod kątem jak najszybszego ukończenia. Ten koszt musi być w tej samej jednostce co Shipment.penalty_cost.

duration_distance_matrices[]

DurationDistanceMatrix

Określa macierze czasu trwania i odległości używane w modelu. Jeśli to pole będzie puste, zamiast niego będą używane Mapy Google lub odległości geodezyjne w zależności od wartości w polu use_geodesic_distances. Jeśli pole nie jest puste, use_geodesic_distances nie może mieć wartości Prawda, a pole duration_distance_matrix_src_tags ani duration_distance_matrix_dst_tags nie może być puste.

Przykłady użycia:

  • Są 2 lokalizacje: locA i locB.
  • 1 pojazd rozpoczynający trasę w lokalu locA i kończący go w lokalizacji locA.
  • 1 prośba o odbiór w lokalu locB.
model {
  vehicles { start_tags: "locA"  end_tags: "locA" }
  shipments { pickups { tags: "locB" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_dst_tags: "locA"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • Są trzy lokalizacje: locA, locB oraz locC.
  • 1 pojazd, który rozpoczyna swoją trasę w locA, a kończy w lokalizacji locB, korzystając z matrycy „szybkiej”.
  • 1 pojazd zaczynający trasę w miejscu locB i kończący ją w miejscu locB, korzystając z matrycy „slow”.
  • 1 pojazd, który rozpoczyna swoją trasę w locB, a kończy w lokalizacji locB, korzystając z matrycy „szybkiej”.
  • 1 prośba o odbiór w lokalu locC.
model {
  vehicles { start_tags: "locA" end_tags: "locB" start_tags: "fast" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "slow" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "fast" }
  shipments { pickups { tags: "locC" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_src_tags: "locC"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrix_dst_tags: "locC"
  duration_distance_matrices {
    vehicle_start_tag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  duration_distance_matrices {
    vehicle_start_tag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
duration_distance_matrix_src_tags[]

string

tagi definiujące źródła macierzy czasu trwania i odległości; Funkcja duration_distance_matrices(i).rows(j) określa czasy trwania i odległości od wizyt z tagiem duration_distance_matrix_src_tags(j) do innych wizyt w tabeli i.

Znaczniki odpowiadają wartości VisitRequest.tags lub Vehicle.start_tags. Podany identyfikator VisitRequest lub Vehicle musi odpowiadać dokładnie 1 tagowi w tym polu. Pamiętaj, że tagi źródła, miejsca docelowego i matrycy elementu Vehicle mogą być takie same. podobnie tag źródłowy i docelowy tagu VisitRequest mogą być takie same. Wszystkie tagi muszą być różne i nie mogą być pustymi ciągami znaków. Jeśli to pole nie jest puste, pole duration_distance_matrices nie może być puste.

duration_distance_matrix_dst_tags[]

string

tagów definiujących docelowe macierze czasu trwania i odległości; duration_distance_matrices(i).rows(j).durations(k) (odp. Funkcja duration_distance_matrices(i).rows(j).meters(k)) określa czas trwania (reprezentatywną odległość) podróży z wizyt z tagiem duration_distance_matrix_src_tags(j) do wizyt z tagiem duration_distance_matrix_dst_tags(k) w macierzy i.

Znaczniki odpowiadają wartości VisitRequest.tags lub Vehicle.start_tags. Podany parametr VisitRequest lub Vehicle musi pasować dokładnie do 1 tagu w tym polu. Pamiętaj, że tagi źródła, miejsca docelowego i matrycy elementu Vehicle mogą być takie same. podobnie tag źródłowy i docelowy tagu VisitRequest mogą być takie same. Wszystkie tagi muszą być różne i nie mogą być pustymi ciągami znaków. Jeśli to pole nie jest puste, pole duration_distance_matrices nie może być puste.

transition_attributes[]

TransitionAttributes

Atrybuty przejścia zostały dodane do modelu.

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

Zestawy niezgodnych typów przesyłki (patrz ShipmentTypeIncompatibility).

shipment_type_requirements[]

ShipmentTypeRequirement

Zestawy wymagań shipment_type (patrz ShipmentTypeRequirement).

precedence_rules[]

PrecedenceRule

Zestaw reguł pierwszeństwa, które muszą być egzekwowane w modelu.

max_active_vehicles

int32

Ogranicza maksymalną liczbę aktywnych pojazdów. Pojazd jest aktywny, jeśli na trasie jest realizowana co najmniej 1 dostawa. Można go użyć do ograniczenia liczby tras w przypadku, gdy kierowców jest mniej niż pojazdów, a flota pojazdów jest zróżnicowana. Optymalizacja wybierze najlepszy podzbiór pojazdów do użycia. Musi być wyłącznie dodatnia.

DurationDistanceMatrix

Określa czas trwania i tablicę odległości od wizyty i miejsca rozpoczęcia podróży pojazdu oraz lokalizacji końcowej pojazdu.

Pola
rows[]

Row

Określa wiersze macierzy czasu trwania i odległości. Musi się składać z tylu elementów: ShipmentModel.duration_distance_matrix_src_tags.

vehicle_start_tag

string

Tag definiujący, do których pojazdów ma zastosowanie dany czas trwania i tablica odległości. Jeśli jest pusty, ma zastosowanie do wszystkich pojazdów i może być tylko jedna matryca.

Każdy początek pojazdu musi pasować do jednej macierzy, tzn. dokładnie jedno z jego pola start_tags musi odpowiadać wartości vehicle_start_tag macierzy (i tylko tej macierzy).

Wszystkie macierze muszą mieć inną wartość vehicle_start_tag.

Wiersz

Określa wiersz macierzy czasu trwania i odległości.

Pola
durations[]

Duration

Czas trwania danego wiersza. Musi się składać z tylu elementów: ShipmentModel.duration_distance_matrix_dst_tags.

meters[]

double

Wartości odległości w danym wierszu. Jeśli w modelu nie ma żadnych kosztów ani ograniczeń odnoszących się do odległości, można pozostawić to pole puste. W przeciwnym razie musi ono zawierać tyle elementów, co durations.

PrecedenceRule

reguła pierwszeństwa między 2 zdarzeniami (każde z nich to odbiór lub dostawa przesyłki): „drugie” zdarzenie musi rozpoczynać się co najmniej offset_duration po czasie „pierwsze” rozpoczęto.

Kilka pierwszeństwa może odnosić się do tych samych (lub powiązanych) wydarzeń, np. „Odbiór towaru B odbywa się po dostarczeniu produktu A” a „odbiór produktu C odbywa się po odebraniu produktu B”.

Dodatkowo pierwszeństwo ma tylko wtedy, gdy obie przesyłki są realizowane, w przeciwnym razie są ignorowane.

Pola
first_is_delivery

bool

Wskazuje, czy „pierwszy” zdarzenie to dostawa.

second_is_delivery

bool

Wskazuje, czy parametr „second” zdarzenie to dostawa.

offset_duration

Duration

Odstęp między zdarzeniami „first” i „second”. Wynik może być ujemny.

first_index

int32

Indeks dostawy pierwszego produktu . To pole musi być określone.

second_index

int32

Indeks dostawy „sekundy” . To pole musi być określone.

ShipmentRoute

Trasa pojazdu można podzielić na osi czasu w następujący sposób (zakładamy, że jest n wizyt):

  |            |            |          |       |  T[2], |        |      |
  | Transition |  Visit #0  |          |       |  V[2], |        |      |
  |     #0     |    aka     |   T[1]   |  V[1] |  ...   | V[n-1] | T[n] |
  |  aka T[0]  |    V[0]    |          |       | V[n-2],|        |      |
  |            |            |          |       | T[n-1] |        |      |
  ^            ^            ^          ^       ^        ^        ^      ^
vehicle    V[0].start   V[0].end     V[1].   V[1].    V[n].    V[n]. vehicle
 start     (arrival)   (departure)   start   end      start    end     end

Trzeba pamiętać, że:

  • „zdarzenia punktowe”, takie jak początek i koniec podróży pojazdu, a także początek i koniec każdej wizyty (tj. przyjazd i odjazd). Mają miejsce w określonej sekundzie.
  • „przedziały czasu”, takie jak same odwiedziny i przejście między nimi. Chociaż czasami interwały czasowe mogą mieć zerową długość, czyli zaczynają się i kończą w tej samej sekundzie, często mają dodatnią długość.

Niezmienniki:

  • Jeśli jest n wizyt, występują przejścia n+1.
  • Odwiedziny są zawsze otoczone przejściem przed nią (ten sam indeks) i przejściem po niej (indeks + 1).
  • Po uruchomieniu pojazdu zawsze następuje przejście nr 0.
  • Koniec pojazdu jest zawsze poprzedzony przejściem nr n.

Oto, co się dzieje podczas TransitionVisit:

---+-------------------------------------+-----------------------------+-->
   |           TRANSITION[i]             |           VISIT[i]          |
   |                                     |                             |
   |  * TRAVEL: the vehicle moves from   |      PERFORM the visit:     |
   |    VISIT[i-1].departure_location to |                             |
   |    VISIT[i].arrival_location, which |  * Spend some time:         |
   |    takes a given travel duration    |    the "visit duration".    |
   |    and distance                     |                             |
   |                                     |  * Load or unload           |
   |  * BREAKS: the driver may have      |    some quantities from the |
   |    breaks (e.g. lunch break).       |    vehicle: the "demand".   |
   |                                     |                             |
   |  * WAIT: the driver/vehicle does    |                             |
   |    nothing. This can happen for     |                             |
   |    many reasons, for example when   |                             |
   |    the vehicle reaches the next     |                             |
   |    event's destination before the   |                             |
   |    start of its time window         |                             |
   |                                     |                             |
   |  * DELAY: *right before* the next   |                             |
   |    arrival. E.g. the vehicle and/or |                             |
   |    driver spends time unloading.    |                             |
   |                                     |                             |
---+-------------------------------------+-----------------------------+-->
   ^                                     ^                             ^
V[i-1].end                           V[i].start                    V[i].end

Na koniec zobacz, jak można zorganizować TRAVEL, PRZERW, OPÓŹNIENIA i OCZEKIWANIE w trakcie przejścia.

  • Nie nakładają się.
  • OPÓŹNIENIE jest niepowtarzalne i musi przypadać w ciągłym okresie tuż przed kolejną wizytą (lub wyłączeniem pojazdu). Dzięki temu wystarczy znać czas trwania opóźnienia, aby poznać godzinę rozpoczęcia i zakończenia.
  • BREAKS są ze sobą przylegające, niepokrywające się okresy. Odpowiedź określa czas rozpoczęcia i czas trwania każdej przerwy.
  • TRAVEL (TRAVEL) i WAIT (opóźnienia) są „wywłaszczeniowe” – mogą zostać kilka razy przerwane w trakcie tego przejścia. Klienci mogą założyć, że podróż odbywa się „jak najszybciej”, a pozostały czas jest wypełniony przez „czekanie”.

Przykład (skomplikowany):

                               TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
  ||     |       |           |       |           |         |         ||
  ||  T  |   B   |     T     |       |     B     |         |    D    ||
  ||  r  |   r   |     r     |   W   |     r     |    W    |    e    ||
  ||  a  |   e   |     a     |   a   |     e     |    a    |    l    ||
  ||  v  |   a   |     v     |   i   |     a     |    i    |    a    ||
  ||  e  |   k   |     e     |   t   |     k     |    t    |    y    ||
  ||  l  |       |     l     |       |           |         |         ||
  ||     |       |           |       |           |         |         ||
--++-----------------------------------------------------------------++-->
Pola
vehicle_index

int32

Pojazd pokonujący trasę, określony za pomocą indeksu w źródle ShipmentModel.

vehicle_label

string

Etykieta pojazdu wykonującego tę trasę, równa ShipmentModel.vehicles(vehicle_index).label, jeśli została określona.

vehicle_start_time

Timestamp

Godzina, o której pojazd rozpoczyna trasę.

vehicle_end_time

Timestamp

Czas zakończenia trasy przez pojazd.

visits[]

Visit

Uporządkowana sekwencja wizyt reprezentująca trasę. wizyta[i] to i-ta wizyta na trasie. Jeśli to pole jest puste, pojazd jest uważany za nieużywany.

transitions[]

Transition

Uporządkowana lista przejść na trasie.

has_traffic_infeasibilities

bool

Jeśli zasada OptimizeToursRequest.consider_road_traffic ma wartość Prawda, to pole wskazuje, że niespójności w czasie podróży są prognozowane na podstawie szacunków czasu podróży na podstawie natężenia ruchu. Może brakować czasu na skoordynowanie podróży dostosowanej do natężenia ruchu, opóźnień i przerw między wizytami, przed pierwszą wizytą lub po ostatniej wizycie, a jednocześnie niezmiennie musi spełniać wymagania związane z wizytą i pojazdem. Na przykład

  start_time(previous_visit) + duration(previous_visit) +
  travel_duration(previous_visit, next_visit) > start_time(next_visit)

Przyjazd na stronie next_visit prawdopodobnie nastąpi później niż w bieżącym oknie czasowym ze względu na zwiększony szacowany czas podróży (travel_duration(previous_visit, next_visit)) ze względu na korki. Przerwa może też pokrywać się z wizytą ze względu na dłuższy szacowany czas podróży oraz ograniczenia przedziałów czasowych wizyty lub przerwy.

route_polyline

EncodedPolyline

Zakodowana linia łamana reprezentuje trasę. To pole jest wypełniane tylko wtedy, gdy OptimizeToursRequest.populate_polylines ma wartość true (prawda).

breaks[]

Break

Przerwy zaplanowane dla pojazdu na tej trasie. Sekwencja breaks reprezentuje przedziały czasu, z których każdy zaczyna się w odpowiednim start_time i trwa duration sekund.

metrics

AggregatedMetrics

Dane o czasie trwania, dystansie i obciążeniu tej trasy. Pola AggregatedMetrics są sumowane dla wszystkich ShipmentRoute.transitions lub ShipmentRoute.visits, w zależności od kontekstu.

route_costs

map<string, double>

Koszt trasy z podziałem na pola żądania związane z kosztami. Klucze to ścieżki proto, względem danych wejściowych OptimizeToursRequest, np. „model.shipments.pickups.cost”, a ich wartości to łączny koszt wygenerowany przez odpowiednie pole kosztu, zagregowany dla całej trasy. Inaczej mówiąc, koszt["model.shipments.pickups.cost"] to suma wszystkich kosztów odbioru na trasie. Wszystkie koszty zdefiniowane w modelu są tutaj szczegółowo raportowane, z wyjątkiem kosztów związanych z atributem TransitionAttributes, które od 1 stycznia 2022 r. są raportowane tylko w sposób zagregowany.

route_total_cost

double

Łączny koszt trasy. Suma wszystkich kosztów na mapie kosztów.

Przerwa

Dane reprezentujące wykonanie przerwy.

Pola
start_time

Timestamp

Czas rozpoczęcia przerwy.

duration

Duration

Czas trwania przerwy.

EncodedPolyline

Zakodowana reprezentacja linii łamanej. Więcej informacji o kodowaniu linii łamanych znajdziesz tutaj: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.

Pola
points

string

Ciąg znaków reprezentujący zakodowane punkty linii łamanej.

Przejście

Przejście między 2 zdarzeniami na trasie. Zobacz opis ShipmentRoute.

Jeśli pojazd nie ma start_location lub end_location, odpowiadające mu dane dotyczące podróży mają wartość 0.

Pola
travel_duration

Duration

Czas podróży w trakcie tej zmiany.

travel_distance_meters

double

Odległość przebyta podczas przejścia.

traffic_info_unavailable

bool

Gdy żądanie ruchu jest wysyłane za pomocą OptimizeToursRequest.consider_road_traffic, a nie udało się pobrać informacji o ruchu dla Transition, ta wartość logiczna jest ustawiana na Prawda. Może to być tymczasowe (rzadkie problemy z serwerami ruchu w czasie rzeczywistym) lub trwałe (brak danych dla tej lokalizacji).

delay_duration

Duration

Suma czasów opóźnienia zastosowanych do tego przejścia. Jeśli tak, opóźnienie zaczyna się dokładnie delay_duration sekundy przed następnym zdarzeniem (wizytą lub zakończeniem pojazdu). Zobacz TransitionAttributes.delay.

break_duration

Duration

Suma czasu trwania przerw w trakcie tego przejścia (jeśli występują). Szczegółowe informacje o czasie rozpoczęcia i czasie trwania każdej przerwy są przechowywane w ShipmentRoute.breaks.

wait_duration

Duration

Czas oczekiwania podczas tej zmiany. Czas oczekiwania odpowiada czasowi bezczynności i nie obejmuje przerwy. Pamiętaj też, że czas oczekiwania może zostać podzielony na kilka nieciągłych przedziałów czasu.

total_duration

Duration

Całkowity czas trwania zmiany podany dla wygody użytkowników. Jest ona równa:

  • następna wizyta start_time (lub vehicle_end_time, jeśli jest to ostatnie przejście) – start_time dla tej zmiany;
  • jeśli ShipmentRoute.has_traffic_infeasibilities ma wartość fałsz, dodatkowo zawiera: `total_duration = travel_duration + delay_duration]
  • break_duration + wait_duration`.
start_time

Timestamp

Godzina rozpoczęcia tego przejścia.

route_polyline

EncodedPolyline

Zakodowana reprezentacja linii łamanej trasy, która była następnie używana podczas przejścia. To pole jest wypełniane tylko wtedy, gdy populate_transition_polylines ma wartość true (prawda).

vehicle_loads

map<string, VehicleLoad>

Ładunki pojazdów w trakcie tej zmiany dotyczące każdego typu pojazdu, który pojawia się w klastrze Vehicle.load_limits tego pojazdu lub ma wartość inną niż zeroShipment.load_demands w przypadku niektórych przesyłek realizowanych na tej trasie.

Obciążenia podczas pierwszego przejścia to obciążenia początkowe trasy pojazdu. Następnie, po każdej wizycie, load_demands wizyty jest dodawane lub odejmowane, aby uzyskać obciążenie następnego przejścia w zależności od tego, czy wizyta była odbiorem czy dostawą.

VehicleLoad

Raportuje rzeczywiste obciążenie pojazdu w danym punkcie trasy w przypadku konkretnego typu (patrz Transition.vehicle_loads).

Pola
amount

int64

Obciążenie pojazdu dla danego typu. Jednostka ładunku jest zwykle określana przez typ. Zobacz Transition.vehicle_loads.

Odwiedź

Wizyta przeprowadzona na trasie. Ta wizyta odpowiada odbiórowi lub dostawie: Shipment.

Pola
shipment_index

int32

Indeks pola shipments w źródle ShipmentModel.

is_pickup

bool

Jeśli ma wartość prawda, wizyta odpowiada odbiorze produktu Shipment. W przeciwnym razie odpowiada ona dostawie.

visit_request_index

int32

Indeks VisitRequest w polu odbioru lub dostawy na: Shipment (patrz is_pickup).

start_time

Timestamp

Godzina rozpoczęcia wizyty. Pamiętaj, że pojazd może pojawić się na miejscu wcześniej. Czasy są zgodne z ShipmentModel.

load_demands

map<string, Load>

Łączne obciążenie związane z wizytami jako suma dostawy i żądania wizyty load_demands. Jeśli wizyta to dostawa, wartości są ujemne. Raportowane są żądania dotyczące tych samych typów co pole Transition.loads (patrz to pole).

detour

Duration

Dodatkowy czas objazdu ze względu na przesyłki odwiedzone na trasie przed wizytą oraz potencjalny czas oczekiwania związany z przedziałami czasowymi. Jeśli wizyta dotyczy dostawy, zmiana trasy jest obliczana na podstawie odpowiedniej wizyty z odbiorem i ma wartość:

start_time(delivery) - start_time(pickup)
- (duration(pickup) + travel duration from the pickup location
to the delivery location).

W przeciwnym razie jest obliczany na podstawie pojazdu start_location. Ma on wartość:

start_time - vehicle_start_time - travel duration from
the vehicle's `start_location` to the visit.
shipment_label

string

Kopia odpowiedniego elementu Shipment.label, jeśli został on określony w elementach Shipment.

visit_label

string

Kopia odpowiedniego elementu VisitRequest.label, jeśli został on podany w elemencie VisitRequest.

ShipmentTypeIncompatibility

Określa niezgodności między dostawami w zależności od ich rodzaju przesyłki. Wyświetlanie niezgodnych przesyłek na tej samej trasie jest ograniczone ze względu na tryb niezgodności.

Pola
types[]

string

Lista niezgodnych typów. Dwie przesyłki, których shipment_types różni się od wymienionych na liście, są „niezgodne”.

incompatibility_mode

IncompatibilityMode

Tryb został zastosowany do niezgodności.

IncompatibilityMode

Środki określające, jak ograniczone jest wyświetlanie niezgodnych przesyłek na tej samej trasie.

Wartości w polu enum
INCOMPATIBILITY_MODE_UNSPECIFIED Nieokreślony tryb niezgodności. Tej wartości nie należy używać.
NOT_PERFORMED_BY_SAME_VEHICLE W tym trybie 2 przesyłki z niekompatybilnymi typami nigdy nie mogą korzystać z tego samego pojazdu.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

W przypadku 2 przesyłek o niezgodnych typach z trybem zgodności NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY:

  • Jeśli obie usługi to tylko odbiór (bez dostawy) lub tylko dostawa (bez odbioru), nie mogą korzystać z tego samego pojazdu.
  • Jeśli jedna z przesyłek obejmuje dostawę, a druga odbiór, obie mogą obejmować ten sam pojazd, jeśli poprzednia została dostarczona przed odebraniem drugiej.

ShipmentTypeRequirement

Określa wymagania dotyczące poszczególnych dostaw na podstawie ich rodzaju przesyłki. Konkretne wymagania są określane przez tryb wymagań.

Pola
required_shipment_type_alternatives[]

string

Lista alternatywnych typów przesyłek wymaganych w dokumencie dependent_shipment_types.

dependent_shipment_types[]

string

Wszystkie przesyłki o typie podanym w polu dependent_shipment_types wymagają co najmniej jednej przesyłki typu required_shipment_type_alternatives, aby odwiedzić ją na tej samej trasie.

UWAGA: łańcuchy wymagań, takie jak shipment_type zależą od siebie, są niedozwolone.

requirement_mode

RequirementMode

Tryb zastosowany do wymagania.

RequirementMode

Tryby definiujące sposób wyświetlania przesyłek zależnych na trasie.

Wartości w polu enum
REQUIREMENT_MODE_UNSPECIFIED Tryb nieokreślonych wymagań. Ta wartość nigdy nie powinna być używana.
PERFORMED_BY_SAME_VEHICLE W tym trybie wszystkie „zależne” przesyłki muszą być z tym samym pojazdem co co najmniej jeden z „wymaganych” przesyłek.
IN_SAME_VEHICLE_AT_PICKUP_TIME

W trybie IN_SAME_VEHICLE_AT_PICKUP_TIME wszystkie są „zależne” przesyłki muszą mieć co najmniej jeden „wymagany” przesyłki na swój pojazd w momencie odbioru.

„zależny”; opcja odbioru przesyłki musi więc spełniać jeden z tych warunków:

  • „Wymagane” tylko do wyświetlania przesyłka dostarczona na trasie po tym terminie;
  • „Wymagane” przesyłka odebrana na trasie przed nią, a jeśli „wymagane” przesyłka ma dostawę, musi ona zostać zrealizowana po „podległym” odbiór przesyłki.
IN_SAME_VEHICLE_AT_DELIVERY_TIME Tak samo jak poprzednio, z wyjątkiem pola „zależnego” przesyłki muszą mieć atrybut „wymagany”, przesyłki na swój pojazd w momencie dostawy.

SkippedShipment

Określa szczegóły niezrealizowanych dostaw w rozwiązaniu. W przypadku błahych przypadków lub jeśli możemy określić przyczynę pominięcia, podajemy ją tutaj.

Pola
index

int32

Indeks odpowiada indeksowi przesyłki w źródle ShipmentModel.

label

string

Kopia odpowiedniego elementu Shipment.label, jeśli został on określony w elementach Shipment.

reasons[]

Reason

Lista powodów, dla których dostawa została pominięta. Zobacz komentarz powyżej Reason. Jeśli nie będziemy mogli zrozumieć, dlaczego przesyłka została pominięta, przyczyny nie zostaną podane.

Przyczyna

Jeśli będziemy mogli wyjaśnić, dlaczego przesyłka została pominięta, znajdziesz tu ich listę. Jeśli przyczyna nie jest taka sama w przypadku wszystkich pojazdów, element reason będzie zawierał więcej niż 1 element. Pominięta przesyłka nie może mieć zduplikowanych powodów, tj. gdy wszystkie pola są takie same oprócz example_vehicle_index. Przykład:

reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 1
  example_exceeded_capacity_type: "Apples"
}
reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 3
  example_exceeded_capacity_type: "Pears"
}
reasons {
  code: CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT
  example_vehicle_index: 1
}

Pominięta przesyłka jest niezgodna ze wszystkimi pojazdami. Przyczyny mogą być różne w przypadku wszystkich pojazdów, ale w co najmniej jednym z nich przekroczyłaby pojemność (w tym pojazd nr 1), co najmniej 1 pojazd „Gruszki” przekroczyłaby pojemność (w tym pojazd nr 3) i przekroczyła limit odległości w przypadku co najmniej 1 pojazdu (w tym pojazdu 1).

Pola
code

Code

Więcej informacji znajdziesz w komentarzach do kodu.

example_exceeded_capacity_type

string

Jeśli kod przyczyny to DEMAND_EXCEEDS_VEHICLE_CAPACITY, dokumentuje 1 przekroczenie jednego typu pojemności.

example_vehicle_index

int32

Jeśli przyczyna jest niezgodność między pojazdem dostawczym, a pojazdem wysyłkowym, w tym polu znajdziesz indeks jednego odpowiedniego pojazdu.

Kod

Kod identyfikujący typ przyczyny. Kolejność nie ma znaczenia. W szczególności nie wskazuje, czy dana przyczyna pojawi się wcześniej w rozwiązaniach, jeśli oba te warunki będą spełnione.

Wartości w polu enum
CODE_UNSPECIFIED Nie należy jej nigdy używać.
NO_VEHICLE W modelu nie ma żadnego pojazdu, co uniemożliwiałoby realizację wszystkich dostaw.
DEMAND_EXCEEDS_VEHICLE_CAPACITY Zapotrzebowanie na dostawę przekracza pojemność pojazdu w przypadku niektórych typów pojemności, z których jeden wynosi example_exceeded_capacity_type.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT

Minimalna odległość niezbędna do wykonania tej dostawy, czyli od start_location pojazdu do miejsca odbioru lub dostawy i do miejsca docelowego pojazdu, przekracza route_distance_limit pojazdu.

Pamiętaj, że w tych obliczeniach używamy odległości geodezyjnych.

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT

Minimalny czas niezbędny do wykonania tej przesyłki, w tym czas podróży, czas oczekiwania i obsługa, przekracza route_duration_limit pojazdu.

Uwaga: czas podróży oblicza się według najlepszego przypadku, czyli odległości geodezyjnej x 36 m/s (około 130 km/h).

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT Tak jak powyżej, ale porównujemy tylko minimalny czas podróży z travel_duration_limit pojazdu.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS Pojazd nie może zrealizować tej dostawy w najlepszym scenariuszu (patrz CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT w celu obliczenia czasu), jeśli rozpoczyna się o najwcześniejszej możliwej godzinie: łączny czas pracy pojazdu spowoduje, że zakończy on pracę po upływie najpóźniejszego możliwego czasu.
VEHICLE_NOT_ALLOWED Pole allowed_vehicle_indices przesyłki nie jest puste, a pojazd do niego nie należy.

TimeWindow

Przedziały czasu ograniczają czas zdarzenia, np. godzinę przyjazdu podczas wizyty lub godzinę rozpoczęcia i zakończenia pojazdu.

Wartości graniczne sztywnych przedziałów czasowych, start_time i end_time, egzekwują najwcześniejszy i najnowszy czas zdarzenia, na przykład start_time <= event_time <= end_time. Dolna granica okresowego okresu (soft_start_time) określa preferencję, aby zdarzenie miało miejsce soft_start_time lub później przez naliczanie kosztów proporcjonalnie do tego, jak długo przed zdarzeniem soft_start_time wystąpiło. Górna granica zakresu czasowego (soft_end_time) określa preferencję, aby zdarzenie miało miejsce soft_end_time lub wcześniej, ponieważ powoduje naliczanie kosztów proporcjonalnie do czasu, jaki upłynął od zdarzenia soft_end_time. Wartości start_time, end_time, soft_start_time i soft_end_time powinny mieścić się w globalnych limitach czasowych (patrz ShipmentModel.global_start_time i ShipmentModel.global_end_time) oraz spełniać te warunki:

  0 <= `start_time` <= `end_time` and
  0 <= `start_time` <= `soft_start_time` and
  0 <= `soft_end_time` <= `end_time`.
Pola
start_time

Timestamp

Trudny czas rozpoczęcia okna czasowego. Jeśli nie określono inaczej, wartość zostanie ustawiona na ShipmentModel.global_start_time.

end_time

Timestamp

Czas zakończenia sztywnego przedziału czasu. Jeśli nie określono inaczej, wartość zostanie ustawiona na ShipmentModel.global_end_time.

soft_start_time

Timestamp

Godzina łagodnego rozpoczęcia przedziału czasu.

soft_end_time

Timestamp

Godzina zakończenia okresu.

cost_per_hour_before_soft_start_time

double

Koszt na godzinę dodany do innych kosztów w modelu, jeśli zdarzenie występuje przed wartością soft_start_time, obliczany jako:

   max(0, soft_start_time - t.seconds)
                          * cost_per_hour_before_soft_start_time / 3600,
t being the time of the event.

Ten koszt musi być dodatni, a pole można ustawić tylko wtedy, gdy ustawiono soft_start_time.

cost_per_hour_after_soft_end_time

double

Koszt za godzinę dodany do innych kosztów w modelu, jeśli zdarzenie wystąpi po soft_end_time. Wartość obliczana ze wzoru:

   max(0, t.seconds - soft_end_time.seconds)
                    * cost_per_hour_after_soft_end_time / 3600,
t being the time of the event.

Ten koszt musi być dodatni, a pole można ustawić tylko wtedy, gdy skonfigurowano opcję soft_end_time.

TransitionAttributes

Określa atrybuty przejścia między 2 kolejnymi wizytami na trasie. Do tego samego przejścia może być stosowanych kilka elementów TransitionAttributes: w takim przypadku wszystkie dodatkowe koszty sumują się i zastosowane jest najbardziej rygorystyczne ograniczenie lub limit (zgodnie z naturalną semantyką „ORAZ”).

Pola
src_tag

string

Tagi definiujące zestaw przejść (src->dst), do których mają zastosowanie te atrybuty.

Wizyty w źródle lub rozpoczęcie pojazdu pasują do tych, które VisitRequest.tags lub Vehicle.start_tags zawierają wartość src_tag albo nie zawierają excluded_src_tag (zależnie od tego, które z tych 2 pól nie jest puste).

excluded_src_tag

string

Zobacz src_tag. tylko jeden z elementów src_tag i excluded_src_tag nie może być pusty.

dst_tag

string

Wizyty w miejscu docelowym lub data zakończenia pojazdu pasują do tych, które VisitRequest.tags lub Vehicle.end_tags zawierają wartość dst_tag albo nie zawierają excluded_dst_tag (w zależności od tego, które z tych 2 pól nie jest puste).

excluded_dst_tag

string

Zobacz dst_tag. tylko jeden z elementów dst_tag i excluded_dst_tag nie może być pusty.

cost

double

Określa koszt przeprowadzenia tej zmiany. Ta jednostka jest taka sama jak wszystkie inne koszty w modelu i nie może być ujemna. Jest doliczana do wszystkich innych istniejących kosztów.

cost_per_kilometer

double

Określa koszt kilometra stosowany do odległości pokonanej podczas wykonywania tej zmiany. Dodaje się do wszystkich Vehicle.cost_per_kilometer określonych w pojazdach.

distance_limit

DistanceLimit

Określa limit odległości pokonanej podczas wykonywania tej zmiany.

Od 6 czerwca 2021 r. obsługiwane są tylko limity wstępne.

delay

Duration

Określa opóźnienie związane z przeprowadzeniem tej zmiany.

Opóźnienie to zawsze następuje po zakończeniu wizyty źródłowej i przed jej rozpoczęciem.

Pojazd

Model pojazdu w przypadku problemu z dostawą. Rozwiązanie problemu z dostawą spowoduje utworzenie trasy dla tego pojazdu rozpoczynającej się od start_location i kończącej na end_location. Trasa jest sekwencją wizyt (patrz ShipmentRoute).

Pola
display_name

string

Zdefiniowana przez użytkownika wyświetlana nazwa pojazdu. Może składać się z maksymalnie 63 znaków i zawierać znaki UTF-8.

travel_mode

TravelMode

Tryb podróży, który wpływa na drogi, z których może korzystać pojazd, i jego prędkość. Zobacz też travel_duration_multiple.

route_modifiers

RouteModifiers

Zestaw warunków, które wpływają na sposób obliczania tras dla danego pojazdu.

start_location

LatLng

Lokalizacja geograficzna, w której pojazd rozpoczyna się przed odebraniem przesyłki. Jeśli nie podasz żadnej wartości, pojazd rozpocznie się przy pierwszym odbiorze. Jeśli model dostawy zawiera macierze czasu trwania i odległości, nie można określić start_location.

start_waypoint

Waypoint

Punkt pośredni reprezentujący lokalizację geograficzną, w której pojazd rozpoczyna się przed odebraniem przesyłki. Jeśli nie podasz ani atrybutu start_waypoint, ani start_location, pojazd rozpocznie się od pierwszego odbioru. Jeśli model dostawy zawiera macierze czasu i odległości, nie należy podawać parametru start_waypoint.

end_location

LatLng

Miejsce geograficzne, w którym pojazd kończy ostatnią VisitRequest. Jeśli nie zostanie określony, ShipmentRoute pojazdu kończy się natychmiast po zakończeniu ostatniego VisitRequest. Jeśli model dostawy zawiera macierze czasu trwania i odległości, nie można określić end_location.

end_waypoint

Waypoint

Punkt pośredni reprezentujący lokalizację geograficzną, w której kończy się pojazd po zakończeniu ostatniego VisitRequest. Jeśli nie określisz wartości end_waypoint ani end_location, ShipmentRoute pojazdu zakończy się natychmiast po zakończeniu ostatniego okresu VisitRequest. Jeśli model dostawy zawiera macierze czasu trwania i odległości, nie można określić end_waypoint.

start_tags[]

string

Określa tagi dołączone do początku trasy pojazdu.

Puste lub zduplikowane ciągi znaków są niedozwolone.

end_tags[]

string

Określa tagi dołączone na końcu trasy pojazdu.

Puste lub zduplikowane ciągi znaków są niedozwolone.

start_time_windows[]

TimeWindow

Przedziały czasu, w których pojazd może odjechać ze swojej lokalizacji początkowej. Muszą mieścić się w globalnych limitach czasowych (patrz pola ShipmentModel.global_*). Jeśli nie określisz tu żadnej wartości, nie będzie limitów poza tymi globalnymi limitami czasowymi.

Przedziały czasu należące do tego samego pola powtarzanego muszą być rozłączne, tj. żadne przedziały czasu nie mogą na siebie nachodzić ani przylegać do siebie i muszą być ułożone w kolejności chronologicznej.

Wartości cost_per_hour_after_soft_end_time i soft_end_time można ustawić tylko wtedy, gdy istnieje 1 przedział czasu.

end_time_windows[]

TimeWindow

Przedziały czasu, w których pojazd może dotrzeć do miejsca docelowego. Muszą mieścić się w globalnych limitach czasowych (patrz pola ShipmentModel.global_*). Jeśli nie określono inaczej, nie ma żadnych ograniczeń poza tymi globalnymi limitami czasu.

Przedziały czasu należące do tego samego pola powtarzanego muszą być rozłączne, tj. żadne przedziały czasu nie mogą na siebie nachodzić ani przylegać do siebie i muszą być ułożone w kolejności chronologicznej.

Wartości cost_per_hour_after_soft_end_timesoft_end_time można ustawić tylko wtedy, gdy istnieje jedno okno czasowe.

unloading_policy

UnloadingPolicy

W pojeździe egzekwowane są zasady wyładowywania.

load_limits

map<string, LoadLimit>

Pojemność pojazdu (np. waga, objętość, liczba palet). Klucze na mapie to identyfikatory typu obciążenia, zgodne z kluczami w polu Shipment.load_demands. Jeśli na tej mapie nie ma danego klucza, odpowiadająca mu pojemność jest uznawana za nieograniczoną.

cost_per_hour

double

Koszty pojazdu: wszystkie koszty są sumowane i muszą być podane w tej samej jednostce co Shipment.penalty_cost.

Koszt za godzinę trasy pojazdu. Koszt ten jest stosowany do łącznego czasu podróży pokonanego na trasie i obejmuje czas podróży, czas oczekiwania i czas wizyty. Używanie operatora cost_per_hour zamiast samego cost_per_traveled_hour może spowodować dodatkowe opóźnienie.

cost_per_traveled_hour

double

Koszt przebytej godziny trasy pojazdu. Koszt ten jest stosowany tylko do czasu podróży na danej trasie (tj. raportowanego w ShipmentRoute.transitions) i nie uwzględnia czasu oczekiwania ani czasu wizyty.

cost_per_kilometer

double

Koszt za kilometr trasy pojazdu. Koszt ten jest stosowany do odległości podawanej w raportach ShipmentRoute.transitions i nie dotyczy żadnej odległości pokonanej domyślnie z miejsca arrival_location do departure_location w pojedynczej linii VisitRequest.

fixed_cost

double

Stały koszt stosowany, jeśli ten pojazd służy do obsługi przesyłki.

used_if_route_is_empty

bool

To pole ma zastosowanie tylko do pojazdów, których trasa nie obsługuje żadnych przesyłek. Wskazuje, czy w tym przypadku pojazd powinien być uznany za używany.

Jeśli wybrano opcję prawda, pojazd porusza się od początku do końca, nawet jeśli nie obsługuje żadnych przesyłek, oraz koszty czasu i odległości związane z rozpoczęciem pracy --> bierzemy pod uwagę podróż końcową.

W przeciwnym razie pojazd nie przemieszcza się z miejsca początkowego do miejsca docelowego i nie ma dla niego zaplanowanego break_rule ani opóźnienia (z poziomu TransitionAttributes). W tym przypadku atrybut ShipmentRoute pojazdu nie zawiera żadnych informacji poza numerem indeksu i etykietą pojazdu.

route_duration_limit

DurationLimit

Limit został zastosowany do łącznego czasu trwania trasy pojazdu. W danym okresie (OptimizeToursResponse) długość trasy pojazdu to różnica między wartościami vehicle_end_time a vehicle_start_time.

travel_duration_limit

DurationLimit

Limit został zastosowany do czasu podróży na trasie pojazdu. W danym okresie (OptimizeToursResponse) czas podróży jest sumą wszystkich wartości wymiaru transitions.travel_duration.

route_distance_limit

DistanceLimit

Limit został zastosowany do całkowitej odległości na trasie pojazdu. W danym regionie OptimizeToursResponse odległość na trasie jest sumą wszystkich jego transitions.travel_distance_meters.

extra_visit_duration_for_visit_type

map<string, Duration>

Określa mapowanie z ciągów visit_types na czasy trwania. Czas trwania to czas dodatkowy do VisitRequest.duration, który należy uwzględnić w wizytach z określonym visit_types. Ten dodatkowy czas trwania wizyty zwiększa koszt, jeśli określono cost_per_hour. Klucze (np. visit_types) nie mogą być puste.

Jeśli prośba o wizytę ma kilka typów, czas trwania zostanie dodany do każdego z nich na mapie.

break_rule

BreakRule

Opisuje harmonogram przerw, który ma być stosowany w tym pojeździe. Jeśli pole będzie puste, w przypadku tego pojazdu nie zostaną zaplanowane żadne przerwy.

label

string

Określa etykietę tego pojazdu. Ta etykieta jest zgłaszana w odpowiedzi jako vehicle_label odpowiadającej jej wartości ShipmentRoute.

ignore

bool

Jeśli wartość used_if_route_is_empty ma być ustawiona na prawda, musisz ustawić wartość used_if_route_is_empty na fałsz, a samochód pozostanie nieużywany.

Jeśli przesyłka jest realizowana przez pojazd ignorowany w definicji injected_first_solution_routes, jest pomijana w pierwszym rozwiązaniu, ale może być realizowana w odpowiedzi.

Jeśli przesyłka jest realizowana przez zignorowany pojazd w injected_solution_constraint, a wszelkie powiązane z nim odbiór lub dostawa muszą pozostać w pojeździe (tj. nie zrelaksowane do poziomu RELAX_ALL_AFTER_THRESHOLD), zostanie to pominięte w odpowiedzi. Jeśli pole allowed_vehicle_indices w dostawie nie jest puste, a wszystkie dozwolone pojazdy są ignorowane, zostaną one pominięte w odpowiedzi.

travel_duration_multiple

double

Określa współczynnik mnożenia, który może być używany do zwiększania lub zmniejszania czasu przejazdu tego pojazdu. Na przykład ustawienie wartości 2,0 oznacza, że ten pojazd jest wolniejszy i czas podróży jest 2 razy dłuższy niż w przypadku standardowych pojazdów. Ta wielokrotność nie ma wpływu na czas trwania wizyty. Wpływa na koszty, jeśli określono cost_per_hour lub cost_per_traveled_hour. Musi mieścić się w zakresie od 0,001 do 1000,0. Jeśli nie jest skonfigurowana, pojazd jest standardowy, a mnożnik jest uznawany za 1,0.

OSTRZEŻENIE: czasy przejazdu zostaną zaokrąglone do najbliższej sekundy po zastosowaniu tego wielokrotnego, ale przed wykonaniem jakichkolwiek operacji numerycznych, dlatego małe wielokrotne może spowodować utratę dokładności.

Zobacz też extra_visit_duration_for_visit_type poniżej.

DurationLimit

Limit określający maksymalny czas trwania trasy pojazdu. Może być twarda lub miękka.

Gdy zdefiniowano pole opcjonalnego limitu, muszą być one określone razem.

Pola
max_duration

Duration

Twardy limit ogranicza czas trwania do maksymalnie max_duration.

soft_max_duration

Duration

Ograniczony limit nie egzekwuje maksymalnego czasu trwania, ale jego naruszenie powoduje naliczanie opłat za trasę. Ten koszt jest częścią innych kosztów określonych w modelu, które obejmują tę samą jednostkę.

Jeśli została określona, soft_max_duration nie może być ujemna. Jeśli zdefiniowano też parametr max_duration, wartość soft_max_duration musi być mniejsza niż max_duration.

quadratic_soft_max_duration

Duration

Ograniczony limit nie egzekwuje maksymalnego czasu trwania, ale w przypadku naruszenia powoduje naliczanie kosztu w postaci kwadratowej. Ten koszt jest częścią innych kosztów określonych w modelu, które obejmują tę samą jednostkę.

Jeśli jest zdefiniowana, wartość quadratic_soft_max_duration musi być nieujemna. Jeśli zdefiniowano również max_duration, wartość quadratic_soft_max_duration musi być mniejsza niż max_duration, a różnica nie może być większa niż jeden dzień:

max_duration - quadratic_soft_max_duration <= 86400 seconds

cost_per_hour_after_soft_max

double

Koszt za godzinę po przekroczeniu progu soft_max_duration. Koszt dodatkowy wynosi 0, jeśli czas trwania jest poniżej progu. W przeciwnym razie koszt zależy od czasu trwania:

  cost_per_hour_after_soft_max * (duration - soft_max_duration)

Koszt musi być nieujemny.

cost_per_square_hour_after_quadratic_soft_max

double

Koszt godziny kwadratowej poniesiony w przypadku naruszenia progu quadratic_soft_max_duration.

Koszt dodatkowy wynosi 0, jeśli czas trwania jest poniżej progu. W przeciwnym razie koszt zależy od czasu trwania:

  cost_per_square_hour_after_quadratic_soft_max *
  (duration - quadratic_soft_max_duration)^2

Koszt musi być nieujemny.

LoadLimit

Określa limit obciążenia mający zastosowanie do pojazdu, np. „ta ciężarówka może przewieźć do 3500 kg”. Zobacz load_limits.

Pola
soft_max_load

int64

Miękki limit obciążenia. Zobacz cost_per_unit_above_soft_max.

cost_per_unit_above_soft_max

double

Jeśli obciążenie na trasie tego pojazdu kiedykolwiek przekroczy soft_max_load, zostanie nałożona następująca kara za koszt (tylko raz na pojazd): (obciążenie – soft_max_load) * cost_per_unit_above_soft_max. Wszystkie koszty sumują się i muszą być podane w tej samej jednostce co Shipment.penalty_cost.

start_load_interval

Interval

Dopuszczalny przedział ładowania pojazdu na początku trasy.

end_load_interval

Interval

Dopuszczalny przedział ładowania pojazdu na końcu trasy.

max_load

int64

Maksymalna akceptowalna ilość obciążenia.

Interwał

Odstęp między akceptowanymi wielkościami wczytywania.

Pola
min

int64

minimalne dopuszczalne obciążenie; Wartość musi być ≥ 0. Jeśli oba parametry są określone, wartość min musi być mniejsza lub równa wartości max.

max

int64

Maksymalne dopuszczalne obciążenie. Wartość musi być większa lub równa 0. Jeśli nie określisz maksymalnego obciążenia, wiadomość nie będzie nakładać żadnych ograniczeń. Jeśli obie są określone, min musi mieć wartość ≤ max.

TravelMode

Tryby podróży, z których mogą korzystać pojazdy.

Powinny one być podzbiorem preferowanych trybów podróży w interfejsie API tras Google Maps Platform. Zobacz: https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode.

Wartości w polu enum
TRAVEL_MODE_UNSPECIFIED Nieokreślony środek transportu, odpowiednik: DRIVING.
DRIVING Tryb podróży odpowiadający wskazówkom dojazdu (samochód, ...).
WALKING Tryb podróży odpowiadający wskazówkom dojazdu pieszo.

UnloadingPolicy

Zasady dotyczące wyładowywania pojazdu. Dotyczy tylko przesyłek z odbiorem i dostawą.

W przypadku innych przesyłek mogą one zostać dostarczone w dowolnym miejscu na trasie niezależnie od firmy unloading_policy.

Wartości w polu enum
UNLOADING_POLICY_UNSPECIFIED Nieokreślona zasada wyładowywania; dostawy muszą następować dopiero po odpowiednim odbiorze.
LAST_IN_FIRST_OUT Dostawy muszą odbywać się w odwrotnej kolejności odbioru
FIRST_IN_FIRST_OUT Dostawy muszą być w tym samym zamówieniu co odbiór

Punkt pośredni

Obejmuje punkt pośredni. Punkty Waypoints oznaczają miejsca przyjazdu i wyjazdu w żądaniach VisitRequests oraz lokalizację początkową i końcową Pojazdów.

Pola
side_of_road

bool

Opcjonalnie: Wskazuje, że umiejscowienie tego punktu pośredniego powinno umożliwiać zatrzymanie pojazdu po określonej stronie drogi. Po ustawieniu tej wartości trasa będzie przebiegać przez lokalizację, tak aby pojazd mógł się zatrzymać na poboczu drogi, w kierunku której lokalizacja jest przekierowana od środka drogi. Ta opcja nie działa w przypadku opcji „SPACER” środkami transportu.

Pole sumy location_type. różne sposoby przedstawiania lokalizacji; location_type może mieć tylko jedną z tych wartości:
location

Location

Punkt określony za pomocą współrzędnych geograficznych, w tym opcjonalny nagłówek.

place_id

string

Identyfikator miejsca POI powiązany z punktem pośrednim.