Package google.maps.routeoptimization.v1

Indeks

RouteOptimization

Usługa optymalizacji wycieczek samochodowych.

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

  • google.protobuf.Timestamp
    • Czasy są podane w czasie uniksowym: sekundy od 1970-01-01T00:00:00+00:00.
    • sekundy muszą być wartością [0, 253402300799], czyli w zakresie [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 muszą być wartością [0, 253402300799], czyli w zakresie [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 być z zakresu [-90,0, 90,0].
    • długość geograficzna musi być z zakresu [-180,0, 180,0].
    • wartość szerokości i długości geograficznej musi być różna od zera.
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

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

Jest to operacja długo trwa (LRO). Dane wejściowe optymalizacji (wiadomości: OptimizeToursRequest) i dane wyjściowe (wiadomości: OptimizeToursResponse) są odczytywane/zapisywane w Cloud Storage w formacie określonym przez użytkownika. Podobnie jak w przypadku metody OptimizeTours, każdy element OptimizeToursRequest zawiera pole ShipmentModel i zwraca OptimizeToursResponse zawierający ciąg ShipmentRoute, czyli zbiór tras, które mają zostać wykonane przez pojazdy, co pozwoli Ci zminimalizować całkowity koszt.

Zakresy autoryzacji

Wymaga następującego zakresu OAuth:

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

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

Wysyła polecenie OptimizeToursRequest zawierające wartość ShipmentModel i zwraca wartość OptimizeToursResponse zawierającą ShipmentRoute, czyli zbiór tras, które mają zostać wykonane przez pojazdy, które minimalizują całkowity koszt.

Model ShipmentModel składa się głównie z elementów Shipment, które należy wykonać, i elementów Vehicle, które można wykorzystać do transportu elementów Shipment. Elementy ShipmentRoute przypisują element Shipment do elementów Vehicle. Dokładniej rzecz ujmując, system przypisuje każdemu pojazdowi serię Visit, gdzie Visit odpowiada wartości VisitRequest, która oznacza odbiór lub dostawę w przypadku produktu Shipment.

Celem jest przypisanie do tych elementów zamówienia wartości ShipmentRoute, które minimalizują całkowity koszt, przy którym w parametrze ShipmentModel zdefiniowany jest koszt z wieloma komponentami.Vehicle

Zakresy autoryzacji

Wymaga następującego zakresu OAuth:

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

AggregatedMetrics

Zbiorcze dane o wymiarach ShipmentRoute (odpowiadające wartości OptimizeToursResponse we wszystkich elementach Transition lub Visit (odpowiadanie we wszystkich elementach ShipmentRoute).

Pola
performed_shipment_count

int32

Liczba dostarczonych przesyłek. Pamiętaj, że para „odbiór i dostawa” liczy się tylko raz.

travel_duration

Duration

Całkowity czas podróży na trasie lub rozwiązaniu.

wait_duration

Duration

Całkowity czas oczekiwania na trasę lub rozwiązanie.

delay_duration

Duration

Całkowity czas opóźnienia dla trasy lub rozwiązania.

break_duration

Duration

Całkowity czas trwania przerwy na trasie lub rozwiązaniu.

visit_duration

Duration

Łączny czas trwania wizyty na trasie lub rozwiązaniu.

total_duration

Duration

Łączny czas trwania powinien być równy sumie wszystkich czasów trwania podanych wyżej. W przypadku tras odpowiada również:

[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ść pokonana przez trasę lub rozwiązanie.

max_loads

map<string, VehicleLoad>

Maksymalne obciążenie na całej trasie (rozwiązanie odpowiedzi) dla każdej ilości na tej trasie (rozwiązanie odpowiedzi) jest obliczane jako maksymalne we wszystkich Transition.vehicle_loads (odp. ShipmentRoute.metrics.max_loads.

BatchOptimizeToursMetadata

Ten typ nie ma żadnych pól.

Metadane operacji dla wywołań BatchOptimizeToursRequest.

BatchOptimizeToursRequest

Poproś o zbiorową optymalizację wycieczek jako operacji asynchronicznej. Każdy plik wejściowy powinien zawierać jeden plik OptimizeToursRequest, a każdy plik wyjściowy powinien zawierać 1 element OptimizeToursResponse. Żądanie zawiera informacje potrzebne do odczytu i zapisu oraz przeanalizowania plików. Wszystkie pliki wejściowe i wyjściowe powinny być w tym samym projekcie.

Pola
parent

string

To pole jest wymagane. Aby zadzwonić, ustaw docelowy projekt i lokalizację.

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

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

model_configs[]

AsyncModelConfig

To pole jest wymagane. Informacje wejściowe i wyjściowe w każdym modelu zakupu, takie jak ścieżki do plików i formaty danych.

AsyncModelConfig

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

Pola
display_name

string

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

input_config

InputConfig

To pole jest wymagane. Informacje o modelu wejściowym.

output_config

OutputConfig

To pole jest wymagane. Wymagane wyjściowe informacje o lokalizacji.

BatchOptimizeToursResponse

Ten typ nie ma żadnych pól.

Odpowiedź na: BatchOptimizeToursRequest. Wartość ta jest zwracana w ramach operacji Długo trwającej operacji po jej zakończeniu.

BreakRule

Zasady generowania przerw w ruchu w pojeździe (np. przerwy na lunch). Przerwa to ciągły okres, w którym pojazd pozostaje bezczynny w bieżącym położeniu i nie może dokonywać żadnych wizyt. Przerwa może wystąpić:

  • podczas podróży między 2 wizytami (co obejmuje czas tuż przed wizytą lub bezpośrednio po niej, ale nie w trakcie wizyty), – w takim przypadku wydłuża się czas przewozu pomiędzy wizytami;
  • lub przed uruchomieniem pojazdu (pojazd może nie uruchomić się w trakcie przerwy), w takim przypadku nie ma wpływu na czas uruchomienia pojazdu.
  • lub po zakończeniu pojazdu (ditto, z godziną zakończenia pojazdu).
Pola
break_requests[]

BreakRequest

Kolejność przerw. Przeczytaj wiadomość BreakRequest.

frequency_constraints[]

FrequencyConstraint

Obowiązują kilka zasad (FrequencyConstraint). Wszystkie muszą spełniać warunki BreakRequest tego BreakRule. Zobacz FrequencyConstraint.

BreakRequest

Kolejność przerw (tj. ich liczbę i kolejność), która ma zastosowanie do każdego pojazdu, musi być wcześniej znana. Powtarzające się obiekty BreakRequest określają 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 kolejnością (to jest zaznaczone).

Pola
earliest_start_time

Timestamp

To pole jest wymagane. Dolna granica (włącznie) na początku przerwy.

latest_start_time

Timestamp

To pole jest wymagane. Górna granica (włącznie) na początku przerwy.

min_duration

Duration

To pole jest wymagane. Minimalny czas trwania przerwy. Musi być liczbą dodatnią.

FrequencyConstraint

Można dodatkowo ograniczyć częstotliwość i czas trwania przerw określonych powyżej, narzucając minimalną częstotliwość przerw, np. „Co 12 godzin musi wystąpić przerwa o długości co najmniej 1 godziny”. Zakładając, że można to zinterpretować jako „w każdym 12-godzinnym okresie upływającym musi być co najmniej 1 przerwa trwająca co najmniej godzinę”, przykład ten będzie miałby postać 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ązaniu uwzględnia wszystkie te ograniczenia, a także przedziały czasu i minimalne czasy trwania określone w zasadzie BreakRequest.

W praktyce może obowiązywać zasada FrequencyConstraint w przypadku przerw, które nie następują po sobie. Na przykład ten harmonogram uwzględnia przykład „1 godz. co 12 godz.”:

  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

To pole jest wymagane. Minimalny czas trwania przerwy dla tego ograniczenia. Nieujemna. Zobacz opis: FrequencyConstraint.

max_inter_break_duration

Duration

To pole jest wymagane. Maksymalny dozwolony odstęp w dowolnym przedziale czasu na trasie, który nie uwzględnia przynajmniej częściowo przerwy duration >= min_break_duration. Musi być liczbą dodatnią.

DataFormat

Formaty danych w plikach wejściowych i wyjściowych.

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

DistanceLimit

Limit określający maksymalną odległość, jaką można pokonać. Może być twarde lub miękkie.

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

Pola
max_meters

int64

Ograniczony limit odległości nieprzekraczający maksymalnej wartości max_m. Limit nie może być ujemny.

soft_max_meters

int64

Łagodne ograniczenie nie powoduje egzekwowania limitu maksymalnej odległości, ale jego naruszenie powoduje naliczanie kosztów, które są sumowane na inne koszty zdefiniowane w modelu przy tej samej jednostce.

Jeśli wartość parametru soft_max_metrics jest określona, musi być mniejsza niż wartość maksymalna_metra i nie może być ujemna.

cost_per_kilometer_above_soft_max

double

Koszt za kilometr naliczony, gdy odległość przekracza soft_max_meters. Jeśli odległość nie przekracza limitu, dodatkowy koszt wynosi 0. W przeciwnym razie do obliczania kosztu obowiązuje ten wzór:

  (distance_meters - soft_max_meters) / 1000.0 *
  cost_per_kilometer_above_soft_max.

Koszt nie może być liczbą ujemną.

GcsDestination

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

Pola
uri

string

To pole jest 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

To pole jest wymagane. Identyfikator URI obiektu Google Cloud Storage o formacie gs://bucket/path/to/object.

InjectedSolutionConstraint

Rozwiązanie wstawione w żądaniu wraz z informacjami o tym, które wizyty muszą być ograniczane, a także o tym, w jaki sposób.

Pola
routes[]

ShipmentRoute

Trasy rozwiązania 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 w kategorii injected_first_solution_routes.

skipped_shipments[]

SkippedShipment

Pominięto dostawę roztworu do wstrzyknięcia. Niektóre z nich mogą być pomijane w pierwotnym rozwiązaniu. Zobacz pole routes.

constraint_relaxations[]

ConstraintRelaxation

W przypadku 0 lub większej liczby grup pojazdów określa, kiedy i w jakim stopniu chcesz złagodzić ograniczenia. Jeśli to pole jest puste, wszystkie trasy pojazdów, które nie są puste, są w pełni ograniczone.

ConstraintRelaxation

W przypadku grupy pojazdów określa, na jakim poziomie i na jakim poziomie ograniczenia dotyczące wizyt zostaną złagodzone. Przesyłki wymienione w polu skipped_shipment można pominąć, tzn. nie można ich zrealizować.

Pola
relaxations[]

Relaxation

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

vehicle_indices[]

int32

Określa indeksy pojazdów, do których obowiązuje ograniczenie liczby wizyt relaxations. Brak wartości oznacza, że wartość jest uznawana za domyślną, a relaxations ma zastosowanie do wszystkich pojazdów, które nie zostały określone w innych parametrach constraint_relaxations. Może istnieć maksymalnie 1 wartość domyślna, tzn. maksymalnie 1 pole złagodzenia ograniczeń jest dozwolone 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 parametr interpret_injected_solutions_using_labels ma wartość prawda (zobacz komentarz do fields).

Relaks

Jeśli pole relaxations jest puste, czas rozpoczęcia i sekwencja wszystkich wizyt w dniu routes są w pełni ograniczone i nie można wstawiać ani dodawać nowych wizyt do tych tras. Również godzina rozpoczęcia i zakończenia podróży w: routes jest w pełni ograniczona, chyba że pojazd jest pusty (tzn. nie odnotowaliśmy wizyt, a parametr used_if_route_is_empty ma w modelu wartość fałsz).

relaxations(i).level określa poziom złagodzenia ograniczenia stosowany do wizyty #j, która spełnia:

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

Podobnie jest w przypadku uruchomienia pojazdu łagodnego do stanu relaxations(i).level, jeśli spełnia następujące warunki:

  • vehicle_start_time >= relaxations(i).threshold_time ORAZ
  • relaxations(i).threshold_visit_count == 0 i koniec pojazdu ma status „relaxations(i).level”, jeśli spełnia:
  • vehicle_end_time >= relaxations(i).threshold_time ORAZ
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

Aby zastosować poziom relaksacyjny, jeśli wizyta spełnia threshold_visit_count LUB threshold_time, dodaj 2 elementy relaxations z tym samym ustawieniem level: jeden ma ustawiony tylko threshold_visit_count, a drugi tylko threshold_time. Jeśli wizyta spełnia warunki wielu relaxations, obowiązuje poziom najbardziej relaksujący. W rezultacie, od początku przejazdu przez wyznaczoną trasę do końca pojazdu, poziom relaksu staje się bardziej rozluźniony: tzn. poziom relaksu nie maleje w miarę pokonywania trasy.

Czas i sekwencja wizyt na trasie, które nie spełniają warunków progowych dowolnego elementu relaxations, są w pełni ograniczone i nie można ich wstawić do tych sekwencji. Dodatkowo, jeśli początek lub koniec pojazdu nie spełnia warunków jakiegokolwiek relaksu, czas jest ustalany, chyba że pojazd jest pusty.

Pola
level

Level

Poziom złagodzenia ograniczenia, który obowiązuje, gdy spełnione są warunki na poziomie threshold_time lub później ORAZ co najmniej threshold_visit_count.

threshold_time

Timestamp

Czas, o którym można zastosować złagodzenie level lub po nim.

threshold_visit_count

int32

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

Jeśli jest to route.visits_size() + 1, level można zastosować tylko po stronie pojazdu. Jeśli wartość przekracza route.visits_size() + 1, parametr level nie jest w ogóle stosowany na tej trasie.

Poziom

Wyraża różne poziomy złagodzenia ograniczeń, które mają zastosowanie do wizyty i tych, które następują po spełnieniu warunków progowych.

Poniższe wyliczenie jest uporządkowane w kolejności rosnącego relaksu.

Wartości w polu enum
LEVEL_UNSPECIFIED

Pośredni domyślny poziom relaksacji: brak ograniczeń, tzn. wszystkie odwiedziny są w pełni ograniczone.

Tej wartości nie można używać bezpośrednio w polu level.

RELAX_VISIT_TIMES_AFTER_THRESHOLD Godziny rozpoczęcia i zakończenia wizyty będą łagodne, ale każda wizyta pozostaje powiązana z tym samym pojazdem i należy przestrzegać sekwencji wizyt – między nimi ani przed nimi nie można wstawić wizyty.
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD Tak samo jak w przypadku witryny RELAX_VISIT_TIMES_AFTER_THRESHOLD, ale sekwencja wizyt jest także spokojna: wizyty są nadal powiązane z pojazdem.
RELAX_ALL_AFTER_THRESHOLD Tak samo jak w przypadku RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD, ale pojazd jest również spokojny: po upływie limitu czasu lub później wizyty są całkowicie bezpłatne i mogą nie zostać zrealizowane.

InputConfig

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

Pola
data_format

DataFormat

To pole jest wymagane. Format danych wejściowych.

Pole sumy source. To pole jest wymagane. source może być tylko jedną z tych wartości:
gcs_source

GcsSource

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

Lokalizacja

Obejmuje lokalizację (punkt geograficzny i opcjonalny nagłówek).

Pola
lat_lng

LatLng

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

heading

int32

Kierunek kompasu powiązany z kierunkiem ruchu. Ta wartość służy do określenia strony drogi na potrzeby odbioru i miejsca wysyłki. Wartości nagłówka mogą wynosić od 0 do 360, gdzie 0 określa kierunek z kierunku północnym, 90 określa kierunek z kierunku północnym itd.

OptimizeToursRequest

Prośba o przesłanie do rozwiązania ułatwiającego optymalizację wycieczki, które definiuje model wysyłki do rozwiązania oraz parametry optymalizacji.

Pola
parent

string

To pole jest wymagane. Aby zadzwonić, wybierz projekt lub lokalizację.

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

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

timeout

Duration

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

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

model

ShipmentModel

Model dostawy do rozwiązania.

solving_mode

SolvingMode

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

search_mode

SearchMode

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

injected_first_solution_routes[]

ShipmentRoute

Wskaż algorytm optymalizacji, aby znaleźć pierwsze rozwiązanie podobne do poprzedniego.

Model jest ograniczony na czas tworzenia pierwszego rozwiązania. Przesyłki, które nie zostały wykonane na danej trasie, są domyślnie pomijane przy pierwszym rozwiązaniu, ale mogą być realizowane w ramach kolejnych rozwiązań.

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

  • w przypadku wszystkich tras wartość vehicle_index musi się znajdować w zakresie i nie może być duplikatem.
  • dla wszystkich wizyt, shipment_index i visit_request_index musi się mieścić w zakresie.
  • informacje o przesyłce mogą być wskazane tylko na jednej trasie;
  • odbiór przesyłki z odbiorem musi zostać wykonany przed dostawą.
  • można zrealizować tylko jedną alternatywę dla odbioru lub dostawy.
  • dla wszystkich tras wydłuża się (tj. vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time).
  • wysyłka może być zrealizowana wyłącznie w dozwolonym pojeździe. Pojazd jest dozwolony, jeśli pole Shipment.allowed_vehicle_indices jest puste lub jeśli Shipment.allowed_vehicle_indices zawiera parametr vehicle_index.

Jeśli wstrzykiwane rozwiązanie nie jest możliwe, nie zawsze jest zwracany błąd walidacji, a zamiast tego może zostać zwrócony błąd wskazujący na niewykonalność.

injected_solution_constraint

InjectedSolutionConstraint

Ogranicz algorytm optymalizacji, aby znaleźć rozwiązanie podobne do poprzedniego. W ten sposób można na przykład zablokować fragmenty tras, które zostały już zakończone lub które mają zostać ukończone, ale nie mogą być modyfikowane.

Jeśli wstrzykiwane rozwiązanie nie jest możliwe, nie zawsze jest zwracany błąd walidacji, a zamiast tego może zostać zwrócony błąd wskazujący na niewykonalność.

refresh_details_routes[]

ShipmentRoute

Jeśli pole nie jest puste, podane trasy zostaną odświeżone bez zmiany pierwotnej sekwencji wizyt lub czasu podróży. Zostaną zaktualizowane tylko inne szczegóły. To nie rozwiąże modelu.

Od 11 grudnia 2020 roku ta funkcja wypełni tylko linie łamane w przypadku niepustych tras. Wymaga też, aby atrybut populate_polylines miał wartość prawda.

Pola route_polyline przekazywanych tras 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.ignore i Vehicle.ignore nie mają wpływu na działanie systemu. Linie łamane są nadal wypełniane podczas wszystkich wizyt na niepustych trasach niezależnie od tego, czy powiązane przesyłki lub pojazdy są ignorowane.

interpret_injected_solutions_using_labels

bool

Jeśli tak:

Ta interpretacja dotyczy pól injected_first_solution_routes, injected_solution_constraint i refresh_details_routes. Można go użyć, gdy indeksy dostawy lub pojazdów w zgłoszeniu zmieniły się od momentu utworzenia rozwiązania, np. w związku z usunięciem przesyłki lub pojazdem z żądania albo dodaniem ich do prośby.

Jeśli ma wartość true (prawda), etykiety z następujących kategorii mogą pojawić się w danej kategorii co najwyżej raz:

Jeśli parametr vehicle_label we wstrzykiwanym rozwiązaniu nie odpowiada pojazdowi wysyłającemu żądanie, odpowiednia trasa jest usuwana z rozwiązania wraz z jego wizytami. Jeśli shipment_label we wstrzykiwanym roztworze nie odpowiada dostawie, odpowiednia wizyta jest usuwana z rozwiązania. Jeśli element SkippedShipment.label we wstrzykiwanym roztworze nie odpowiada przesyłce żądania, parametr SkippedShipment jest usuwany z rozwiązania.

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

UWAGA: element wywołujący musi upewnić się, że każdy element Vehicle.label (odp. Shipment.label) jednoznacznie identyfikuje pojazd (resp. wysyłki) w 2 odpowiednich żądaniach: w przeszłości, która spowodowała wygenerowanie OptimizeToursResponse użytego we wstrzykiwanym rozwiązaniu, oraz bieżące żądanie, które obejmuje wstrzyknięte rozwiązanie. Opisane powyżej testy unikalności nie wystarczą, aby spełnić to wymaganie.

consider_road_traffic

bool

Uwzględnij szacowany ruch przy obliczaniu pól ShipmentRoute Transition.travel_duration, Visit.start_time i vehicle_end_time; podczas ustawiania pola ShipmentRoute.has_traffic_infeasibilities i obliczania pola OptimizeToursResponse.total_cost.

populate_polylines

bool

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

populate_transition_polylines

bool

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

allow_large_deadline_despite_interruption_risk

bool

Jeśli tak, termin przesyłania prośby (patrz https://grpc.io/blog/deadlines) może wynosić maksymalnie 60 minut. W przeciwnym razie maksymalny termin to tylko 30 minut. Żądania długotrwałe wiążą się z znacznie większym (ale nadal niewielkim) ryzykiem zakłóceń w działaniu.

use_geodesic_distances

bool

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

label

string

Etykieta, która może zostać użyta do zidentyfikowania tego żądania, zgłoszona w OptimizeToursResponse.request_label.

geodesic_meters_per_second

double

Jeśli use_geodesic_distances ma wartość prawda, to pole musi być ustawione i określa szybkość stosowane do obliczania czasu podróży. Jej wartość musi wynosić co najmniej 1 metr/s.

max_validation_errors

int32

Skraca liczbę zwróconych błędów weryfikacji. Te błędy są zwykle dołączane do ładunku błędu CPD jako szczegółu błędu BadRequest (https://cloud.google.com/apis/design/errors#error_details), chyba że Solution_mode=VALIDATE_ONLY: patrz pole OptimizeToursResponse.validation_errors. Domyślna wartość to 100,a limit to 10 000.

SearchMode

Tryb definiujący działanie wyszukiwania z ograniczeniem czasu oczekiwania i jakości rozwiązania. We wszystkich trybach egzekwowany jest globalny termin żądania.

Wartości w polu enum
SEARCH_MODE_UNSPECIFIED Tryb nieokreślonego wyszukiwania – odpowiednik RETURN_FAST.
RETURN_FAST Gdy znajdziesz pierwsze dobre rozwiązanie, przestań je wyszukiwać.
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 funkcję rozwiązania. We wszystkich trybach oprócz VALIDATE_ONLY, jeśli żądanie jest nieprawidłowe, wystąpi błąd INVALID_REQUEST. Aby ograniczyć liczbę zwracanych błędów, zapoznaj się z tabelą max_validation_errors.

Wartości w polu enum
DEFAULT_SOLVE Rozwiąż model.
VALIDATE_ONLY Weryfikuje model tylko bez rozwiązywania go: wypełnia jak najwięcej parametrów OptimizeToursResponse.validation_errors.
DETECT_SOME_INFEASIBLE_SHIPMENTS

Podaje tylko wartości OptimizeToursResponse.validation_errors lub OptimizeToursResponse.skipped_shipments i nie rozwiązuje pozostałej części żądania (w odpowiedzi status i routes są odznaczone). W przypadku wykrycia niezgodności w injected_solution_constraint trasach zostaną one wypełnione w polu OptimizeToursResponse.validation_errors, a pole OptimizeToursResponse.skipped_shipments pozostanie puste.

WAŻNE: w tym miejscu zwracane są tylko te niemożliwe do zrealizowania, które zostały uznane za niemożliwe do wstępnego przetwarzania.

OptimizeToursResponse

Odpowiedź po rozwiązaniu problemu z optymalizacją wycieczki, który obejmuje trasy, po których poruszają się poszczególne pojazdy, przesyłki, które zostały pominięte, oraz ogólny koszt rozwiązania.

Pola
routes[]

ShipmentRoute

Trasy obliczane dla każdego pojazdu; i-ta trasa odpowiada i-tego 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. Zapoznaj się z wyjaśnieniem „WIELE BŁĘDÓW” dla komunikatu OptimizeToursValidationError.

metrics

Metrics

Dane dotyczące czasu trwania, odległości i wykorzystania dla tego rozwiązania.

Wskaźniki

Wskaźniki ogólne, zagregowane dla wszystkich tras.

Pola
aggregated_route_metrics

AggregatedMetrics

Dane zbiorcze po trasach. Poszczególne dane to suma (lub maksymalna w przypadku obciążeń) wszystkich pól ShipmentRoute.metrics o tej samej nazwie.

skipped_mandatory_shipment_count

int32

Liczba pominiętych obowiązkowych dostaw.

used_vehicle_count

int32

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

earliest_vehicle_start_time

Timestamp

Najwcześniejsza godzina rozpoczęcia użytkowania używanego pojazdu, obliczona jako minimalna wartość dla wszystkich używanych pojazdów z ShipmentRoute.vehicle_start_time.

latest_vehicle_end_time

Timestamp

Ostatni czas zakończenia użytkowania używanego pojazdu obliczony jako maksymalny czas zakończenia obsługi wszystkich używanych pojazdów w okresie ShipmentRoute.vehicle_end_time.

costs

map<string, double>

Koszt rozwiązania z podziałem na pola żądań związane z kosztami. Klucze to ścieżki proto powiązane z danymi wejściowymi OptimizeToursRequest, np. „model.shipments.pickups.cost”, a wartościami są łączny koszt wygenerowany przez odpowiednie pole kosztu, zagregowany dla całego rozwiązania. Inaczej mówiąc, koszt["model.shipments.pickups.cost"] to suma wszystkich kosztów odbioru w stosunku do rozwiązania. Wszystkie koszty zdefiniowane w modelu są raportowane tutaj szczegółowo z wyjątkiem kosztów związanych z atrybutami przejścia, które od 2022 r. 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, który wystąpił podczas weryfikacji elementu OptimizeToursRequest.

Pola
code

int32

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

W pozostałych polach (poniżej) znajdziesz więcej informacji o błędzie.

WIELE BŁĘDÓW: jeśli błędów jest wiele, proces weryfikacji próbuje wyświetlić kilka z nich. Ten proces nie jest doskonały, podobnie jak kompilator. Niektóre błędy weryfikacji będą „krytyczne”, co oznacza, że zatrzymują cały proces weryfikacji. Dotyczy to między innymi błędów display_name="UNSPECIFIED". Niektóre z nich mogą powodować, że w procesie weryfikacji pomijane są inne błędy.

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

REFERENCE: lista wszystkich par (kodu, nazwy):

  • UNSPECIFIED = 0;
  • VALIDATION_TIMEOUT_ERROR = 10; nie udało się ukończyć weryfikacji w wyznaczonym terminie.
  • REQUEST_OPTIONS_ERROR = 12;

    • REQUEST_OPTIONS_INVALID_SOLVING_MODE = 1201;
    • REQUEST_OPTIONS_TRUE_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_TRUE = 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_REASON_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_TRUE_SOFT_END_TIME = 2803;
    • TIME_WINDOW_OUTSIDE_GLOBAL_TIME_WINDOW = 2804;
    • TIME_WINDOW_START_TIME_AFTER_END_TIME = 2805;
    • TIME_WINDOW_FAILED_COST_PER_HOUR_BEFORE_SOFT_START_TIME = 2806;
    • TIME_WINDOW_FAILED_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_AFTER_END_TIME = 2814;
    • TIME_WINDOW_START_TIME_AFTER_SOFT_END_TIME = 2815;
    • 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_TRUE_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_lpurl_DURATION_NEGATIVE_OR_NAN = 3008;
    • TRANSITION_ATTRIBUTES_lpurl_DURATION_EXCEEDS_GLOBAL_DURATION = 3009;
  • AMOUNT_ERROR = 31;
    • AMOUNT_NEGATIVE_VALUE = 3100;
  • LOAD_LIMIT_ERROR = 33;
    • LOAD_LIMIT_FAILED_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_FAILED_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_DIFF_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_DETWAY_LIMIT_DURATION_NEGATIVE_OR_NAN = 4000;
    • SHIPMENT_PD_ABSOLUTE_DETWAY_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4001;
    • SHIPMENT_PD_RELATIVE_DETour_LIMIT_INVALID = 4015;
    • SHIPMENT_PD_DETUR_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_HOWMANY_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_HOWMANY_FIXED_COST = 4220;
    • VEHICLE_INVALID_TRAVEL_DURATION_MULTIPLE = 4221;
    • VEHICLE_TRAVEL_DURATION_MULTIPLE_WITH_SHIPMENT_PD_DETWAY_LIMITS = 4223;
    • VEHICLE_MATRIX_INDEX_WITH_SHIPMENT_PD_DETour_LIMITS = 4224;
    • VEHICLE_MIN_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;
  • 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;
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 przypadku pojazdu nr 4 i pierwszego odbioru przesyłki nr 2 można:

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

Pamiętaj jednak, że moc zbioru 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 w proporcjach 1:1 (gdy kod != "UNSPECIFIED").

stabilność: niestabilny: komunikat o błędzie powiązany z danym elementem code może się z czasem zmienić (być może zostanie wyjaśniony). Zamiast nich korzystaj z zasad display_name i code.

offending_values

string

Może zawierać wartości pól. Ta funkcja nie zawsze jest dostępna. Zdecydowanie nie należy na niej polegać i służy ona wyłącznie do ręcznego debugowania modelu.

FieldReference

Określa kontekst błędu weryfikacji. Pole FieldReference zawsze odwołuje się do danego pola w tym pliku i ma taką samą strukturę hierarchiczną. Na przykład możemy określić element nr 2 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 rekurencyjnie zagnieżdżone pole podrzędne.

Pole sumy index_or_key.

index_or_key może być 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

To pole jest wymagane. Format danych wyjściowych.

Pole sumy destination. To pole jest wymagane. destination może być tylko jedną z tych wartości:
gcs_destination

GcsDestination

Lokalizacja w Google Cloud Storage, w której zostaną zapisane dane wyjściowe.

Wysyłka

Przesyłka pojedynczego produktu, od jednego z odbiorów do jednej z nich. Aby przesyłka została uznana za zrealizowana, unikalny pojazd musi odwiedzić jedno z jego lokalizacji (i odpowiednio zmniejszyć jego pojemność), a następnie odwiedzić jedno z miejsc dostawy (i w związku z tym ponownie odpowiednio zwiększyć pojemność).

Pola
display_name

string

Zdefiniowana przez użytkownika wyświetlana nazwa przesyłki. Może zawierać do 63 znaków i zawierać znaki UTF-8.

pickups[]

VisitRequest

Zestaw alternatywnych opcji odbioru powiązanych z dostawą. Jeśli go nie podasz, pojazd musi odwiedzić tylko lokalizację odpowiadającą przesyłki.

deliveries[]

VisitRequest

Zestaw alternatywnych opcji dostawy powiązanych z dostawą. Jeśli go nie podasz, pojazd będzie musiał przyjść tylko do miejsca odpowiadającego możliwości odbioru.

load_demands

map<string, Load>

Obciążenie przesyłki (np. waga, objętość, liczba palet itp.). Klucze na mapie powinny być identyfikatorami opisującymi typ odpowiedniego obciążenia, najlepiej łącznie z jednostkami. Na przykład: „weight_kg”, „volume_gallons”, „pallet_count” itp. Jeśli danego klucza nie ma na mapie, odpowiednie obciążenie jest uznawane za puste.

allowed_vehicle_indices[]

int32

Zestaw pojazdów, które mogą zrealizować tę przesyłkę. Jeśli pole jest puste, wszystkie pojazdy mogą z niego korzystać. Pojazdy są wyświetlane według ich indeksu na liście vehicles w tabeli ShipmentModel.

costs_per_vehicle[]

double

Określa koszt poniesiony w związku z dostarczeniem przesyłki przez każdy pojazd. Jeśli jest określony, musi zawierać EITHER:

  • tyle samo elementów co costs_per_vehicle_indices. Wartość costs_per_vehicle[i] odpowiada pojazdowi costs_per_vehicle_indices[i] modelu.
  • z taką samą liczbą elementów co w modelu. Element i-ten odpowiada numerowi i-ty pojazdowi modelu.

Koszty muszą być podane w tej samej jednostce co wartość 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, których dotyczy costs_per_vehicle. Jeśli pole nie jest puste, musi zawierać tę samą liczbę elementów co costs_per_vehicle. Indeks pojazdu nie może zostać określony więcej niż raz. Jeśli pojazd nie jest uwzględniony w programie costs_per_vehicle_indices, jego koszt wynosi 0.

pickup_to_delivery_absolute_detour_limit

Duration

Określa maksymalny bezwzględny czas odjazdu w porównaniu z najkrótszą trasą od punktu odbioru do dostawy. Jeśli określono wartość, nie może ona być ujemna, a przesyłka musi zawierać co najmniej odbiór i dostawę.

Niech to na przykład będzie najkrótszy czas potrzebny do uzyskania z wybranej alternatywy odbioru bezpośrednio do wybranej opcji dostawy. Następnie ustawienie pickup_to_delivery_absolute_detour_limit wymusza:

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

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

pickup_to_delivery_time_limit

Duration

Określa maksymalny czas od rozpoczęcia odbioru do rozpoczęcia dostawy. Jeśli określono wartość, nie może ona być ujemna, a przesyłka musi zawierać co najmniej odbiór i dostawę. Nie zależy to od możliwości odbioru i dostawy 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” tej przesyłki. Ta funkcja może służyć do definiowania niezgodności lub wymagań między shipment_types (patrz shipment_type_incompatibilities i shipment_type_requirements w ShipmentModel).

Różni się od usługi visit_types określonej dla pojedynczej wizyty: wszystkie odbiory/dostawy należące do tej samej przesyłki mają tę samą wartość shipment_type.

label

string

Określa etykietę tej przesyłki. Ta etykieta jest zgłaszana w odpowiedzi w shipment_label odpowiedniego elementu (ShipmentRoute.Visit).

ignore

bool

Jeśli ma wartość prawda, pomiń tę dostawę, ale nie stosuj penalty_cost.

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

Ignorowanie dostawy realizowanej w krajach injected_first_solution_routes lub injected_solution_constraint jest dozwolone. Rozwiązanie rozwiązuje też związane z nią wizyty dotyczące odbioru/dostawy z wybranej trasy. precedence_rules, które odwołują się do ignorowanych przesyłek, również będą ignorowane.

penalty_cost

double

Jeśli dostawa nie zostanie ukończona, ta kara zostanie dodana do całkowitego kosztu tras. Przesyłka jest uznawana za zakończoną, jeśli zostanie odwiedzona jedna z dostępnych opcji odbioru i dostawy. Koszt może być wyrażony w tej samej jednostce, która została użyta we wszystkich innych polach dotyczących kosztów w modelu, i musi być dodatnia.

WAŻNE: jeśli ta kara nie zostanie określona, zostanie uznana za nieskończoną, tj. dostawa musi zostać zrealizowana.

pickup_to_delivery_relative_detour_limit

double

Określa maksymalny względny czas odjazdu w porównaniu z najkrótszą ścieżką od odbioru do dostawy. Jeśli określono wartość, nie może ona być ujemna, a przesyłka musi zawierać co najmniej odbiór i dostawę.

Niech to na przykład będzie najkrótszy czas potrzebny do uzyskania z wybranej alternatywy odbioru bezpośrednio do wybranej opcji dostawy. Następnie ustawienie 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 dla tej samej dostawy określono zarówno limity względne, jak i bezwzględne, w przypadku każdej możliwej pary odbioru/dostawy zostanie zastosowany bardziej restrykcyjny limit. Od 10 października 2017 r. objazdy są obsługiwane tylko wtedy, gdy czas podróży nie zależy od pojazdu.

Wczytaj

Podczas wizyty wstępnie zdefiniowana kwota może zostać dodana do obciążenia pojazdu, jeśli jest to odbiór, lub odliczona w przypadku dostawy. Tę kwotę określamy w tej wiadomości. Zobacz load_demands.

Pola
amount

int64

Kwota obciążenia pojazdu podczas danej wizyty będzie się zmieniać. Jest to liczba całkowita, dlatego użytkownicy powinni wybrać odpowiednią jednostkę, aby uniknąć utraty dokładności. Musi wynosić ≥ 0.

VisitRequest

Prośba o wizytę, którą może zrealizować pojazd: określa lokalizację geograficzną (lub dwie, patrz niżej), godziny otwarcia i zamknięcia przedstawione w przedziałach czasowych oraz czas trwania usługi (czas, jaki pojazd zajmuje odbiór lub oddanie towaru).

Pola
arrival_location

LatLng

Lokalizacja geograficzna, do której przyjeżdża pojazd, gdy wykonujesz ten VisitRequest. Jeśli model dostawy ma macierze odległości czasu trwania, nie należy określać atrybutu arrival_location.

arrival_waypoint

Waypoint

Punkt na trasie, do którego dociera pojazd podczas wykonywania tego parametru (VisitRequest). Jeśli model dostawy ma macierze odległości czasu trwania, nie należy określać atrybutu arrival_waypoint.

departure_location

LatLng

Geolokalizacja, z której pojazd odjeżdża po wykonaniu tej VisitRequest. Można ją pominąć, jeśli jest taka sama jak wartość arrival_location. Jeśli model dostawy ma macierze odległości czasu trwania, nie należy określać atrybutu departure_location.

departure_waypoint

Waypoint

Punkt na trasie, z którego pojazd odjeżdża po pokonaniu tego trasy VisitRequest. Można ją pominąć, jeśli jest taka sama jak wartość arrival_waypoint. Jeśli model dostawy ma macierze odległości czasu trwania, nie należy określać atrybutu departure_waypoint.

tags[]

string

Określa tagi dołączone do prośby o wizytę. Puste i zduplikowane ciągi znaków są niedozwolone.

time_windows[]

TimeWindow

Przedziały czasu, które ograniczają godzinę przyjazdu na wizytę. Pamiętaj, że pojazd może odjechać poza przedziałem czasu przyjazdu, tj. godzina przyjazdu i czas trwania nie muszą znajdować się w przedziale czasowym. Może to spowodować czas oczekiwania, jeśli pojazd przyjedzie przed TimeWindow.start_time.

Brak TimeWindow oznacza, że pojazd może przeprowadzić tę wizytę w dowolnym momencie.

Przedziały czasu muszą być rozłączone, tj. żadne przedziały czasu nie mogą na siebie nakładać się lub przylegać do siebie i muszą się zmieniać w kolejności rosnącej.

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

Długość wizyty, czyli czas spędzony przez pojazd między przyjazdem a odjazdem (należy go dodać do możliwego czasu oczekiwania; patrz: time_windows).

cost

double

Koszt obsługi tej prośby o wizytę na trasie pojazdu. Możesz użyć tej opcji, aby zapłacić różne koszty za każdy alternatywny odbiór lub dostawę przesyłki. Koszt musi być w tej samej jednostce co Shipment.penalty_cost i nie może być ujemny.

load_demands

map<string, Load>

Obciążenia związane z tą prośbą o wizytę. Działa ono tak samo jak pole Shipment.load_demands z tą różnicą, że odnosi się tylko do VisitRequest, a nie do całego pola Shipment. Wymienione tutaj oferty są dodane do żądań wymienionych w: Shipment.load_demands.

visit_types[]

string

Określa typy wizyt. Pozwala to przydzielić pojazdowi dodatkowy czas na ukończenie 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łaszana w odpowiedzi jako visit_label w odpowiednim elemencie ShipmentRoute.Visit.

ShipmentModel

Model dostawy obejmuje zbiór wysyłek, które muszą zostać wykonane przez zestaw pojazdów przy minimalizowaniu ogólnego kosztu, który jest sumą:

  • koszt kierowania pojazdem (suma kosztu łącznego czasu, koszt czasu podróży i stały koszt wszystkich pojazdów);
  • niewykonane kary za dostawę.
  • koszt dostawy na całym świecie
Pola
shipments[]

Shipment

Zestaw wysyłek, które muszą zostać wykonane w modelu.

vehicles[]

Vehicle

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

global_start_time

Timestamp

Globalny czas rozpoczęcia i zakończenia modelu: żadne godziny spoza tego zakresu nie można uznać za prawidłowe.

Zakres czasowy modelu musi być krótszy niż rok, np. wartości w polach global_end_time i global_start_time muszą być mniejsze niż 315 36 000 sekund.

Podczas korzystania z pól cost_per_*hour możesz ustawić krótszy przedział czasu, aby zwiększyć wydajność (np. jeśli modelujesz jeden dzień, ustaw globalne limity czasu na ten dzień). Jeśli zasada nie jest skonfigurowana, jako domyślna używana jest godzina 00:00:00 UTC, 1 stycznia 1970 r. (tzn. sekund: 0, nanos: 0).

global_end_time

Timestamp

Jeśli zasada nie jest skonfigurowana, jako domyślna używana jest godzina 00:00:00 UTC, 1 stycznia 1971 r. (tzn. sekund: 31536000, nanos: 0).

global_duration_cost_per_hour

double

„Globalny czas trwania” ogólnego planu to różnica między najwcześniejszym efektywnym czasem rozpoczęcia a najnowszym efektywnym czasem zakończenia wszystkich pojazdów. Użytkownicy mogą przypisać do tej ilości koszt godzinowy, aby na przykład podjąć próbę optymalizacji pod kątem jak najwcześniejszego ukończenia zadania. Ten koszt musi być w tej samej jednostce co Shipment.penalty_cost.

duration_distance_matrices[]

DurationDistanceMatrix

Określa używane w modelu macierze czasu trwania i odległości. Jeśli to pole jest puste, zostaną użyte dane z Map Google lub odległości geodezyjne w zależności od wartości pola use_geodesic_distances. Jeśli pole nie jest puste, use_geodesic_distances nie może mieć wartości true i ani duration_distance_matrix_src_tags, ani duration_distance_matrix_dst_tags nie może być puste.

Przykłady użycia:

  • Są 2 miejsca: locA i locB.
  • 1 pojazd rozpoczynający trasę w lokalu locA i kończący się w lokalu locA.
  • 1 prośba o wizytę z odbiorem w lokalu.
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ą 3 lokalizacje: locA, locB i locC.
  • 1 pojazd, który rozpoczyna trasę w lokalu A i kończy w lokalu locB, z użyciem macierzy „szybko”.
  • 1 pojazd, który rozpoczyna trasę w lokalu locB i kończy w lokalu locB z użyciem macierzy „wolno”.
  • 1 pojazd, który rozpoczyna trasę w lokalu locB i kończy w lokalu locB z użyciem macierzy „szybko”.
  • 1 prośba o wizytę z odbiorem 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; duration_distance_matrices(i).rows(j) definiuje czasy trwania i odległości od wizyt za pomocą tagu duration_distance_matrix_src_tags(j) do innych wizyt w tablicy i.

Tagi odpowiadają elementom VisitRequest.tags lub Vehicle.start_tags. Dane VisitRequest lub Vehicle muszą pasować dokładnie do 1 tagu w tym polu. Pamiętaj, że tagi źródła, miejsca docelowego i matrycy elementów Vehicle mogą być takie same; podobnie tagi źródła i docelowego elementu typu 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

Tagi określające miejsca docelowe dla macierzy czasu trwania i odległości: duration_distance_matrices(i).rows(j).durations(k) (odp. duration_distance_matrices(i).rows(j).meters(k)) określa czas trwania (czyli odległość) podróży z tagiem duration_distance_matrix_src_tags(j) do wizyt z tagiem duration_distance_matrix_dst_tags(k) w tablicy i.

Tagi odpowiadają elementom VisitRequest.tags lub Vehicle.start_tags. Dane VisitRequest lub Vehicle muszą pasować dokładnie do 1 tagu w tym polu. Pamiętaj, że tagi źródła, miejsca docelowego i matrycy elementów Vehicle mogą być takie same; podobnie tagi źródła i docelowego elementu typu 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

Do modelu dodano atrybuty przejścia.

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

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

shipment_type_requirements[]

ShipmentTypeRequirement

Zestawy wymagań typu 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 jego trasie zostanie zrealizowana co najmniej jedna przesyłka. Może to służyć do ograniczenia liczby tras, jeśli kierowców jest mniej niż pojazdów, a flota pojazdów jest heterogeniczna. Optymalizacja wybiera najlepszy podzbiór pojazdów do użycia. Musi być wartością dodatnią.

DurationDistanceMatrix

Określa czas trwania wizyty i matrycę odległości od lokalizacji początkowych pojazdów do odwiedzenia oraz lokalizacji zakończenia pojazdu.

Pola
rows[]

Row

Określa wiersze macierzy czasu trwania i odległości. Liczba elementów musi być równa ShipmentModel.duration_distance_matrix_src_tags.

vehicle_start_tag

string

Tag określający, do których pojazdów ma zastosowanie dany czas trwania i matryca odległości. Jeśli pole jest puste, dotyczy to wszystkich pojazdów i może istnieć tylko jedna matryca.

Każdy początek pojazdu musi pasować dokładnie do jednej macierzy, tj. dokładnie jedno z jego pola start_tags musi być zgodne z vehicle_start_tag macierzy (i tylko dla tej macierzy).

Wszystkie macierze muszą mieć inny parametr vehicle_start_tag.

Wiersz

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

Pola
durations[]

Duration

Wartości czasu trwania poszczególnych wierszy. Liczba elementów musi być równa ShipmentModel.duration_distance_matrix_dst_tags.

meters[]

double

Wartości odległości w danym wierszu. Jeśli w modelu nie ma kosztów ani ograniczeń, to pole może pozostać puste. W przeciwnym razie liczba elementów musi być taka sama jak durations.

PrecedenceRule

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

Kilka pierwszeństwa może odnosić się do tych samych (lub powiązanych) zdarzeń, np. „odbiór produktu B następuje po dostawie A” oraz „odbiór produktu C następuje po odbiorze produktu B”.

Co więcej, pierwszeństwo mają zastosowanie tylko wtedy, gdy realizowane są obie dostawy, a w przeciwnym razie są one ignorowane.

Pola
first_is_delivery

bool

Wskazuje, czy „pierwsze” zdarzenie jest wyświetleniem.

second_is_delivery

bool

Wskazuje, czy zdarzenie „second” jest wyświetleniem.

offset_duration

Duration

Przesunięcie między pierwszym a drugim zdarzeniem. Ta wartość może być ujemna.

first_index

int32

Indeks dostawy dla „pierwszego” zdarzenia. To pole musi być określone.

second_index

int32

Indeks dostawy dla drugiego zdarzenia. To pole musi być określone.

ShipmentRoute

Trasa pojazdu może zostać rozłożona zgodnie z osią czasu w ten sposób (zakładamy, że liczba wizyt wynosi n):

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

Rozróżniamy między tymi elementami:

  • „wydarzenia punktowe”, np. początek i koniec każdej wizyty oraz początek i koniec każdej wizyty (tzw. przyjazd i odjazd). Występują w określonej sekundzie.
  • „przedziały czasu”, np. same wizyty oraz przejścia między odwiedzinami. Chociaż czas trwania przedziałów czasowych może czasami wynosić zero, tj. zaczyna się i kończy o tej samej sekundzie, często ma dodatnią długość.

Niezmienniki:

  • Jeśli liczba wizyt wynosi n, oznacza to n+1 przejść.
  • Wizyta zawsze poprzedza przejście (ten sam indeks) i przejście po niej (indeks + 1).
  • Po uruchomieniu pojazdu zawsze następuje przejście nr 0.
  • Koniec pojazdu jest zawsze poprzedzony przejściem nr n.

Powiększanie. Oto, co się dzieje podczas zdarzeń Transition i Visit:

---+-------------------------------------+-----------------------------+-->
   |           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

Oto jak można ustawić PODRÓŻE, NARUSY, OPÓŹNIENIA i OCZEKIWANIE podczas przejścia.

  • Nie nakładają się na siebie.
  • Opóźnienie jest niepowtarzalne i musi się liczyć w ciągu poprzedzającym kolejną wizytę (lub koniec pojazdu). Aby poznać czas rozpoczęcia i zakończenia, wystarczy znać czas opóźnienia.
  • ZMIANY to graniczące ze sobą okresy, które nie nakładają się na siebie. Odpowiedź określa czas rozpoczęcia i czas trwania każdej przerwy.
  • Funkcje TRAVEL i WAIT są „możliwość wywłaszczania”: w trakcie tego przejścia można je kilka razy przerwać. Klienci mogą założyć, że podróż odbywa się „jak najszybciej” i że pozostały czas zapełnia się „oczekiwaniem”.

A (złożony) przykład:

                               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 poruszający się po trasie, określony za pomocą indeksu w źródle ShipmentModel.

vehicle_label

string

Etykieta pojazdu obsługują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, o którym pojazd kończy trasę.

visits[]

Visit

Uporządkowana sekwencja wizyt reprezentująca trasę. Odwiedziny[i] to i-te odwiedziny na trasie. Jeśli to pole jest puste, pojazd jest uznawany 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 szacowanego czasu podróży na podstawie natężenia ruchu. Czas podróży dostosowany do natężenia ruchu, opóźnienia i przerwy między wizytami, przed pierwszą lub ostatnią wizytą może być niewystarczający na realizację wyświetleń i przedziałów czasowych pojazdu. Przykład:

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

Przyjazd na stację next_visit prawdopodobnie odbędzie się później niż bieżące okno ze względu na wydłużony szacowany czas podróży o travel_duration(previous_visit, next_visit) ze względu na natężenie ruchu. Przerwa może się też pokrywać z wizytą z powodu zwiększenia szacowanego czasu podróży oraz ograniczeń czasowych wizyt lub przerw.

route_polyline

EncodedPolyline

Zakodowana reprezentacja trasy za pomocą linii łamanej. To pole jest wypełniane tylko wtedy, gdy OptimizeToursRequest.populate_polylines ma wartość Prawda.

breaks[]

Break

Zaplanowane przerwy na pojazd poruszający się na tej trasie. Sekwencja breaks reprezentuje przedziały czasu, których każde rozpoczyna się w odpowiedniej wartości start_time i trwa duration s.

metrics

AggregatedMetrics

Dane o czasie trwania, odległości i obciążeniu na tej trasie. Pola pola AggregatedMetrics są sumowane we wszystkich elementach ShipmentRoute.transitions lub ShipmentRoute.visits, w zależności od kontekstu.

route_costs

map<string, double>

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

route_total_cost

double

Całkowity koszt trasy. Suma wszystkich kosztów na mapie kosztów.

Przerwa

Dane reprezentujące wykonanie przerwy.

Pola
start_time

Timestamp

Godzina rozpoczęcia przerwy.

duration

Duration

Czas trwania przerwy.

EncodedPolyline

Zakodowana reprezentacja linii łamanej. Więcej informacji o kodowaniu w liniach ł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 dwoma zdarzeniami na trasie. Zobacz opis aplikacji ShipmentRoute.

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

Pola
travel_duration

Duration

Czas podróży podczas tego przejścia.

travel_distance_meters

double

Dystans pokonany podczas przejścia.

traffic_info_unavailable

bool

Jeśli żądanie informacji o ruchu jest wysyłane przez interfejs OptimizeToursRequest.consider_road_traffic, ale nie udało się pobrać informacji o ruchu dla parametru Transition, ta wartość logiczna ma wartość „true”. Może być to sytuacja przejściowa (rzadkie zacinanie się serwerów ruchu w czasie rzeczywistym) lub stała (brak danych dotyczących tej lokalizacji).

delay_duration

Duration

Suma czasów opóźnienia zastosowanych do tego przejścia. W razie potrzeby opóźnienie zaczyna się dokładnie delay_duration s przed następnym zdarzeniem (wizytą lub końcem pojazdu). Zobacz TransitionAttributes.delay.

break_duration

Duration

Suma czasu trwania przerw występujących podczas tego przejścia (jeśli mają miejsce). Szczegółowe informacje o godzinie i czasie trwania każdej przerwy są przechowywane w usłudze ShipmentRoute.breaks.

wait_duration

Duration

Czas oczekiwania podczas tego przejścia. Czas oczekiwania odpowiada czasowi bezczynności i nie uwzględnia czasu przerwy. Pamiętaj też, że ten czas oczekiwania można podzielić na kilka niesąsiadujących ze sobą przedziałów.

total_duration

Duration

Całkowity czas trwania przejścia podany dla wygody użytkowników. Jest równa:

  • na stronie start_time (lub vehicle_end_time, jeśli jest to ostatnie przejście) – jest to start_time tego przejścia.
  • jeśli ShipmentRoute.has_traffic_infeasibilities ma wartość false (fałsz), dodatkowo obowiązuje: `total_duration = travel_duration + delay_duration
  • break_duration + wait_duration`.
start_time

Timestamp

Godzina rozpoczęcia tego przejścia.

route_polyline

EncodedPolyline

Zakodowana reprezentacja trasy łamanej, która odbywa się podczas przejścia. To pole jest wypełniane tylko wtedy, gdy populate_transition_polylines ma wartość Prawda.

vehicle_loads

map<string, VehicleLoad>

Liczba ładunków pojazdów podczas tej zmiany w przypadku każdego typu, który pojawia się w dokumencie Vehicle.load_limits tego pojazdu, lub w przypadku niektórych dostaw na tej trasie, które mają wartość Shipment.load_demands większą od zera.

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

VehicleLoad

Raportuje rzeczywiste obciążenie pojazdu w pewnym punkcie trasy dla danego typu (patrz: Transition.vehicle_loads).

Pola
amount

int64

Obciążenie pojazdu określonego typu. Jednostka obciążenia jest zwykle określana przez typ. Zobacz Transition.vehicle_loads.

Wejdź na

Wizyta wykonana podczas trasy. Ta wizyta odpowiada odbiorze lub dostawie produktu Shipment.

Pola
shipment_index

int32

Indeks pola shipments w źródle ShipmentModel.

is_pickup

bool

Jeśli ma wartość prawda, wizyta odpowiada odbiorowi Shipment. W przeciwnym razie odpowiada ona wyświetleniu.

visit_request_index

int32

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

start_time

Timestamp

Godzina rozpoczęcia wizyty. Pamiętaj, że pojazd może przyjechać do miejsca wizyty wcześniej. Czas jest zgodny z tym ustawieniem: ShipmentModel.

load_demands

map<string, Load>

Łączne zapotrzebowanie na wizytę po stronie jako suma przesyłki i żądania wizyty load_demands. Wartości są ujemne, jeśli wizyta zakończyła się wyświetleniem. Żądania są raportowane dla tych samych typów co pole Transition.loads (zobacz to pole).

detour

Duration

Dodatkowy czas odjazdu ze względu na przesyłki odwiedzone na trasie przed wizytą i potencjalny czas oczekiwania wynikający z przedziałów czasowych. Jeśli wizyta obejmuje dostawę, zmiana trasy jest obliczana na podstawie odpowiedniej wizyty i równa się:

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

W innych przypadkach jest obliczany na podstawie start_location pojazdu i równa się:

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

string

Kopia odpowiedniej wartości Shipment.label, jeśli została określona w Shipment.

visit_label

string

Kopia odpowiedniej wartości VisitRequest.label, jeśli została określona w VisitRequest.

ShipmentTypeIncompatibility

Określa niezgodności między przesyłkami w zależności od typu dostawy. Wyświetlanie niezgodnych przesyłek na tej samej trasie jest ograniczone na podstawie trybu niezgodności.

Pola
types[]

string

Lista niezgodnych typów. Dwie przesyłki o różnych wartościach (shipment_types) spośród wymienionych są „niezgodne”.

incompatibility_mode

IncompatibilityMode

Tryb został zastosowany do niezgodności.

IncompatibilityMode

Środki transportu określające sposób ograniczenia wyglądu 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 nigdy używać.
NOT_PERFORMED_BY_SAME_VEHICLE W tym trybie 2 przesyłki o niezgodnych typach nie mogą nigdy korzystać z tego samego pojazdu.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

W przypadku 2 przesyłek z niezgodnymi typami przesyłek w trybie niezgodności NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY:

  • Jeśli obie opcje mają charakter tylko odbioru (bez dostaw) lub tylko dostawy (bez odbioru), nie mogą korzystać z tego samego pojazdu.
  • Jeśli jedna z przesyłki obejmuje dostawę, a druga odbiór, mogą one korzystać z tego samego pojazdu, jeśli poprzednia zostanie dostarczona, zanim druga zostanie odebrana.

ShipmentTypeRequirement

Określa wymagania dotyczące przesyłek na podstawie atrybutu shipping_type [typ dostawy]. Szczegóły wymagania są określane przez tryb wymagań.

Pola
required_shipment_type_alternatives[]

string

Lista alternatywnych typów dostawy, których wymaga dependent_shipment_types.

dependent_shipment_types[]

string

Wszystkie przesyłki określonego typu w polu dependent_shipment_types wymagają, aby na tej samej trasie można było odwiedzić co najmniej jedną przesyłkę typu required_shipment_type_alternatives.

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

requirement_mode

RequirementMode

Tryb został zastosowany do wymagania.

RequirementMode

Środki transportu definiujące wygląd przesyłek zależnych na trasie.

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

W trybie IN_SAME_VEHICLE_AT_PICKUP_TIME wszystkie „zależne” przesyłki muszą mieć w pojeździe co najmniej jedną „niezbędną” przesyłkę w momencie odbioru.

„Zależny” odbiór w przypadku przesyłki musi więc mieć:

  • „Wymagana” przesyłka z dostawą, która zostanie dostarczona na trasie po jej upływie lub
  • Wysyłka „wymagana” została odebrana na trasie przed nią, a jeśli „wymagana” przesyłka została dostarczona, musi zostać ona zrealizowana po odbiorze przesyłki „zależnej”.
IN_SAME_VEHICLE_AT_DELIVERY_TIME Tak jak wcześniej, z tą różnicą, że w przypadku przesyłki „zależnej” pojazd musi mieć „wymagane” dostawę w momencie dostawy.

SkippedShipment

Określa szczegóły dotyczące niezrealizowanych dostaw w rozwiązaniu. W prostych przypadkach lub jeśli jesteśmy w stanie określić przyczynę pominięcia, podajemy ją tutaj.

Pola
index

int32

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

label

string

Kopia odpowiedniej wartości Shipment.label, jeśli została określona w Shipment.

reasons[]

Reason

Lista powodów, dla których przesyłka została pominięta. Zobacz komentarz powyżej Reason.

Przyczyna

Jeśli będziemy mogli wyjaśnić, dlaczego przesyłka została pominięta, podamy jej przyczynę. Jeśli przyczyna nie jest taka sama w przypadku wszystkich pojazdów, reason będzie mieć więcej niż 1 element. Pominięta przesyłka nie może mieć zduplikowanych przyczyn, tj. wszystkie pola są takie same z wyjątkiem pola 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 przypadku co najmniej jednego pojazdu „jabłko” zostanie przekroczony limit pojemności „jabłków” (łącznie z pojazdem 1), przekroczona zostanie pojemność co najmniej jednego pojazdu „Gruszki” (w tym pojazd 3) i co najmniej jednego z nich (w tym pojazd 1).

Pola
code

Code

Zapoznaj się z komentarzami do kodu.

example_exceeded_capacity_type

string

Jeśli kod przyczyny to DEMAND_EXCEEDS_VEHICLE_CAPACITY, dokumentuje jeden typ pojemności, który został przekroczony.

example_vehicle_index

int32

Jeśli przyczyna jest związana z niezgodnym pojazdem dostawczym, to pole zawiera indeks jednego odpowiedniego pojazdu.

Kod

Kod określający typ przyczyny. Porządek ten nie ma sensu. W szczególności nie wskazuje, czy dana przyczyna pojawi się przed inną w rozwiązaniach, jeśli obie mają zastosowanie.

Wartości w polu enum
CODE_UNSPECIFIED Nie należy go nigdy używać. Jeśli nie wiemy, dlaczego przesyłka została pominięta, zwracamy po prostu pusty zestaw powodów.
NO_VEHICLE W tym modelu nie ma pojazdu, który uniemożliwia realizację wszystkich dostaw.
DEMAND_EXCEEDS_VEHICLE_CAPACITY Żądanie przesyłki przekracza pojemność pojazdu w przypadku niektórych typów pojemności, z których jeden to example_exceeded_capacity_type.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT

Minimalna odległość niezbędna do realizacji tej przesyłki, tj. od start_location pojazdu do miejsca odbioru lub dostawy oraz do końcowej lokalizacji pojazdu, przekracza route_distance_limit pojazdu.

Pamiętaj, że do obliczeń używamy odległości geodezyjnych.

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT

Minimalny czas potrzebny do realizacji tej dostawy, w tym czas podróży, czas oczekiwania i czas obsługi, przekracza route_duration_limit pojazdu.

Uwaga: czas podróży oblicza się w najlepszym przypadku, czyli jako odległość geodezyjną x 36 m/s (około 130 km/h).

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT Tak samo jak powyżej, ale porównujemy tylko minimalny czas podróży i travel_duration_limit pojazdu.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS Pojazd nie może zrealizować tej dostawy w najlepszym przypadku (zobacz CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT, aby obliczyć czas, jeśli rozpocznie się o najwcześniejszym czasie rozpoczęcia: całkowity czas spowoduje, że pojazd zakończy się po najpóźniejszej godzinie zakończenia).
VEHICLE_NOT_ALLOWED Pole allowed_vehicle_indices przesyłki nie jest puste i 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.

Progi bezterminowego przedziału czasu, start_time i end_time, wymuszają wymuszanie najwcześniejszej i ostatniej godziny zdarzenia, np. start_time <= event_time <= end_time. Dolna granica okresu nieograniczonego czasu (soft_start_time) określa, czy zdarzenie ma nastąpić o soft_start_time lub później. Koszt jest naliczany proporcjonalnie do czasu, po którym następuje zdarzenie soft_start_time. Górna granica okna czasowego (soft_end_time) określa, że zdarzenie ma nastąpić o soft_end_time lub wcześniej. Jest to koszt proporcjonalnie do czasu wystąpienia soft_end_time po wystąpieniu zdarzenia. 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) i respektować:

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

Timestamp

Godzina rozpoczęcia twardego przedziału czasu. Jeśli nie określono inaczej, zostanie ustawiona wartość ShipmentModel.global_start_time.

end_time

Timestamp

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

soft_start_time

Timestamp

Czas uruchomienia łagodnego w przedziale czasu.

soft_end_time

Timestamp

Czas łagodnego zakończenia przedziału czasu.

cost_per_hour_before_soft_start_time

double

Koszt na godzinę dodany do innych kosztów w modelu, jeśli zdarzenie wystąpi przed soft_start_time, jest obliczane 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 to pole można ustawić tylko wtedy, gdy ustawiono soft_start_time.

cost_per_hour_after_soft_end_time

double

Koszt na godzinę dodany do innych kosztów w modelu, jeśli zdarzenie wystąpi po soft_end_time, jest obliczany w ten sposób:

   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 to pole można skonfigurować tylko wtedy, gdy ustawiono soft_end_time.

TransitionAttributes

Określa atrybuty przejścia między dwoma kolejnymi wizytami na trasie. Do tego samego przejścia może zastosować kilka funkcji TransitionAttributes. W takim przypadku wszystkie dodatkowe koszty sumują się i ma zastosowanie najbardziej rygorystyczne ograniczenie lub limit (po naturalnej semantyce „ORAZ”).

Pola
src_tag

string

tagów określających zestaw przejść (src->dst), do których mają zastosowanie te atrybuty.

Wizyta źródłowa lub początek pojazdu pasuje do wartości VisitRequest.tags albo pola Vehicle.start_tags zawiera wartość src_tag albo nie zawiera excluded_src_tag (w zależności od tego, które z tych pól nie jest puste).

excluded_src_tag

string

Zobacz src_tag. Pole src_tag lub excluded_src_tag nie może być puste.

dst_tag

string

Docelowa wizyta lub koniec pojazdu pasuje do wartości VisitRequest.tags lub Vehicle.end_tags zawiera wartość dst_tag albo nie zawiera excluded_dst_tag (w zależności od tego, które z tych pól nie jest puste).

excluded_dst_tag

string

Zobacz dst_tag. Pole dst_tag lub excluded_dst_tag nie może być puste.

cost

double

Określa koszt wykonania tej zmiany. Jest to ta sama jednostka co wszystkie inne koszty w modelu i nie może być ujemna. Jest on stosowany do wszystkich innych kosztów.

cost_per_kilometer

double

Określa koszt kilometra stosowanego do odległości pokonanej podczas wykonywania tej zmiany. Łączna kwota to Vehicle.cost_per_kilometer określona w pojazdach.

distance_limit

DistanceLimit

Określa limit odległości pokonanej podczas wykonywania tego przejścia.

Od 2021 roku obsługiwane są tylko miękkie limity.

delay

Duration

Określa opóźnienie występujące podczas wykonywania tej operacji przenoszenia.

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

Pojazd

Modelowanie pojazdu w problemie z wysyłką. Rozwiązanie problemu dotyczącego dostawy spowoduje utworzenie trasy dla tego pojazdu od start_location do end_location. Trasa to sekwencja wizyt (patrz ShipmentRoute).

Pola
display_name

string

Zdefiniowana przez użytkownika wyświetlana nazwa pojazdu. Może zawierać do 63 znaków i zawierać znaki UTF-8.

travel_mode

TravelMode

Tryb podróży, który ma wpływ na drogi dostępne dla pojazdu oraz prędkość. Zobacz też travel_duration_multiple.

start_location

LatLng

Lokalizacja geograficzna, w której pojazd rozpoczyna się przed odebraniem przesyłek. Jeśli nie podasz żadnej wartości, pojazd rozpocznie się przy pierwszym odbiorze. Jeśli model dostawy ma czas trwania i macierze odległości, nie należy określać atrybutu start_location.

start_waypoint

Waypoint

Punkt pośredni reprezentujący lokalizację geograficzną, w której pojazd rozpoczyna się przed odebraniem przesyłek. Jeśli nie podasz wartości start_waypoint ani start_location, pojazd rozpocznie się od pierwszego odbioru. Jeśli model dostawy ma czas trwania i macierze odległości, nie należy określać atrybutu start_waypoint.

end_location

LatLng

Lokalizacja geograficzna, do której pojazd kończy się po zakończeniu ostatniego VisitRequest. Jeśli nie określisz stanu pojazdu, ShipmentRoute kończy się natychmiast po zakończeniu ostatniego okresu (VisitRequest). Jeśli model dostawy ma czas trwania i macierze odległości, nie należy określać atrybutu end_location.

end_waypoint

Waypoint

Punkt pośredni reprezentujący lokalizację geograficzną, w której pojazd kończy się po zakończeniu ostatniego VisitRequest. Jeśli nie określono ani end_waypoint, ani end_location, ShipmentRoute pojazdu kończy się natychmiast po zakończeniu ostatniego VisitRequest. Jeśli model dostawy ma czas trwania i macierze odległości, nie należy określać atrybutu end_waypoint.

start_tags[]

string

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

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

end_tags[]

string

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

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

start_time_windows[]

TimeWindow

Przedziały czasu, w których pojazd może odjeżdżać z lokalizacji początkowej. Muszą one mieścić się w globalnych limitach czasu (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łączone, tj. żadne przedziały czasu nie mogą się pokrywać z innym lub przylegać do niego i muszą być ułożone chronologicznie.

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ą one mieścić się w globalnych limitach czasu (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łączone, tj. żadne przedziały czasu nie mogą się pokrywać z innym lub przylegać do niego i muszą być ułożone chronologicznie.

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

unloading_policy

UnloadingPolicy

Egzekwowana na pojeździe zasada wyładowywania z pamięci.

load_limits

map<string, LoadLimit>

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

cost_per_hour

double

Koszty pojazdu: wszystkie koszty sumują się i muszą mieć taką samą jednostkę jak Shipment.penalty_cost.

Koszt za godzinę trasy pojazdu. Ten koszt jest stosowany do łącznego czasu podróży i obejmuje czas podróży, czas oczekiwania i czas wizyty. Użycie dodatku cost_per_hour zamiast cost_per_traveled_hour może spowodować dodatkowe opóźnienia.

cost_per_traveled_hour

double

Koszt za godzinę przejazdu na trasie pojazdu. Ten koszt jest stosowany tylko do czasu podróży daną trasą (tj. zarejestrowany w: ShipmentRoute.transitions) i nie uwzględnia czasu oczekiwania ani czasu wizyty.

cost_per_kilometer

double

Koszt za kilometr na trasie pojazdu. Ten koszt jest stosowany do odległości podawanej w ShipmentRoute.transitions i nie dotyczy żadnej odległości niejawnie przebytej z arrival_location do departure_location pojedynczego VisitRequest.

fixed_cost

double

Jeśli ten pojazd jest używany do obsługi przesyłki, zostanie zastosowany stały koszt.

used_if_route_is_empty

bool

To pole dotyczy pojazdów tylko wtedy, gdy na trasie nie jest możliwa obsługa przesyłek. Wskazuje, czy w tym przypadku pojazd należy uznać za używany.

Jeśli ma wartość true (prawda), pojazd podróżuje z początku do miejsca docelowego nawet wtedy, gdy nie przyjmuje przesyłek. Pod uwagę brane są też koszty czasu i dystansu wynikające z rozpoczęcia przejazdu –> końcowa podróż.

W przeciwnym razie pojazd nie podróżuje od początku do lokalizacji końcowej, a dla tego pojazdu nie ma zaplanowanego break_rule ani opóźnienia (z TransitionAttributes). W tym przypadku numer ShipmentRoute pojazdu nie zawiera żadnych informacji poza indeksem i etykietą pojazdu.

route_duration_limit

DurationLimit

Limit stosowany do łącznego czasu trwania trasy pojazdu. W przypadku elementu OptimizeToursResponse czas podróży pojazdem jest różnicą między jego wartością vehicle_end_time i vehicle_start_time.

travel_duration_limit

DurationLimit

Limit stosowany do czasu podróży na trasie pojazdu. Czas podróży na trasie dla danego elementu OptimizeToursResponse jest sumą wszystkich wartości tego parametru (transitions.travel_duration).

route_distance_limit

DistanceLimit

Limit dotyczący całkowitej odległości na trasie pojazdu. Odległość trasy dla danego elementu OptimizeToursResponse jest sumą wszystkich wartości transitions.travel_distance_meters tego pola.

extra_visit_duration_for_visit_type

map<string, Duration>

Określa mapę z ciągów znaków visit_types po czasy trwania. Czas trwania jest uzupełniony o czas VisitRequest.duration wykonywany podczas wizyt z określonym visit_types. Ta dodatkowa długość wizyty powoduje naliczanie opłat, jeśli określono cost_per_hour. Klucze (np. visit_types) nie mogą być pustymi ciągami znaków.

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

break_rule

BreakRule

Opisuje harmonogram przerw, który ma być egzekwowany w tym pojeździe. Jeśli pole jest puste, w tym pojeździe nie zostaną zaplanowane żadne przerwy.

label

string

Określa etykietę tego pojazdu. Ta etykieta jest zgłaszana w odpowiedzi jako vehicle_label odpowiedniego elementu ShipmentRoute.

ignore

bool

Jeśli ma wartość Prawda, used_if_route_is_empty musi mieć wartość Fałsz, a pojazd pozostanie nieużywany.

Jeśli przesyłka jest wykonywana przez zignorowany pojazd w injected_first_solution_routes, zostanie ona pominięta w pierwszym rozwiązaniu, ale można ją wykonać bezpłatnie w odpowiedzi.

Jeśli przesyłka jest wykonywana przez zignorowany pojazd w injected_solution_constraint, a wszelkie związane z nim czynności dotyczące odbioru/dostawy muszą pozostać w pojeździe (tj. urządzenie nie może być rozluźnione do poziomu RELAX_ALL_AFTER_THRESHOLD), zostanie ono pominięte w odpowiedzi. Jeśli przesyłka ma niepuste pole allowed_vehicle_indices, a wszystkie dozwolone pojazdy zostały zignorowane, zostanie ona pominięta w odpowiedzi.

travel_duration_multiple

double

Określa mnożnik, który można wykorzystać, aby wydłużyć lub skrócić czas podróży tego pojazdu. Na przykład ustawienie wartości 2,0 oznacza, że pojazd jest wolniejszy i ma czas podróży dwukrotnie dłuższy niż w przypadku standardowych pojazdów. Ta liczba nie ma wpływu na długość wizyty. Ma to wpływ na koszty, jeśli określono cost_per_hour lub cost_per_traveled_hour. Musi mieścić się w zakresie [0,001; 1000,0]. Jeśli nie jest skonfigurowana, pojazd jest standardowy, a ta wielokrotność przyjmuje wartość 1,0.

OSTRZEŻENIE: po zastosowaniu tej wielokrotności czasu podróży czas podróży zostanie zaokrąglony do najbliższej sekundy, ale przed wykonaniem jakichkolwiek operacji liczbowych, dlatego małe wielokrotność 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ć twarde lub miękkie.

Gdy zdefiniowano pole łagodnego limitu, należy zdefiniować razem zarówno próg pozornego limitu, jak i powiązany z nim koszt.

Pola
max_duration

Duration

Sztywny limit ograniczający czas trwania do maksymalnego parametru max_duration.

soft_max_duration

Duration

Poboczny limit nie powoduje egzekwowania maksymalnego czasu trwania, ale w przypadku naruszenia powoduje naliczanie opłat. Ten koszt jest sumowany na inne koszty zdefiniowane w modelu z tą samą jednostką.

Jeśli zostanie zdefiniowana, soft_max_duration musi być nieujemna. Jeśli jest też zdefiniowany parametr max_duration, parametr soft_max_duration musi być krótszy niż max_duration.

quadratic_soft_max_duration

Duration

Poboczny limit nie wymusza maksymalnego czasu trwania, ale w przypadku naruszenia powoduje naliczenie kosztów, których długość jest równa kwadratowemu czasowi. Ten koszt jest sumowany na inne koszty zdefiniowane w modelu z tą samą jednostką.

Jeśli zostanie zdefiniowana, quadratic_soft_max_duration musi być nieujemna. Jeśli określono 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ż 1 dzień:

max_duration - quadratic_soft_max_duration <= 86400 seconds

cost_per_hour_after_soft_max

double

Koszt za godzinę wynikający z naruszenia progu soft_max_duration. Jeśli czas trwania nie przekracza progu, dodatkowy koszt wynosi 0. W przeciwnym razie koszt zależy od czasu trwania w następujący sposób:

  cost_per_hour_after_soft_max * (duration - soft_max_duration)

Koszt nie może być liczbą ujemną.

cost_per_square_hour_after_quadratic_soft_max

double

Koszt za godzinę kwadratową w przypadku naruszenia progu quadratic_soft_max_duration.

Jeśli czas trwania nie przekracza progu, dodatkowy koszt wynosi 0. W przeciwnym razie koszt zależy od czasu trwania w następujący sposób:

  cost_per_square_hour_after_quadratic_soft_max *
  (duration - quadratic_soft_max_duration)^2

Koszt nie może być liczbą ujemną.

LoadLimit

Określa limit ładunku obowiązujący w przypadku pojazdu, np. „Ta ciężarówka może być maks. 3500 kg”. Zobacz load_limits.

Pola
soft_max_load

int64

Niewielka granica obciążenia. Zobacz cost_per_unit_above_soft_max.

cost_per_unit_above_soft_max

double

Jeśli obciążenie przekroczy soft_max_load na trasie tego pojazdu, zostanie zastosowana ta kara (tylko raz na pojazd): (obciążenie – soft_max_load) * cost_per_unit_above_soft_max. Wszystkie koszty sumują się i muszą mieć taką samą jednostkę jak Shipment.penalty_cost.

start_load_interval

Interval

Dopuszczalny odstęp czasu ładowania pojazdu na początku trasy.

end_load_interval

Interval

Dopuszczalny odstęp czasu ładowania pojazdu na końcu trasy.

max_load

int64

Maksymalna akceptowalna ilość obciążenia.

Odstęp

Przedział czasu obciążenia akceptowalnego obciążenia.

Pola
min

int64

Minimalne akceptowalne obciążenie. Musi wynosić ≥ 0. Jeśli podasz oba, min musi mieć wartość ≤ max.

max

int64

Maksymalne akceptowane obciążenie. Musi wynosić ≥ 0. Jeśli nie określono inaczej, maksymalne obciążenie nie jest ograniczone przez ten komunikat. Jeśli podasz oba, min musi mieć wartość ≤ max.

TravelMode

Środki transportu dostępne dla pojazdów.

Powinien to być podzbiór trybów podróży preferowanego interfejsu API Google Maps Platform Routes. Więcej informacji znajdziesz na stronie 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 trasom pieszym.

UnloadingPolicy

Zasady dotyczące sposobu wyładowywania pojazdu. Dotyczy to tylko przesyłek obejmujących zarówno odbiór, jak i dostawę.

Inne dostawy są bezpłatne w dowolnym miejscu na trasie, niezależnie od: unloading_policy.

Wartości w polu enum
UNLOADING_POLICY_UNSPECIFIED Nieokreślone zasady wyładowywania – dostawy muszą następować zaraz po ich odbiorze.
LAST_IN_FIRST_OUT Dostawy muszą mieć odwrotną kolejność
FIRST_IN_FIRST_OUT Dostawy muszą mieć miejsce w tym samym zamówieniu co odbiór

Punkt pośredni

Obejmuje punkt pośredni. Punkty pośrednie oznaczają lokalizacje przyjazdu i odjazdu oraz lokalizację początkową i końcową pojazdów.

Pola
side_of_road

bool

Opcjonalnie. Wskazuje, że lokalizacja tego punktu pośredniego ma umożliwiać zatrzymywanie pojazdu po określonej stronie drogi. Po ustawieniu tej wartości trasa przechodzi przez daną lokalizację, dzięki czemu pojazd może się zatrzymać na boku drogi, na którą kierowana jest ta lokalizacja, od środka drogi. Ta opcja nie działa w trybie podróży „PIESZ”.

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

Location

Punkt określony za pomocą współrzędnych geograficznych, wraz z opcjonalnym nagłówkiem.

place_id

string

Identyfikator miejsca POI powiązany z punktem na trasie.