Package google.maps.routeoptimization.v1

Indeks

RouteOptimization

Usługa optymalizacji wycieczek samochodowych.

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

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

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

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

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

Zakresy autoryzacji

Wymaga następującego zakresu OAuth:

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

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

Wysyła OptimizeToursRequest z ShipmentModel i zwraca OptimizeToursResponse zawierający ShipmentRoute, czyli zestaw tras, które mają wykonać pojazdy minimalizujące całkowity koszt.

Model ShipmentModel składa się głównie z Shipmentzasobów, które mają zostać wykonane, oraz Vehicleelementów, które można wykorzystać do transportu Shipment. Elementy typu ShipmentRoute przypiszą elementy Shipment do elementów Vehicle. Dokładniej rzecz ujmując, do każdego pojazdu przypisywane są ciągi Visit, gdzie Visit odpowiada elementowi VisitRequest oznaczającemu odbiór lub dostawę w przypadku Shipment.

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

Zakresy autoryzacji

Wymaga następującego zakresu OAuth:

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

AggregatedMetrics

Zbiorcze dane dotyczące wskaźnika ShipmentRoute (odpowiada dla OptimizeToursResponse dla wszystkich elementów Transition lub Visit (odp. dla wszystkich elementów ShipmentRoute).

Pola
performed_shipment_count

int32

Liczba zrealizowanych przesyłek. Pamiętaj, że para odbioru i dostawy liczy się tylko raz.

travel_duration

Duration

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

wait_duration

Duration

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

delay_duration

Duration

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

break_duration

Duration

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

visit_duration

Duration

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

total_duration

Duration

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

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

double

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

max_loads

map<string, VehicleLoad>

Maksymalne obciążenie osiągnięte na całej trasie (rozwiązanie odpowiedzi) dla każdej wielkości na tej trasie (rozwiązanie odpowiedzi), obliczone jako maksymalna wartość na całej trasie Transition.vehicle_loads (odp. ShipmentRoute.metrics.max_loads.

BatchOptimizeToursMetadata

Ten typ nie zawiera pól.

Metadane operacji dotyczące BatchOptimizeToursRequest wywołań.

BatchOptimizeToursRequest

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

Pola
parent

string

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

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

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

model_configs[]

AsyncModelConfig

Wymagane. Informacje wejściowe/wyjściowe dla każdego modelu zakupu, np. ścieżki plików i formaty danych.

AsyncModelConfig

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

Pola
display_name

string

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

input_config

InputConfig

Wymagane. Informacje o modelu wejściowym.

output_config

OutputConfig

Wymagane. Wymagane informacje o lokalizacji wyjściowej.

BatchOptimizeToursResponse

Ten typ nie zawiera pól.

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

BreakRule

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

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

BreakRequest

Kolejność przerw. Zobacz wiadomość: BreakRequest.

frequency_constraints[]

FrequencyConstraint

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

BreakRequest

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

Pola
earliest_start_time

Timestamp

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

latest_start_time

Timestamp

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

min_duration

Duration

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

FrequencyConstraint

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

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

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

FrequencyConstraint może w praktyce mieć zastosowanie do przerw, które nie następują po sobie. Na przykład ten harmonogram uwzględnia zasadę „1 godz. co 12 godz.” przykład:

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

Duration

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

max_inter_break_duration

Duration

Wymagane. Maksymalny dozwolony zakres czasu trwania dowolnego przedziału czasu na trasie, który nie zawiera przynajmniej częściowej przerwy wynoszącej duration >= min_break_duration. Musi być liczbą dodatnią.

DataFormat

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

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

DistanceLimit

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

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

Pola
max_meters

int64

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

soft_max_meters

int64

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

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

cost_per_kilometer_above_soft_max

double

Koszt za kilometr naliczany, jeśli odległość przekracza limit soft_max_meters. Koszt dodatkowy wynosi 0, jeśli odległość nie mieści się w limicie. W przeciwnym razie formuła służąca do obliczania kosztu jest następująca:

  (distance_meters - soft_max_meters) / 1000.0 *
  cost_per_kilometer_above_soft_max.

Koszt nie może być ujemny.

GcsDestination

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

Pola
uri

string

Wymagane. Identyfikator URI obiektu w Google Cloud Storage.

GcsSource

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

Pola
uri

string

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

InjectedSolutionConstraint

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

Pola
routes[]

ShipmentRoute

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

skipped_shipments[]

SkippedShipment

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

constraint_relaxations[]

ConstraintRelaxation

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

ConstraintRelaxation

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

Pola
relaxations[]

Relaxation

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

vehicle_indices[]

int32

Określa indeksy pojazdów, do których ma zastosowanie ograniczenie wizyty relaxations. Jeśli pole jest puste, jest uznawane za wartość domyślną, a relaxations ma zastosowanie do wszystkich pojazdów, które nie zostały określone w innych polach constraint_relaxations. Może być maksymalnie 1 wartość domyślna, tzn. maksymalnie 1 pole relaksacji ograniczenia jest puste vehicle_indices. Indeks pojazdu może być wymieniony tylko raz, nawet w obrębie kilku constraint_relaxations.

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

Relaks

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

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

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

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

  • vehicle_start_time >= relaxations(i).threshold_time ORAZ
  • relaxations(i).threshold_visit_count == 0, a koniec pojazdu jest ustawiony na relaxations(i).level, jeśli są spełnione:
  • vehicle_end_time >= relaxations(i).threshold_time ORAZ
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

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

Czas i sekwencja wizyt na trasie, które nie spełniają warunków progu żadnego z relaxations, są w pełni ograniczone i nie można do nich dodawać żadnych wizyt. Ponadto, jeśli początek lub koniec pojazdu nie spełnia warunków relaksacji, czas jest ustalony, chyba że pojazd jest pusty.

Pola
level

Level

Poziom złagodzenia ograniczeń stosowany, gdy spełnione są warunki na poziomie threshold_time lub później ORAZ co najmniej threshold_visit_count.

threshold_time

Timestamp

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

threshold_visit_count

int32

Liczba wizyt, podczas których lub po upływie których może zostać zastosowane złagodzenie level. Jeśli zasada threshold_visit_count ma wartość 0 (lub jest nieskonfigurowana), zasada level może zostać zastosowana bezpośrednio przy uruchamianiu pojazdu.

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

Poziom

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

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

Wartości w polu enum
LEVEL_UNSPECIFIED

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

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

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

InputConfig

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

Pola
data_format

DataFormat

Wymagane. Format danych wejściowych.

Pole sumy source. Wymagane. source może mieć 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

Nagłówek kompasu powiązany z kierunkiem ruchu. Ta wartość służy do określania strony drogi na potrzeby odbioru i dostawy. Wartości nagłówka mogą należeć do zakresu od 0 do 360, gdzie 0 oznacza kierunek północny, 90 oznacza kierunek kierunku północnego itd.

OptimizeToursRequest

Prośba o przekazanie do rozwiązania optymalizacyjnego wycieczki, które określa model dostawy do rozwiązania oraz parametry optymalizacji.

Pola
parent

string

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

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

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

timeout

Duration

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

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

model

ShipmentModel

Model dostawy do rozwiązania.

solving_mode

SolvingMode

Domyślnie ustawiony jest tryb zadań DEFAULT_SOLVE (0).

search_mode

SearchMode

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

injected_first_solution_routes[]

ShipmentRoute

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

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

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

  • w przypadku wszystkich tras vehicle_index musi należeć do zakresu i nie może się powtarzać.
  • dla wszystkich wizyt shipment_index i visit_request_index muszą się mieścić w zakresie.
  • dostawa może być wskazana tylko na jednej trasie.
  • Odbiór przesyłki z odbiorem lub dostawą musi zostać zrealizowany przed dostawą.
  • nie można wybrać więcej niż jednej opcji odbioru lub dostawy będącej alternatywą dla dostawy.
  • dla wszystkich tras wydłuża się (np. vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time).
  • wysyłka może zostać zrealizowana wyłącznie za pomocą dozwolonego pojazdu. Pojazd jest dozwolony, jeśli pole Shipment.allowed_vehicle_indices jest puste lub jego vehicle_index znajduje się w: Shipment.allowed_vehicle_indices.

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

injected_solution_constraint

InjectedSolutionConstraint

Ogranicz algorytm optymalizacji, aby znaleźć ostateczne rozwiązanie podobne do poprzedniego. Na przykład tej opcji można użyć do zablokowania części tras, które zostały już zakończone lub są jeszcze zakończone, ale nie można ich modyfikować.

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

refresh_details_routes[]

ShipmentRoute

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

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

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

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

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

interpret_injected_solutions_using_labels

bool

Jeśli ma wartość prawda:

Ta interpretacja ma zastosowanie do pól injected_first_solution_routes, injected_solution_constraint i refresh_details_routes. Możesz go użyć, gdy indeksy przesyłek lub pojazdów w żądaniu uległy zmianie od czasu utworzenia rozwiązania, na przykład dlatego, że przesyłki lub pojazdy zostały usunięte z zgłoszenia lub dodane do niego.

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

Jeśli wartość vehicle_label we wstrzykiwanym roztworze nie odpowiada pojazdowi, którego dotyczy żądanie, odpowiednia trasa jest usuwana z rozwiązania razem z wizytami. Jeśli wartość shipment_label we wstrzykiwanym rozwiązaniu nie odpowiada wysyłce żądania, odpowiednia wizyta zostanie usunięta z rozwiązania. Jeśli wartość SkippedShipment.label we wstrzykiwanym rozwiązaniu nie odpowiada dostawie żądania, SkippedShipment jest usuwany z rozwiązania.

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

UWAGA: rozmówca musi upewnić się, że każde Vehicle.label (odp. Shipment.label) jednoznacznie identyfikuje pojazd (odpowiedź do przesyłki) użyty w 2 odpowiednich żądaniach: wcześniejsze żądanie, które spowodowało wygenerowanie kodu OptimizeToursResponse użytego we wstrzykiwanym roztworze, oraz bieżące żądanie, które obejmuje wstrzykiwany roztwór. Opisane powyżej testy niepowtarzalności nie wystarczają do zagwarantowania tego wymogu.

consider_road_traffic

bool

Przy obliczaniu obliczania pól ShipmentRoute Transition.travel_duration, Visit.start_time i vehicle_end_time weź pod uwagę oszacowanie ruchu; w ustawieniach pola ShipmentRoute.has_traffic_infeasibilities oraz obliczaniu pola OptimizeToursResponse.total_cost.

populate_polylines

bool

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

populate_transition_polylines

bool

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

allow_large_deadline_despite_interruption_risk

bool

Jeśli ta opcja jest ustawiona, termin żądania (patrz https://grpc.io/blog/deadlines) może wynosić maksymalnie 60 minut. W przeciwnym razie maksymalny termin to tylko 30 minut. Pamiętaj, że żądania długotrwałe wiążą się ze znacznie większym (ale i mniejszym) ryzykiem przerw w działaniu.

use_geodesic_distances

bool

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

label

string

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

geodesic_meters_per_second

double

Jeśli use_geodesic_distances ma wartość true (prawda), to pole musi być skonfigurowane i określa prędkość używaną do obliczania czasu podróży. Musi wynosić co najmniej 1 metr/s.

max_validation_errors

int32

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

SearchMode

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

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

SolvingMode

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

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

Wypełnia tylko OptimizeToursResponse.validation_errors lub OptimizeToursResponse.skipped_shipments i nie rozwiązuje innych problemów (status i routes w odpowiedzi nie są skonfigurowane). Jeśli zostaną wykryte problemy na trasach (injected_solution_constraint), zostaną one wypełnione w polu OptimizeToursResponse.validation_errors, a pole OptimizeToursResponse.skipped_shipments pozostanie puste.

WAŻNE: w tym miejscu zwracane są nie wszystkie niemożliwe do zrealizowania przesyłki, a jedynie te, które podczas wstępnego przetwarzania zostały uznane za niemożliwe.

OptimizeToursResponse

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

Pola
routes[]

ShipmentRoute

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

request_label

string

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

skipped_shipments[]

SkippedShipment

Lista wszystkich pominiętych przesyłek.

validation_errors[]

OptimizeToursValidationError

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

metrics

Metrics

Czas trwania, odległość i wskaźniki wykorzystania w tym rozwiązaniu.

Dane

Zbiorcze wskaźniki, zagregowane dla wszystkich tras.

Pola
aggregated_route_metrics

AggregatedMetrics

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

skipped_mandatory_shipment_count

int32

Liczba pominiętych przesyłek obowiązkowych.

used_vehicle_count

int32

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

earliest_vehicle_start_time

Timestamp

Najwcześniejszy czas uruchomienia używanego pojazdu, obliczany jako minimum dla wszystkich używanych pojazdów w okresie ShipmentRoute.vehicle_start_time.

latest_vehicle_end_time

Timestamp

Najnowsza godzina zakończenia działania używanego pojazdu, obliczana jako maksymalna liczba wszystkich używanych pojazdów w okresie ShipmentRoute.vehicle_end_time.

costs

map<string, double>

Koszt rozwiązania z podziałem na pola żądania związane z kosztami. Klucze to ścieżki proto, względem danych wejściowych OptimizeToursRequest, np. „model.shipments.pickups.cost”, a wartości to łą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 ramach danego rozwiązania. Wszystkie koszty zdefiniowane w modelu są uwzględnione w szczegółowym raporcie z wyjątkiem kosztów związanych z atrybutami przejścia, które od 2022 roku są raportowane tylko w postaci zbiorczej.

total_cost

double

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

OptimizeToursValidationError

Opisuje błąd, który wystąpił podczas weryfikowania elementu OptimizeToursRequest.

Pola
code

int32

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

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

WIELU BŁĘDÓW: jeśli wystąpiło wiele błędów, proces weryfikacji próbuje zwrócić kilka z nich. Ten proces, podobnie jak w przypadku kompilatora, nie jest idealny. Niektóre błędy weryfikacji są „krytyczne”, co oznacza, że zatrzymują cały proces weryfikacji. Dotyczy to między innymi display_name="UNSPECIFIED" błędów. Niektóre z nich mogą spowodować pominięcie innych błędów podczas weryfikacji.

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

REFERENCYJNE: lista wszystkich par (kod, nazwa):

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

    • REQUEST_OPTIONS_INVALID_SOLVING_MODE = 1201;
    • REQUEST_OPTIONS_INVALID_MAX_VALIDATION_ERRORS = 1203;
    • REQUEST_OPTIONS_INVALID_GEODESIC_METERS_PER_SECOND = 1204;
    • REQUEST_OPTIONS_GEODESIC_METERS_PER_SECOND_TOO_SMALL = 1205;
    • REQUEST_OPTIONS_MISSING_GEODESIC_METERS_PER_SECOND = 1206;
    • REQUEST_OPTIONS_POPULATE_PATHFINDER_TRIPS_AND_GEODESIC_DISTANCE = 1207;
    • REQUEST_OPTIONS_COST_MODEL_OPTIONS_AND_GEODESIC_DISTANCE = 1208;
    • REQUEST_OPTIONS_TRAVEL_MODE_INCOMPATIBLE_WITH_TRAFFIC = 1211;
    • REQUEST_OPTIONS_MULTIPLE_TRAFFIC_FLAVORS = 1212;
    • REQUEST_OPTIONS_INVALID_TRAFFIC_FLAVOR = 1213;
    • REQUEST_OPTIONS_TRAFFIC_ENABLED_WITHOUT_GLOBAL_START_TIME = 1214;
    • REQUEST_OPTIONS_TRAFFIC_ENABLED_WITH_PRECEDENCES = 1215;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_MODE_Nieprawidłowy = 1216;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_ENABLED_WITHOUT_TRAFFIC = 1217;
  • INJECTED_SOLUTION_ERROR = 20;
    • INJECTED_SOLUTION_MISSING_LABEL = 2000;
    • INJECTED_SOLUTION_DUPLICATE_LABEL = 2001;
    • INJECTED_SOLUTION_AMBIGUOUS_INDEX = 2002;
    • INJECTED_SOLUTION_INFEASIBLE_AFTER_GETTING_TRAVEL_TIMES = 2003;
    • INJECTED_SOLUTION_TRANSITION_INCONSISTENT_WITH_ACTUAL_TRAVEL = 2004;
    • INJECTED_SOLUTION_CONCURRENT_SOLUTION_TYPES = 2005;
    • INJECTED_SOLUTION_MORE_THAN_ONE_PER_TYPE = 2006;
    • INJECTED_SOLUTION_REFRESH_WITHOUT_POPULATE = 2008;
    • INJECTED_SOLUTION_CONSTRAINED_ROUTE_PORTION_INFEASIBLE = 2010;
  • SHIPMENT_MODEL_ERROR = 22;
    • SHIPMENT_MODEL_TOO_LARGE = 2200;
    • SHIPMENT_MODEL_TOO_MANY_CAPACITY_TYPES = 2201;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_NEGATIVE_OR_NAN = 2202;
    • SHIPMENT_MODEL_GLOBAL_END_TIME_TOO_LARGE_OR_NAN = 2203;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_AFTER_GLOBAL_END_TIME = 2204;
    • SHIPMENT_MODEL_GLOBAL_DURATION_TOO_LONG = 2205;
    • SHIPMENT_MODEL_MAX_ACTIVE_VEHICLES_NOT_POSITIVE = 2206;
    • SHIPMENT_MODEL_DURATION_MATRIX_TOO_LARGE = 2207;
  • INDEX_ERROR = 24;
  • TAG_ERROR = 26;
  • TIME_WINDOW_ERROR = 28;
    • TIME_WINDOW_INVALID_START_TIME = 2800;
    • TIME_WINDOW_INVALID_END_TIME = 2801;
    • TIME_WINDOW_INVALID_SOFT_START_TIME = 2802;
    • TIME_WINDOW_INVALID_SOFT_END_TIME = 2803;
    • TIME_WINDOW_OUTSIDE_GLOBAL_TIME_WINDOW = 2804;
    • TIME_WINDOW_START_TIME_AFTER_END_TIME = 2805;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_BEFORE_SOFT_START_TIME = 2806;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_AFTER_SOFT_END_TIME = 2807;
    • TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_WITHOUT_SOFT_START_TIME = 2808;
    • TIME_WINDOW_COST_AFTER_SOFT_END_TIME_WITHOUT_SOFT_END_TIME = 2809;
    • TIME_WINDOW_SOFT_START_TIME_WITHOUT_COST_BEFORE_SOFT_START_TIME = 2810;
    • TIME_WINDOW_SOFT_END_TIME_WITHOUT_COST_AFTER_SOFT_END_TIME = 2811;
    • TIME_WINDOW_OVERLAPPING_ADJACENT_OR_EARLIER_THAN_PREVIOUS = 2812;
    • TIME_WINDOW_START_TIME_AFTER_SOFT_START_TIME = 2813;
    • TIME_WINDOW_SOFT_START_TIME_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_INVALID_COST_PER_KILOMETER = 3001;
    • TRANSITION_ATTRIBUTES_DUPLICATE_TAG_PAIR = 3002;
    • TRANSITION_ATTRIBUTES_DISTANCE_LIMIT_MAX_METERS_UNSUPPORTED = 3003;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_SOURCE_TAGS = 3004;
    • TRANSITION_ATTRIBUTES_CONFLICTING_SOURCE_TAGS_FIELDS = 3005;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_DESTINATION_TAGS = 3006;
    • TRANSITION_ATTRIBUTES_CONFLICTING_DESTINATION_TAGS_FIELDS = 3007;
    • TRANSITION_ATTRIBUTES_MAX_DURATION_NEGATIVE_OR_NAN = 3008;
    • TRANSITION_ATTRIBUTES_DELAY_DURATION_EXCEEDS_GLOBAL_DURATION = 3009;
  • AMOUNT_ERROR = 31;
    • AMOUNT_NEGATIVE_VALUE = 3100;
  • LOAD_LIMIT_ERROR = 33;
    • LOAD_LIMIT_INVALID_COST_ABOVE_SOFT_MAX = 3303;
    • LOAD_LIMIT_SOFT_MAX_WITHOUT_COST_ABOVE_SOFT_MAX = 3304;
    • LOAD_LIMIT_COST_ABOVE_SOFT_MAX_WITHOUT_SOFT_MAX = 3305;
    • LOAD_LIMIT_NEGATIVE_SOFT_MAX = 3306;
    • LOAD_LIMIT_MIXED_DEMAND_TYPE = 3307;
    • LOAD_LIMIT_MAX_LOAD_NEGATIVE_VALUE = 3308;
    • LOAD_LIMIT_SOFT_MAX_ABOVE_MAX = 3309;
  • INTERVAL_ERROR = 34;
    • INTERVAL_MIN_EXCEEDS_MAX = 3401;
    • INTERVAL_NEGATIVE_MIN = 3402;
    • INTERVAL_NEGATIVE_MAX = 3403;
    • INTERVAL_MIN_EXCEEDS_CAPACITY = 3404;
    • INTERVAL_MAX_EXCEEDS_CAPACITY = 3405;
  • DISTANCE_LIMIT_ERROR = 36;
    • DISTANCE_LIMIT_INVALID_COST_AFTER_SOFT_MAX = 3601;
    • DISTANCE_LIMIT_SOFT_MAX_WITHOUT_COST_AFTER_SOFT_MAX = 3602;
    • DISTANCE_LIMIT_COST_AFTER_SOFT_MAX_WITHOUT_SOFT_MAX = 3603;
    • DISTANCE_LIMIT_NEGATIVE_MAX = 3604;
    • DISTANCE_LIMIT_NEGATIVE_SOFT_MAX = 3605;
    • DISTANCE_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3606;
  • DURATION_LIMIT_ERROR = 38;
    • DURATION_LIMIT_MAX_DURATION_NEGATIVE_OR_NAN = 3800;
    • DURATION_LIMIT_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3801;
    • DURATION_LIMIT_INVALID_COST_PER_HOUR_AFTER_SOFT_MAX = 3802;
    • DURATION_LIMIT_SOFT_MAX_WITHOUT_COST_AFTER_SOFT_MAX = 3803;
    • DURATION_LIMIT_COST_AFTER_SOFT_MAX_WITHOUT_SOFT_MAX = 3804;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3805;
    • DURATION_LIMIT_INVALID_COST_AFTER_QUADRATIC_SOFT_MAX = 3806;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_COST_PER_SQUARE_HOUR = 3807;
    • DURATION_LIMIT_COST_PER_SQUARE_HOUR_WITHOUT_QUADRATIC_SOFT_MAX = 3808;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_MAX = 3809;
    • DURATION_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3810;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_LARGER_THAN_MAX = 3811;
    • DURATION_LIMIT_DIST_BETWEEN_MAX_AND_QUADRATIC_SOFT_MAX_TOO_LARGE = 3812;
    • DURATION_LIMIT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3813;
    • DURATION_LIMIT_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3814;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3815;
  • SHIPMENT_ERROR = 40;
    • SHIPMENT_PD_LIMIT_WITHOUT_PICKUP_AND_DELIVERY = 4014;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_NEGATIVE_OR_NAN = 4000;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4001;
    • SHIPMENT_PD_RELATIVE_DETOUR_LIMIT_INVALID = 4015;
    • SHIPMENT_PD_DETOUR_LIMIT_AND_EXTRA_VISIT_DURATION = 4016;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_NEGATIVE_OR_NAN = 4002;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4003;
    • SHIPMENT_EMPTY_SHIPMENT_TYPE = 4004;
    • SHIPMENT_NO_PICKUP_NO_DELIVERY = 4005;
    • SHIPMENT_INVALID_PENALTY_COST = 4006;
    • SHIPMENT_ALLOWED_VEHICLE_INDEX_OUT_OF_BOUNDS = 4007;
    • SHIPMENT_DUPLICATE_ALLOWED_VEHICLE_INDEX = 4008;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITHOUT_INDEX = 4009;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITH_INDEX = 4010;
    • SHIPMENT_INVALID_COST_FOR_VEHICLE = 4011;
    • SHIPMENT_COST_FOR_VEHICLE_INDEX_OUT_OF_BOUNDS = 4012;
    • SHIPMENT_DUPLICATE_COST_FOR_VEHICLE_INDEX = 4013;
  • VEHICLE_ERROR = 42;
    • VEHICLE_EMPTY_REQUIRED_OPERATOR_TYPE = 4200;
    • VEHICLE_DUPLICATE_REQUIRED_OPERATOR_TYPE = 4201;
    • VEHICLE_NO_OPERATOR_WITH_REQUIRED_OPERATOR_TYPE = 4202;
    • VEHICLE_EMPTY_START_TAG = 4203;
    • VEHICLE_DUPLICATE_START_TAG = 4204;
    • VEHICLE_EMPTY_END_TAG = 4205;
    • VEHICLE_DUPLICATE_END_TAG = 4206;
    • VEHICLE_EXTRA_VISIT_DURATION_NEGATIVE_OR_NAN = 4207;
    • VEHICLE_EXTRA_VISIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4208;
    • VEHICLE_EXTRA_VISIT_DURATION_EMPTY_KEY = 4209;
    • VEHICLE_FIRST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4210;
    • VEHICLE_FIRST_SHIPMENT_IGNORED = 4211;
    • VEHICLE_FIRST_SHIPMENT_NOT_BOUND = 4212;
    • VEHICLE_LAST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4213;
    • VEHICLE_LAST_SHIPMENT_IGNORED = 4214;
    • VEHICLE_LAST_SHIPMENT_NOT_BOUND = 4215;
    • VEHICLE_IGNORED_WITH_USED_IF_ROUTE_IS_EMPTY = 4216;
    • VEHICLE_INVALID_COST_PER_KILOMETER = 4217;
    • VEHICLE_INVALID_COST_PER_HOUR = 4218;
    • VEHICLE_INVALID_COST_PER_TRAVELED_HOUR = 4219;
    • VEHICLE_INVALID_FIXED_COST = 4220;
    • VEHICLE_INVALID_TRAVEL_DURATION_MULTIPLE = 4221;
    • VEHICLE_TRAVEL_DURATION_MULTIPLE_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4223;
    • VEHICLE_MATRIX_INDEX_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4224;
    • VEHICLE_MINIMUM_DURATION_LONGER_THAN_DURATION_LIMIT = 4222;
  • VISIT_REQUEST_ERROR = 44;
    • VISIT_REQUEST_EMPTY_TAG = 4400;
    • VISIT_REQUEST_DUPLICATE_TAG = 4401;
    • VISIT_REQUEST_DURATION_NEGATIVE_OR_NAN = 4404;
    • VISIT_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4405;
  • PRECEDENCE_ERROR = 46;
  • 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. W przypadku np. w przypadku pojazdu nr 4 i pierwszej dostawy nr 2 można wykonać te czynności:

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

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

error_message

string

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

Stabilność: niestabilna: komunikat o błędzie powiązany z danym parametrem code może się z czasem zmienić (być może został wyjaśniony). Zamiast nich korzystaj z tych zasad: display_name i code.

offending_values

string

Może zawierać wartości pól. Nie zawsze jest to możliwe. Nie należy polegać wyłącznie na tym narzędziu i używać go wyłącznie do ręcznego debugowania modelu.

FieldReference

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

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

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

Pola
name

string

Nazwa pola, np. „pojazdy”.

sub_field

FieldReference

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

Pole sumy index_or_key.

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

index

int32

Indeks pola, jeśli się powtarza.

key

string

Klucz, jeśli pole jest mapą.

OutputConfig

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

Pola
data_format

DataFormat

Wymagane. Format danych wyjściowych.

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

GcsDestination

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

Wysyłka

Dostawa pojedynczego produktu, od odbioru do jednej dostawy. Aby przesyłka została uznana za wykonaną, unikalny pojazd musi odwiedzić jedno z miejsc odbioru (i odpowiednio zmniejszyć ilość zapasowego), a następnie odwiedzić jedno z miejsc dostawy (i w związku z tym odpowiednio zwiększyć pojemność zapasową).

Pola
display_name

string

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

pickups[]

VisitRequest

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

deliveries[]

VisitRequest

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

load_demands

map<string, Load>

Obciążenie przesyłki (np. waga, objętość, liczba palet itd.). Klucze na mapie powinny być identyfikatorami opisującymi rodzaj danego obciążenia, najlepiej uwzględniając też jednostki. Na przykład: „weight_kg”, „volume_gallons”, „pallet_count” itp. Jeśli dany klucz nie pojawi się na mapie, odpowiadające mu obciążenie zostanie uznane za puste.

allowed_vehicle_indices[]

int32

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

costs_per_vehicle[]

double

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

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

Koszty muszą być podane w tej samej jednostce co penalty_cost i nie mogą być ujemne. Pozostaw to pole puste, jeśli nie ma takich kosztów.

costs_per_vehicle_indices[]

int32

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

pickup_to_delivery_absolute_detour_limit

Duration

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

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

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

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

pickup_to_delivery_time_limit

Duration

Określa maksymalny czas trwania od rozpoczęcia odbioru do rozpoczęcia dostawy. Jeśli jest określona, nie może być ujemna, a przesyłka musi zawierać co najmniej informacje o odbiorze i dostawie. Nie zależy to od tego, które alternatywne rozwiązania zostaną wybrane do odbioru i dostawy, ani od szybkości pojazdu. Można to określić razem z maksymalnymi ograniczeniami objazdu, ponieważ rozwiązanie będzie przestrzegać obu specyfikacji.

shipment_type

string

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

Różni się od visit_types, który jest określony dla pojedynczej wizyty: wszystkie odbioru/dostawy należące do tej samej przesyłki korzystają z tego samego identyfikatora shipment_type.

label

string

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

ignore

bool

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

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

Dopuszczalne jest ignorowanie wysyłki w injected_first_solution_routes lub injected_solution_constraint. usunie z tej trasy powiązane wizyty związane z odbiorem/dostawą. 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, kara zostanie dodana do całkowitego kosztu tras. Wysyłka jest uznawana za zrealizowaną, jeśli dostępna jest jedna z alternatywnych opcji odbioru lub dostawy. Koszt może być wyrażony w tej samej jednostce, która jest używana we wszystkich innych polach związanych z kosztem w modelu, i musi być dodatni.

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

pickup_to_delivery_relative_detour_limit

double

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

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

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

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

Wczytaj

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

Pola
amount

int64

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

VisitRequest

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

Pola
arrival_location

LatLng

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

arrival_waypoint

Waypoint

Punkt pośredni, do którego przyjeżdża pojazd, wykonując tę czynność VisitRequest. Jeśli model dostawy zawiera macierze odległości między czasem trwania, nie można podawać wartości arrival_waypoint.

departure_location

LatLng

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

departure_waypoint

Waypoint

Punkt pośredni, do którego odjeżdża pojazd po ukończeniu tego celu: VisitRequest. Tę wartość można pominąć, jeśli jest taka sama jak arrival_waypoint. Jeśli model dostawy zawiera macierze odległości między czasem trwania, nie można podawać wartości departure_waypoint.

tags[]

string

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

time_windows[]

TimeWindow

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

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

Przedziały czasu muszą być rozłączne, tzn. żadne przedziały czasu nie mogą na siebie nachodzić ani przylegać do siebie, a także muszą rosnąć.

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, tj. czas spędzony w samochodzie między przyjazdem a odjazdem (należy dodać do możliwego czasu oczekiwania; patrz time_windows).

cost

double

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

load_demands

map<string, Load>

Wczytywanie żądań dotyczących tej wizyty. Działa ono tak samo jak pole Shipment.load_demands z tą różnicą, że dotyczy tylko tego pola VisitRequest, a nie całego pola Shipment. Wymienione tutaj żądania zostaną dodane do żądań wymienionych w sekcji Shipment.load_demands.

visit_types[]

string

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

Typ może się pojawić tylko raz.

label

string

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

ShipmentModel

Model dostawy obejmuje zestaw dostaw, który musi być realizowany przez zestaw pojazdów przy minimalizacji całkowitego kosztu, który jest sumą:

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

Shipment

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

vehicles[]

Vehicle

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

global_start_time

Timestamp

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

Przedział czasu modelu musi być krótszy niż rok, tzn. czas global_end_time i global_start_time muszą być oddalone od siebie o maksymalnie 315 36 000 sekund.

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

global_end_time

Timestamp

Jeśli nie jest ustawiona, domyślnie używana jest wartość 00:00:00 UTC, 1 stycznia 1971 r. (tzn. sekund: 31536000, nanos: 0).

global_duration_cost_per_hour

double

„Globalny czas trwania” całego planu to różnica między najwcześniejszym rzeczywistym godzinem rozpoczęcia a najpóźniejszą obowiązującą godziną zakończenia wszystkich pojazdów. Użytkownicy mogą przypisać kosztowi godzinowemu temu rodzajowi konwersji, aby np. zoptymalizować kampanię pod kątem najwcześniejszego realizacji zadania. Ten koszt musi być w tej samej jednostce co Shipment.penalty_cost.

duration_distance_matrices[]

DurationDistanceMatrix

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

Przykłady użycia:

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

string

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

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

duration_distance_matrix_dst_tags[]

string

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

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

transition_attributes[]

TransitionAttributes

Atrybuty przejścia zostały dodane do modelu.

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

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

shipment_type_requirements[]

ShipmentTypeRequirement

Zestawy wymagań shipment_type (patrz ShipmentTypeRequirement).

precedence_rules[]

PrecedenceRule

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

max_active_vehicles

int32

Ogranicza maksymalną liczbę aktywnych pojazdów. Pojazd jest aktywny, jeśli na trasie jest realizowana co najmniej 1 dostawa. Pozwala to ograniczyć liczbę tras w sytuacjach, gdy kierowców jest mniej niż pojazdów, a flota jest heterogeniczna. Optymalizacja wybierze najlepszy podzbiór pojazdów do użycia. Musi być wyłącznie dodatnia.

DurationDistanceMatrix

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

Pola
rows[]

Row

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

vehicle_start_tag

string

Tag definiujący, do których pojazdów ma zastosowanie dany czas trwania i tablica odległości. Jeśli pole jest puste, dotyczy to wszystkich pojazdów i może zawierać tylko jedną macierz.

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

Wszystkie macierze muszą mieć inny element vehicle_start_tag.

Wiersz

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

Pola
durations[]

Duration

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

meters[]

double

Wartości odległości w danym wierszu. Jeśli brak kosztów lub ograniczeń odnosi się do odległości w modelu, to pole może pozostać puste; w przeciwnym razie musi mieć tyle elementów, co durations.

PrecedenceRule

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

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

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

Pola
first_is_delivery

bool

Wskazuje, czy „pierwszy” zdarzenie to dostawa.

second_is_delivery

bool

Wskazuje, czy parametr „second” zdarzenie to dostawa.

offset_duration

Duration

Przesunięcie między pierwszą wartością i „drugi” . Wynik może być ujemny.

first_index

int32

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

second_index

int32

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

ShipmentRoute

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

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

Trzeba pamiętać, że:

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

Niezmienniki:

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

Gdy powiększasz widok, pokazujemy, co się dzieje podczas wyświetlania elementów 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

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

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

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

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

int32

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

vehicle_label

string

Etykieta pojazdu poruszającego się po tej trasie, równa ShipmentModel.vehicles(vehicle_index).label, jeśli została określona.

vehicle_start_time

Timestamp

Godzina, o której pojazd rozpoczyna trasę.

vehicle_end_time

Timestamp

Czas zakończenia trasy przez pojazd.

visits[]

Visit

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

transitions[]

Transition

Uporządkowana lista przejść na trasie.

has_traffic_infeasibilities

bool

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

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

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

route_polyline

EncodedPolyline

Zakodowana reprezentacja trasy w postaci linii łamanej. To pole jest wypełniane tylko wtedy, gdy OptimizeToursRequest.populate_polylines ma wartość true (prawda).

breaks[]

Break

Przerwy zaplanowane dla pojazdu na tej trasie. Sekwencja breaks przedstawia przedziały czasowe. Każdy z nich rozpoczyna się w odpowiednim momencie start_time i trwa duration s.

metrics

AggregatedMetrics

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

route_costs

map<string, double>

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

route_total_cost

double

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

Przerwa

Dane reprezentujące wykonanie przerwy.

Pola
start_time

Timestamp

Czas rozpoczęcia przerwy.

duration

Duration

Czas trwania przerwy.

EncodedPolyline

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

Pola
points

string

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

Przejście

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

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

Pola
travel_duration

Duration

Czas podróży w trakcie tej zmiany.

travel_distance_meters

double

Dystans pokonany podczas przejścia.

traffic_info_unavailable

bool

Jeśli żądanie ruchu pochodzi z OptimizeToursRequest.consider_road_traffic i nie można pobrać informacji o ruchu dla Transition, ta wartość logiczna ma wartość Prawda. Może to być tymczasowe (rzadkie problemy z serwerami ruchu w czasie rzeczywistym) lub trwałe (brak danych dla tej lokalizacji).

delay_duration

Duration

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

break_duration

Duration

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

wait_duration

Duration

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

total_duration

Duration

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

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

Timestamp

Godzina rozpoczęcia tego przejścia.

route_polyline

EncodedPolyline

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

vehicle_loads

map<string, VehicleLoad>

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

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

VehicleLoad

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

Pola
amount

int64

Obciążenie pojazdu dla danego typu. Jednostka obciążenia jest zwykle wskazywana przez typ. Zobacz Transition.vehicle_loads.

Odwiedź

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

Pola
shipment_index

int32

Indeks pola shipments w źródle ShipmentModel.

is_pickup

bool

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

visit_request_index

int32

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

start_time

Timestamp

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

load_demands

map<string, Load>

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

detour

Duration

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

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

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

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

string

Kopia odpowiedniego pola Shipment.label, jeśli określono ją w zasadzie Shipment.

visit_label

string

Kopia odpowiedniego pola VisitRequest.label, jeśli określono ją w zasadzie VisitRequest.

ShipmentTypeIncompatibility

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

Pola
types[]

string

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

incompatibility_mode

IncompatibilityMode

Tryb został zastosowany do niezgodności.

IncompatibilityMode

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

Wartości w polu enum
INCOMPATIBILITY_MODE_UNSPECIFIED Nieokreślony tryb niezgodności. Tej wartości nie należy używać.
NOT_PERFORMED_BY_SAME_VEHICLE W tym trybie 2 przesyłki o niewłaściwych typach nie mogą być współdzielone z tym samym pojazdem.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

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

  • Jeśli w obu przypadkach oferowana jest tylko opcja odbioru (bez dostawy) lub tylko dostawa (bez odbioru), nie mogą w ogóle współdzielić tego samego pojazdu.
  • Jeśli jedna z przesyłek obejmuje dostawę, a druga odbiór, obie mogą obejmować ten sam pojazd, jeśli poprzednia została dostarczona przed odebraniem drugiej.

ShipmentTypeRequirement

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

Pola
required_shipment_type_alternatives[]

string

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

dependent_shipment_types[]

string

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

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

requirement_mode

RequirementMode

Tryb zastosowany do wymagania.

RequirementMode

Tryby określają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 używać.
PERFORMED_BY_SAME_VEHICLE W tym trybie wszystkie „zależne” przesyłki muszą być z tym samym pojazdem co co najmniej jeden z „wymaganych” przesyłek.
IN_SAME_VEHICLE_AT_PICKUP_TIME

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

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

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

SkippedShipment

Określa szczegóły niezrealizowanych dostaw w rozwiązaniu. W najprostszych przypadkach lub jeśli jesteśmy w stanie zidentyfikować przyczynę pominięcia, podajemy tutaj jej przyczynę.

Pola
index

int32

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

label

string

Kopia odpowiedniego pola Shipment.label, jeśli określono ją w zasadzie Shipment.

reasons[]

Reason

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

Przyczyna

Jeśli będziemy mogli wyjaśnić, dlaczego przesyłka została pominięta, tutaj znajdziesz jej powody. Jeśli powód nie jest taki sam dla wszystkich pojazdów, reason będzie mieć więcej niż 1 element. Pominięta przesyłka nie może mieć zduplikowanych powodów, tj. gdy wszystkie pola są takie same oprócz example_vehicle_index. Przykład:

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

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

Pola
code

Code

Więcej informacji znajdziesz w komentarzach do kodu.

example_exceeded_capacity_type

string

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

example_vehicle_index

int32

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

Kod

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

Wartości w polu enum
CODE_UNSPECIFIED Nie należy jej nigdy używać. Jeśli nie będziemy mogli zrozumieć, dlaczego przesyłka została pominięta, zwracamy po prostu pusty zestaw powodów.
NO_VEHICLE W modelu nie ma żadnego pojazdu, co uniemożliwiałoby realizację wszystkich dostaw.
DEMAND_EXCEEDS_VEHICLE_CAPACITY Zapotrzebowanie na dostawę przekracza pojemność pojazdu w przypadku niektórych typów pojemności, z których jeden wynosi example_exceeded_capacity_type.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT

Minimalna odległość wymagana do wykonania tej przesyłki, tj. od start_location pojazdu do miejsc odbioru lub dostawy przesyłki oraz do miejsca docelowego pojazdu, przekracza route_distance_limit pojazdu.

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

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT

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

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

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT Tak jak powyżej, ale porównujemy tylko minimalny czas podróży z travel_duration_limit pojazdu.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS Pojazd nie może zrealizować tej wysyłki w najlepszym przypadku (wyliczenie czasu znajdziesz na stronie CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT), jeśli rozpoczyna się najwcześniej w momencie rozpoczęcia. W przypadku całkowitego czasu zamknięcie pojazdu spowoduje jego zakończenie po najpóźniejszej godzinie zakończenia.
VEHICLE_NOT_ALLOWED Pole allowed_vehicle_indices przesyłki nie jest puste, a pojazd do niego nie należy.

TimeWindow

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

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

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

Timestamp

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

end_time

Timestamp

Trudny czas zakończenia przedziału czasowego. Jeśli nie określono inaczej, wartość zostanie ustawiona na ShipmentModel.global_end_time.

soft_start_time

Timestamp

Godzina łagodnego rozpoczęcia przedziału czasu.

soft_end_time

Timestamp

Godzina zakończenia okresu.

cost_per_hour_before_soft_start_time

double

Koszt za godzinę dodany do innych kosztów w modelu, jeśli zdarzenie wystąpi przed soft_start_time. Wartość jest obliczana według wzoru:

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

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

cost_per_hour_after_soft_end_time

double

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

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

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

TransitionAttributes

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

Pola
src_tag

string

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

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

excluded_src_tag

string

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

dst_tag

string

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

excluded_dst_tag

string

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

cost

double

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

cost_per_kilometer

double

Określa koszt kilometra stosowany do odległości pokonanej podczas wykonywania tej zmiany. Suma wartości tych atrybutów jest równa wartości Vehicle.cost_per_kilometer określonej w pojazdach.

distance_limit

DistanceLimit

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

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

delay

Duration

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

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

Pojazd

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

Pola
display_name

string

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

travel_mode

TravelMode

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

start_location

LatLng

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

start_waypoint

Waypoint

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

end_location

LatLng

Lokalizacja geograficzna, w której kończy się pojazd (VisitRequest). Jeśli nie określono inaczej, okres ShipmentRoute pojazdu kończy się natychmiast po zakończeniu ostatnich VisitRequest. Jeśli model dostawy zawiera macierze czasu trwania i odległości, nie można określić end_location.

end_waypoint

Waypoint

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

start_tags[]

string

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

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

end_tags[]

string

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

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

start_time_windows[]

TimeWindow

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

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

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

end_time_windows[]

TimeWindow

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

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

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

unloading_policy

UnloadingPolicy

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

load_limits

map<string, LoadLimit>

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

cost_per_hour

double

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

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

cost_per_traveled_hour

double

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

cost_per_kilometer

double

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

fixed_cost

double

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

used_if_route_is_empty

bool

To pole dotyczy tylko pojazdów, których trasa nie obsługuje żadnych przesyłek. Informuje, czy w tym przypadku pojazd należy uznać za używany.

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

W przeciwnym razie nie będzie podróżować z początku do miejsca docelowego, a dla tego pojazdu nie zaplanowano żadnych break_rule ani opóźnienia (od TransitionAttributes). W tym przypadku atrybut ShipmentRoute pojazdu nie zawiera żadnych informacji poza numerem indeksu i etykietą pojazdu.

route_duration_limit

DurationLimit

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

travel_duration_limit

DurationLimit

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

route_distance_limit

DistanceLimit

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

extra_visit_duration_for_visit_type

map<string, Duration>

Określa mapowanie z ciągów visit_types na czasy trwania. Czas trwania jest uzupełnieniem VisitRequest.duration, które mają być wykonywane w przypadku wizyt z określoną wartością visit_types. Ten dodatkowy czas trwania wizyty zwiększa koszt, jeśli określono cost_per_hour. Klucze (np. visit_types) nie mogą być puste.

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

break_rule

BreakRule

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

label

string

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

ignore

bool

Jeśli ma wartość true (prawda), used_if_route_is_empty musi mieć wartość false (fałsz), a pojazd pozostanie nieużywany.

Jeśli dostawa jest realizowana przez zignorowany pojazd w injected_first_solution_routes, zostanie to pominięte w pierwszym rozwiązaniu, ale można je wykonać w odpowiedzi.

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

travel_duration_multiple

double

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

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

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

Pola
max_duration

Duration

Twardy limit ogranicza czas trwania do maksymalnie max_duration.

soft_max_duration

Duration

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

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

quadratic_soft_max_duration

Duration

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

Jeśli została określona, quadratic_soft_max_duration nie może być ujemna. Jeśli zdefiniowano również max_duration, wartość quadratic_soft_max_duration musi być mniejsza niż max_duration, a różnica nie może być większa niż jeden dzień:

max_duration - quadratic_soft_max_duration <= 86400 seconds

cost_per_hour_after_soft_max

double

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

  cost_per_hour_after_soft_max * (duration - soft_max_duration)

Koszt nie może być ujemny.

cost_per_square_hour_after_quadratic_soft_max

double

Koszt godziny kwadratowej poniesiony w przypadku naruszenia progu quadratic_soft_max_duration.

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

  cost_per_square_hour_after_quadratic_soft_max *
  (duration - quadratic_soft_max_duration)^2

Koszt nie może być ujemny.

LoadLimit

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

Pola
soft_max_load

int64

Ograniczony limit obciążenia. Zobacz cost_per_unit_above_soft_max.

cost_per_unit_above_soft_max

double

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

start_load_interval

Interval

Dopuszczalny czas obciążenia pojazdu na początku trasy.

end_load_interval

Interval

Dopuszczalny czas obciążenia pojazdu na końcu trasy.

max_load

int64

Maksymalna akceptowalna ilość obciążenia.

Interwał

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

Pola
min

int64

Minimalne dopuszczalne obciążenie. Wartość musi być ≥ 0. Jeśli obie są określone, min musi mieć wartość ≤ max.

max

int64

Maksymalne dopuszczalne obciążenie. Wartość musi być ≥ 0. Jeśli nie określono inaczej, ten komunikat nie będzie ograniczać maksymalnego obciążenia. Jeśli obie są określone, min musi mieć wartość ≤ max.

TravelMode

Środki transportu, z których mogą korzystać pojazdy.

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

Wartości w polu enum
TRAVEL_MODE_UNSPECIFIED Nieokreślony środek transportu, odpowiednik: DRIVING.
DRIVING Tryb podróży odpowiadający kierunkom jazdy (samochód, ...).
WALKING Tryb podróży odpowiadający trasom pieszym.

UnloadingPolicy

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

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

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

Punkt pośredni

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

Pola
side_of_road

bool

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

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

Location

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

place_id

string

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