- Zapis JSON
- Wysyłka
- VisitRequest
- LatLng
- Waypoint
- Lokalizacja
- TimeWindow
- Pojazd
- TravelMode
- RouteModifiers
- UnloadingPolicy
- LoadLimit
- Odstęp czasu
- LoadCost
- DurationLimit
- DistanceLimit
- BreakRule
- BreakRequest
- FrequencyConstraint
- DurationDistanceMatrix
- Wiersz
- TransitionAttributes
- ShipmentTypeIncompatibility
- IncompatibilityMode
- ShipmentTypeRequirement
- RequirementMode
- PrecedenceRule
Model dostawy obejmuje zestaw dostaw, który musi być realizowany przez zestaw pojazdów przy minimalizacji całkowitego kosztu, który jest sumą:
- kosztu wyznaczania trasy dla pojazdów (suma kosztu na godzinę, kosztu na czas przejazdu i kosztów stałych na wszystkie pojazdy);
- kary za niewywiązanie się z obowiązku dostawy.
- globalny koszt dostaw
Zapis JSON |
---|
{ "shipments": [ { object ( |
Pola | |
---|---|
shipments[] |
Zestaw dostaw, które muszą zostać wykonane w modelu. |
vehicles[] |
Zestaw pojazdów, których można używać do odwiedzin. |
globalStartTime |
Globalny czas rozpoczęcia i zakończenia modelu: nie można uznać za prawidłowego żadnego czasu spoza tego zakresu. Zakres czasowy modelu musi być krótszy niż rok, czyli Gdy używasz pól Sygnatura czasowa w formacie UTC „Zulu” zdefiniowanym w dokumencie RFC 3339, z dokładnością do nanosekund i maksymalnie 9 miejsc po przecinku. Przykłady: |
globalEndTime |
Jeśli nie jest ustawiona, domyślnie używana jest wartość 00:00:00 UTC, 1 stycznia 1971 r. (tzn. sekund: 31536000, nanos: 0). Sygnatura czasowa w formacie UTC „Zulu” zdefiniowanym w dokumencie RFC 3339, z dokładnością do nanosekund i maksymalnie 9 miejsc po przecinku. Przykłady: |
globalDurationCostPerHour |
„Globalny czas trwania” całego planu to różnica między najwcześniejszym obowiązującym czasem rozpoczęcia a najnowszym obowiązującym czasem zakończenia wszystkich pojazdów. Użytkownicy mogą przypisać koszt za godzinę do danej ilości, aby np. zoptymalizować kampanię pod kątem najwcześniejszego realizacji zadania. Ten koszt musi być w tej samej jednostce co |
durationDistanceMatrices[] |
Określa macierze czasu trwania i odległości używane w modelu. Jeśli to pole jest puste, zamiast niego używane są odległości na mapach Google lub geodezyjne, w zależności od wartości pola Przykłady użycia:
|
durationDistanceMatrixSrcTags[] |
Tagi definiujące źródła czasu trwania oraz macierzy odległości; Znaczniki odpowiadają wartości |
durationDistanceMatrixDstTags[] |
Tagi określające miejsca docelowe macierzy czasu trwania i odległości; Znaczniki odpowiadają wartości |
transitionAttributes[] |
Atrybuty przejścia zostały dodane do modelu. |
shipmentTypeIncompatibilities[] |
Zestawy niezgodnych typów przesyłki (patrz |
shipmentTypeRequirements[] |
zestawy wymagań |
precedenceRules[] |
Zestaw reguł pierwszeństwa, które muszą być egzekwowane w modelu. |
maxActiveVehicles |
Ogranicza maksymalną liczbę aktywnych pojazdów. Pojazd jest aktywny, jeśli jego trasa obejmuje co najmniej jedną dostawę. 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ć dodatni. |
Wysyłka
Dostawa pojedynczego produktu, od odbioru do jednej dostawy. Aby przesyłka została uznana za zrealizowaną, pojazd musi odwiedzić jedną z lokalizacji odbioru (i odpowiednio zmniejszyć ilość wolnych miejsc), a następnie odwiedzić jedną z lokalizacji dostawy (i odpowiednio zwiększyć ilość wolnych miejsc).
Zapis JSON |
---|
{ "displayName": string, "pickups": [ { object ( |
Pola | |
---|---|
displayName |
Zdefiniowana przez użytkownika nazwa wyświetlana przesyłki. Może on zawierać maksymalnie 63 znaki i znaki UTF-8. |
pickups[] |
Zestaw alternatywnych opcji odbioru powiązanych z dostawą. Jeśli go nie podasz, pojazd musi udać się tylko do lokalizacji odpowiadającej dostawcom. |
deliveries[] |
Zestaw alternatywnych sposobów dostawy powiązanych z dostawą. Jeśli go nie podasz, pojazd musi udać się tylko do lokalizacji odpowiadającej punktom odbioru. |
loadDemands |
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. |
allowedVehicleIndices[] |
Zestaw pojazdów, które mogą zrealizować tę przesyłkę. Jeśli pole jest puste, wszystkie pojazdy mogą je wykonać. Pojazdy są podawane według indeksu na liście |
costsPerVehicle[] |
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:
Koszty muszą być podane w tej samej jednostce co |
costsPerVehicleIndices[] |
Indeksy pojazdów, do których ma zastosowanie |
pickupToDeliveryAbsoluteDetourLimit |
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. Niech na przykład t będzie najkrótszym czasem potrzebnym na dotarcie z wybranego miejsca odbioru bezpośrednio do wybranego miejsca dostawy. Ustawienie
Jeśli w przypadku jednej przesyłki są określone zarówno względne, jak i bezwzględne limity, w przypadku każdej możliwej pary odbioru/dostawy stosuje się bardziej restrykcyjny limit. Od października 2017 r. objazdy są obsługiwane tylko wtedy, gdy czas podróży nie zależy od pojazdów. Czas trwania w sekundach składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „ |
pickupToDeliveryTimeLimit |
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 od tego, które alternatywne rozwiązania zostaną wybrane do odbioru i dostawy, ani od prędkości pojazdu. Można je określić razem z ograniczeniami maksymalnego objazdu: rozwiązanie będzie przestrzegać obu specyfikacji. Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „ |
shipmentType |
Niepusty ciąg znaków określający „typ” przesyłki. Ta funkcja może służyć do definiowania niezgodności lub wymagań między Różni się od |
label |
Określa etykietę dla tej przesyłki. Ta etykieta jest raportowana w odpowiedzi w |
ignore |
Jeśli tak, pomiń tę przesyłkę, ale nie stosuj Ignorowanie dostawy powoduje błąd weryfikacji, jeśli w modelu występują jakiekolwiek Dostawa realizowana w |
penaltyCost |
Jeśli dostawa nie zostanie ukończona, kara zostanie dodana do całkowitego kosztu tras. Przesyłka jest uważana za ukończoną, jeśli wybrano jedną z dostępnych 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. |
pickupToDeliveryRelativeDetourLimit |
Określa maksymalny czas objazdu w porównaniu z najkrótszą ścieżką od odbioru do dostawy. Jeśli jest podany, musi być dodatni, a przesyłka musi zawierać co najmniej odbiór i dostawę. 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. Ustawienie
Jeśli w przypadku jednej przesyłki są określone zarówno względne, jak i bezwzględne limity, w przypadku każdej możliwej pary odbioru/dostawy stosuje się bardziej restrykcyjny limit. Od 2017 r. objazdy są obsługiwane tylko wtedy, gdy czas podróży nie zależy od pojazdów. |
VisitRequest
Prośba o wizytację, którą można wykonać pojazdem: ma ona geolokalizację (lub 2 lokalizacje, patrz poniżej), godziny otwarcia i zamknięcia reprezentowane przez okna czasowe oraz czas trwania usługi (czas spędzony przez pojazd od momentu przyjazdu do odbioru lub dostarczenia towarów).
Zapis JSON |
---|
{ "arrivalLocation": { object ( |
Pola | |
---|---|
arrivalLocation |
Lokalizacja geograficzna, do której przyjeżdża pojazd podczas wykonywania tej czynności ( |
arrivalWaypoint |
Punkt pośredni, do którego przyjeżdża pojazd, wykonując tę czynność |
departureLocation |
Lokalizacja geograficzna, z której pojazd odjeżdża po ukończeniu tego celu: |
departureWaypoint |
Punkt orientacyjny, w którym pojazd wyrusza po zakończeniu tego |
tags[] |
Określa tagi dołączone do żądania wizyty. Puste lub zduplikowane ciągi znaków są niedozwolone. |
timeWindows[] |
Przedziały czasu, które ograniczają godzinę przybycia podczas wizyty. Pamiętaj, że pojazd może wyjechać poza okno czasu przyjazdu, czyli czas przyjazdu + czas trwania nie muszą mieścić się w oknie czasowym. Może to spowodować oczekiwanie, jeśli pojazd dotrze przed Brak wartości 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 |
duration |
Czas trwania wizyty, czyli czas spędzony przez pojazd między przybyciem a odejściem (dodawany do możliwego czasu oczekiwania; patrz Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „ |
cost |
Koszt realizacji tego żądania wizyty na trasie pojazdu. Można go używać do płacenia różnych kosztów za odbiór lub dostawę przesyłki. Te koszty muszą być wyrażone w tych samych jednostkach co |
loadDemands |
Wczytaj wymagania dotyczące tego żądania wizyty. To pole jest podobne do pola |
visitTypes[] |
Określa typy wizyt. Może ona służyć do przydzielenia dodatkowego czasu potrzebnego pojazdowi na wykonanie tej wizyty (patrz Typ może wystąpić tylko raz. |
label |
Określa etykietę elementu |
LatLng
Obiekt reprezentujący parę szerokości i długości geograficznej. Jest ona wyrażona jako para podwójnej precyzji reprezentująca stopnie szerokości i długości geograficznej. Jeśli nie określono inaczej, obiekt musi być zgodny ze standardem WGS84. Wartości muszą mieścić się w znormalizowanych zakresach.
Zapis JSON |
---|
{ "latitude": number, "longitude": number } |
Pola | |
---|---|
latitude |
Szerokość geograficzna w stopniach. Musi mieścić się w zakresie [-90,0, +90,0]. |
longitude |
Długość geograficzna w stopniach. Musi mieścić się w zakresie od -180,0 do +180,0]. |
Punkt pośredni
Obejmuje punkt pośredni. Punkty pośrednie oznaczają miejsca przyjazdu i wyjazdu w żądaniach VisitRequests oraz lokalizacje początkowe i końcowe Pojazdy.
Zapis JSON |
---|
{ "sideOfRoad": boolean, // Union field |
Pola | |
---|---|
sideOfRoad |
Opcjonalnie: Wskazuje, że umiejscowienie tego punktu pośredniego powinno umożliwiać zatrzymanie pojazdu po określonej stronie drogi. Po ustawieniu tej wartości trasa będzie przebiegać przez lokalizację, tak aby pojazd mógł się zatrzymać na poboczu drogi, w kierunku której lokalizacja jest przekierowana od środka drogi. Ta opcja nie działa w trybie podróży „SPACER”. |
Pole sumy location_type . różne sposoby przedstawiania lokalizacji; location_type może mieć tylko jedną z tych wartości: |
|
location |
Punkt określony za pomocą współrzędnych geograficznych, w tym opcjonalnego nagłówka. |
placeId |
Identyfikator miejsca POI powiązany z punktem pośrednim. |
Lokalizacja
Obejmuje lokalizację (punkt geograficzny i opcjonalny nagłówek).
Zapis JSON |
---|
{
"latLng": {
object ( |
Pola | |
---|---|
latLng |
Współrzędne geograficzne punktu kontrolnego. |
heading |
Nagłówek kompasu powiązany z kierunkiem ruchu. Ta wartość służy do określenia strony drogi, z której ma nastąpić odbiór i zwrot. Wartości kierunku mogą się wahać od 0 do 360, gdzie 0 to kierunek na północ, 90 to kierunek na wschód itd. |
TimeWindow
Okna czasowe ograniczają czas trwania zdarzenia, np. czas przybycia w ramach wizyty lub czas rozpoczęcia i zakończenia korzystania z pojazdu.
Wartości graniczne sztywnego przedziału czasu, czyli startTime
i endTime
, egzekwują najwcześniejszy i najnowszy czas zdarzenia, na przykład startTime <= event_time <=
endTime
. Dolna granica łagodnego okresu czasu (softStartTime
) określa preferencję, aby zdarzenie miało miejsce softStartTime
lub później przez naliczanie kosztu proporcjonalnie do czasu, jaki upłynął przed wystąpieniem zdarzenia softStartTime. Górna granica łagodnego okresu czasu (softEndTime
) określa preferencję, aby zdarzenie miało miejsce softEndTime
lub wcześniej przez naliczanie kosztów proporcjonalnie do czasu, jaki upłynął od zdarzenia softEndTime
. Wartości startTime
, endTime
, softStartTime
i softEndTime
powinny mieścić się w globalnych limitach czasowych (patrz ShipmentModel.global_start_time
i ShipmentModel.global_end_time
) oraz spełniać te wymagania:
0 <= `startTime` <= `endTime` and
0 <= `startTime` <= `softStartTime` and
0 <= `softEndTime` <= `endTime`.
Zapis JSON |
---|
{ "startTime": string, "endTime": string, "softStartTime": string, "softEndTime": string, "costPerHourBeforeSoftStartTime": number, "costPerHourAfterSoftEndTime": number } |
Pola | |
---|---|
startTime |
Czas rozpoczęcia okna czasowego. Jeśli nie określono inaczej, wartość zostanie ustawiona na Sygnatura czasowa w formacie UTC „Zulu” zdefiniowanym w dokumencie RFC 3339, z dokładnością do nanosekund i maksymalnie 9 miejsc po przecinku. Przykłady: |
endTime |
Czas zakończenia sztywnego przedziału czasu. Jeśli nie określono inaczej, wartość zostanie ustawiona na Sygnatura czasowa w formacie RFC3339 UTC „Zulu” z rozdzielczością nanosekundy i maksymalnie 9 cyframi po przecinku. Przykłady: |
softStartTime |
Godzina łagodnego rozpoczęcia przedziału czasu. Sygnatura czasowa w formacie RFC3339 UTC „Zulu” z rozdzielczością nanosekundy i maksymalnie 9 cyframi po przecinku. Przykłady: |
softEndTime |
Czas zakończenia przedziału czasu (miękki). Sygnatura czasowa w formacie RFC3339 UTC „Zulu” z rozdzielczością nanosekundy i maksymalnie 9 cyframi po przecinku. Przykłady: |
costPerHourBeforeSoftStartTime |
Koszt za godzinę dodany do innych kosztów w modelu, jeśli zdarzenie wystąpi przed softStartTime. Wartość jest obliczana według wzoru:
Ten koszt musi być dodatni, a pole można ustawić tylko wtedy, gdy skonfigurowano softStartTime. |
costPerHourAfterSoftEndTime |
Koszt za godzinę dodany do innych kosztów w modelu, jeśli zdarzenie wystąpi po
Ten koszt musi być dodatni, a pole można ustawić tylko wtedy, gdy skonfigurowano opcję |
Pojazd
Model pojazdu w przypadku problemu z dostawą. Rozwiązanie problemu z dostawą spowoduje utworzenie trasy dla tego pojazdu rozpoczynającej się od startLocation
i kończącej na endLocation
. Trasa jest sekwencją wizyt (patrz ShipmentRoute
).
Zapis JSON |
---|
{ "displayName": string, "travelMode": enum ( |
Pola | |
---|---|
displayName |
Zdefiniowana przez użytkownika nazwa wyświetlana pojazdu. Może składać się z maksymalnie 63 znaków i zawierać znaki UTF-8. |
travelMode |
Tryb podróży, który wpływa na drogi, z których może korzystać pojazd, i jego prędkość. Zobacz też |
routeModifiers |
Zestaw warunków, które wpływają na sposób obliczania tras dla danego pojazdu. |
startLocation |
Geograficzna lokalizacja, w której pojazd rozpoczyna przejazd przed odbiorem przesyłek. Jeśli nie zostanie określony, pojazd rozpoczyna kurs od pierwszego odbioru. Jeśli model dostawy zawiera macierze czasu i odległości, nie można określić parametru |
startWaypoint |
Punkt drogi reprezentujący lokalizację geograficzną, w której pojazd rozpoczyna przejazd przed odbiorem przesyłek. Jeśli nie podasz ani atrybutu |
endLocation |
Lokalizacja geograficzna, w której kończy się pojazd ( |
endWaypoint |
Punkt pośredni reprezentujący lokalizację geograficzną, w której kończy się pojazd po zakończeniu ostatniego |
startTags[] |
Określa tagi dołączone do początku trasy pojazdu. Puste lub zduplikowane ciągi znaków są niedozwolone. |
endTags[] |
Określa tagi dołączone na końcu trasy pojazdu. Pustych lub powtarzających się ciągów znaków nie można używać. |
startTimeWindows[] |
Okna czasowe, w których pojazd może opuścić lokalizację początkową. Muszą mieścić się w globalnych limitach czasowych (patrz pola 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 |
endTimeWindows[] |
Przedziały czasu, w których pojazd może dotrzeć do miejsca docelowego. Muszą mieścić się w globalnych limitach czasowych (patrz pola 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 |
unloadingPolicy |
Zasady rozładunku obowiązujące w pojazdach. |
loadLimits |
Pojemność pojazdu (np. waga, objętość, liczba palet). Klucze na mapie to identyfikatory typu obciążenia, zgodne z kluczami w polu |
costPerHour |
Koszty pojazdu: wszystkie koszty są sumowane i muszą być wyrażone w tej samej jednostce co Koszt za godzinę trasy pojazdu. Koszt ten jest naliczany za cały czas trwania trasy, w tym czas podróży, oczekiwania i wizyty. Użycie usługi |
costPerTraveledHour |
Koszt godziny przejazdu pojazdu. Ten koszt jest stosowany tylko do czasu przejazdu po trasie (czyli podanego w |
costPerKilometer |
Koszt przejechania 1 km trasy przez pojazd. Ten koszt jest stosowany do odległości podanej w |
fixedCost |
Stały koszt stosowany, jeśli ten pojazd służy do obsługi przesyłki. |
usedIfRouteIsEmpty |
To pole ma zastosowanie tylko do pojazdów, których trasa nie obsługuje żadnych przesyłek. Wskazuje, czy w tym przypadku pojazd powinien być uznany za używany. Jeśli to ustawienie ma wartość true, pojazd jedzie z miejsca początkowego do miejsca docelowego, nawet jeśli nie obsługuje żadnych przesyłek. Uwzględniane są koszty czasu i odległości wynikające z przejazdu od początku do końca. W przeciwnym razie nie będzie podróżować z początku do miejsca docelowego, a dla tego pojazdu nie zaplanowano żadnych |
routeDurationLimit |
Limit zastosowany do łącznego czasu trwania trasy pojazdu. W danym okresie ( |
travelDurationLimit |
Ograniczenie czasu trwania przejazdu na trasie pojazdu. W danym |
routeDistanceLimit |
Ograniczenie stosowane do całkowitej odległości przebytej przez pojazd. W danym regionie |
extraVisitDurationForVisitType |
Określa mapę od ciągów znaków visitTypes do długości. Czas trwania jest uzupełnieniem Jeśli prośba o wizytę ma kilka typów, na mapie zostanie dodany czas trwania dla każdego z nich. |
breakRule |
Opisuje harmonogram przerw, który ma być stosowany w tym pojeździe. Jeśli pole będzie puste, w przypadku tego pojazdu nie zostaną zaplanowane żadne przerwy. |
label |
Określa etykietę tego pojazdu. Ta etykieta jest zgłaszana w odpowiedzi jako |
ignore |
Jeśli wartość Jeśli dostawa jest realizowana przez zignorowany pojazd w Jeśli przesyłka jest realizowana przez zignorowany pojazd w |
travelDurationMultiple |
Określa współczynnik mnożenia, który może być używany do zwiększania lub zmniejszania czasu przejazdu tego pojazdu. Na przykład ustawienie wartości 2,0 oznacza, że ten pojazd jest wolniejszy i czas podróży jest 2 razy dłuższy niż w przypadku standardowych pojazdów. Ta wielokrotność nie ma wpływu na czas trwania wizyty. Wpływa na koszt, jeśli określono 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ż |
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, czyli DRIVING . |
DRIVING |
Tryb podróży odpowiadający wskazówkom dojazdu (samochód, ...). |
WALKING |
Tryb podróży odpowiadający wskazówkom dojazdu pieszo. |
RouteModifiers
Zawiera zestaw opcjonalnych warunków, które należy spełnić podczas obliczania tras pojazdów. Jest to podobne do RouteModifiers
w interfejsie Preferred API tras Google Maps Platform; zobacz: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.
Zapis JSON |
---|
{ "avoidTolls": boolean, "avoidHighways": boolean, "avoidFerries": boolean, "avoidIndoor": boolean } |
Pola | |
---|---|
avoidTolls |
Określa, czy w uzasadnionych przypadkach należy unikać dróg płatnych. Preferowane będą trasy nieobejmujące dróg płatnych. Dotyczy to tylko pojazdów mechanicznych. |
avoidHighways |
Określa, czy w uzasadnionych przypadkach unikać autostrad. Priorytet będą miały trasy niezawierające autostrad. Dotyczy tylko pojazdów z silnikiem. |
avoidFerries |
Określa, czy w uzasadnionych przypadkach ma być unikana przeprawa promowa. Preferowane będą trasy nieobejmujące przejazdów promem. Dotyczy tylko pojazdów z silnikiem. |
avoidIndoor |
Opcjonalnie: Określa, czy w uzasadnionych przypadkach unikać przechodzenia do wnętrz. Preferowane będą trasy nieobejmujące nawigacji w pomieszczeniach. Dotyczy tylko środka transportu |
UnloadingPolicy
Zasady dotyczące sposobu rozładunku pojazdu. Dotyczy tylko przesyłek, które obejmują zarówno odbiór, jak i dostawę.
Inne przesyłki mogą być dostarczane w dowolnym miejscu na trasie niezależnie od unloadingPolicy
.
Wartości w polu enum | |
---|---|
UNLOADING_POLICY_UNSPECIFIED |
Nieokreślona polityka rozładunku; dostawy muszą odbywać się po odpowiednich odbiorach. |
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 |
LoadLimit
Określa limit ładunku dla pojazdu, np. „ten samochód może przewozić maksymalnie 3500 kg”. Zobacz loadLimits
.
Zapis JSON |
---|
{ "softMaxLoad": string, "costPerUnitAboveSoftMax": number, "startLoadInterval": { object ( |
Pola | |
---|---|
softMaxLoad |
Ograniczony limit obciążenia. Zobacz |
costPerUnitAboveSoftMax |
Jeśli ładunek przekroczy wartość |
startLoadInterval |
Dopuszczalny przedział ładowania pojazdu na początku trasy. |
endLoadInterval |
Dopuszczalny czas obciążenia pojazdu na końcu trasy. |
maxLoad |
Maksymalna akceptowalna ilość obciążenia. |
costPerKilometer |
Koszt przeniesienia jednej jednostki ładunku na ponad kilometr w przypadku tego pojazdu. Można go użyć jako zastępnika zużycia paliwa: jeśli ładunek to waga (w niutonach), to ładunek*kilometr ma wymiar energii. |
costPerTraveledHour |
Koszt przejazdu tym pojazdem z jednostką ładunku w ciągu godziny. |
Interwał
Odstęp między akceptowanymi wielkościami wczytywania.
Zapis JSON |
---|
{ "min": string, "max": string } |
Pola | |
---|---|
min |
Minimalne dopuszczalne obciążenie. Wartość musi być większa lub równa 0. Jeśli obie są określone, |
max |
Maksymalne dopuszczalne obciążenie. Wartość musi być większa lub równa 0. Jeśli nie określisz maksymalnego obciążenia, wiadomość nie będzie nakładać żadnych ograniczeń. Jeśli obie są określone, |
LoadCost
Koszt przeniesienia jednej jednostki obciążenia w okresie Transition
. Koszt danego obciążenia to suma dwóch części:
- min(wczytanie;
loadThreshold
) *costPerUnitBelowThreshold
- max(0, obciążenie –
loadThreshold
) *costPerUnitAboveThreshold
W przypadku tego kosztu rozwiązania preferują najpierw realizację wysokich zapotrzebowań lub równolegle wysokich zapotrzebowań. Jeśli na przykład pojazd ma
load_limit {
key: "weight"
value {
costPerKilometer {
loadThreshold: 15
costPerUnitBelowThreshold: 2.0
costPerUnitAboveThreshold: 10.0
}
}
}
a jego trasa to start, odbiór, odbiór, dostawa, dostawa, koniec z przechodzeniem:
transition { vehicle_load['weight'] { amount: 0 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 20 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
travelDistanceMeters: 1000.0 }
wtedy koszt poniesiony przez ten LoadCost
to (cost_below * load_below * kilometers + cost_above * load_above * kms)
- Przejście 0: 0,0
- przejście 1: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
- Przejście 2: 2,0 * 15 * 1,0 + 10,0 * (20 - 15) * 1,0 = 80,0
- Przejście 3: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
- Przejście 4: 0,0
LoadCost
na trasie to 120,0.
Jeśli jednak trasa ma przebiegać w kolejności start, odbiór, dostawa, odbiór, dostawa, koniec z przejściami:
transition { vehicle_load['weight'] { amount: 0 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
travelDistanceMeters: 1000.0 }
koszty ponoszone przez to LoadCost
wynoszą
- przejście 0: 0,0
- przejście 1: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
- Zmiana 2: 0,0
- przejście 3: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
- przejście 4: 0,0
W tym przypadku LoadCost
na całej trasie wynosi 40,0.
LoadCost
powoduje, że rozwiązania z intensywnym wykorzystaniem przejść są droższe.
Zapis JSON |
---|
{ "loadThreshold": string, "costPerUnitBelowThreshold": number, "costPerUnitAboveThreshold": number } |
Pola | |
---|---|
loadThreshold |
Ilość ładunku, powyżej której koszt przeniesienia jednostki ładunku zmienia się z costPerUnitBelowThreshold na costPerUnitAboveThreshold. Musi być >= 0. |
costPerUnitBelowThreshold |
Koszt zmiany jednostki obciążenia, wyrażony dla każdej jednostki z zakresu od 0 do progu. Musi być skończoną wartością i musi być równa 0. |
costPerUnitAboveThreshold |
Koszt przeniesienia jednostki obciążenia dla każdej jednostki powyżej progu. W przypadku progu przypadków specjalnych = 0 oznacza to stały koszt jednostki. Musi być skończoną wartością i musi być równa 0. |
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.
Zapis JSON |
---|
{ "maxDuration": string, "softMaxDuration": string, "quadraticSoftMaxDuration": string, "costPerHourAfterSoftMax": number, "costPerSquareHourAfterQuadraticSoftMax": number } |
Pola | |
---|---|
maxDuration |
Sztywne ograniczenie, które ogranicza czas trwania do maxDuration. Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „ |
softMaxDuration |
miękki limit, który nie narzuca maksymalnego czasu trwania, ale w przypadku jego naruszenia powoduje, że trasa powoduje powstanie kosztu. Ten koszt jest sumowany z innymi kosztami zdefiniowanymi w modelu, przy użyciu tej samej jednostki. Jeśli jest zdefiniowana, wartość Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „ |
quadraticSoftMaxDuration |
Ograniczony limit nie egzekwuje maksymalnego czasu trwania, ale w przypadku naruszenia powoduje naliczanie kosztu w postaci kwadratowej. Ten koszt jest częścią innych kosztów określonych w modelu, które obejmują tę samą jednostkę. Jeśli jest zdefiniowana, wartość
Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „ |
costPerHourAfterSoftMax |
Koszt za godzinę po przekroczeniu progu
Koszt nie może być ujemny. |
costPerSquareHourAfterQuadraticSoftMax |
Koszt godziny kwadratowej poniesiony w przypadku naruszenia progu Koszt dodatkowy wynosi 0, jeśli czas trwania jest poniżej progu. W przeciwnym razie koszt zależy od czasu trwania:
Koszt nie może być ujemny. |
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 softMaxMeters
, jak i costPerKilometerAboveSoftMax
, i nie mogą być ujemne.
Zapis JSON |
---|
{ "maxMeters": string, "softMaxMeters": string, "costPerKilometerBelowSoftMax": number, "costPerKilometerAboveSoftMax": number } |
Pola | |
---|---|
maxMeters |
sztywny limit ograniczający odległość do maksymalnej wartości maxMeters. Limit nie może być ujemny. |
softMaxMeters |
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 jest zdefiniowana, wartość softMaxMeters musi być mniejsza niż maxMeters i nieujemna. |
costPerKilometerBelowSoftMax |
Poniesiony koszt za kilometr, rosnący do
Te koszty nie są obsługiwane w |
costPerKilometerAboveSoftMax |
Koszt za kilometr naliczany, jeśli odległość przekracza limit
Koszt musi być nieujemny. |
BreakRule
Reguły generowania przerw czasowych dla pojazdu (np. przerwa na lunch). Przerwa to ciągły okres czasu, w którym pojazd pozostaje nieczynny w swojej bieżącej pozycji i nie może wykonywać żadnych wizyt. Przerwa może wystąpić:
- w trakcie podróży między dwiema wizytami (obejmuje to czas bezpośrednio przed wizytą lub zaraz 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 (samochód nie może się uruchomić w trakcie przerwy), w którym to przypadku nie wpływa na czas uruchomienia pojazdu.
- lub po zakończeniu pojazdu (edytuj, z godziną zakończenia pojazdu).
Zapis JSON |
---|
{ "breakRequests": [ { object ( |
Pola | |
---|---|
breakRequests[] |
Kolejność przerw. Zobacz wiadomość: |
frequencyConstraints[] |
Może obowiązywać kilka zasad ( |
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ć. Okna czasowe (earliestStartTime
/ latestStartTime
) mogą się na siebie nakładać, ale muszą być zgodne z kolejnością (jest to sprawdzane).
Zapis JSON |
---|
{ "earliestStartTime": string, "latestStartTime": string, "minDuration": string } |
Pola | |
---|---|
earliestStartTime |
Wymagane. Dolna granica (włącznie) na początku przerwy. Sygnatura czasowa w formacie RFC3339 UTC „Zulu” z rozdzielczością nanosekundy i maksymalnie 9 cyframi po przecinku. Przykłady: |
latestStartTime |
Wymagane. Górna granica (włącznie) na początku przerwy. Sygnatura czasowa w formacie RFC3339 UTC „Zulu” z rozdzielczością nanosekundy i maksymalnie 9 cyframi po przecinku. Przykłady: |
minDuration |
Wymagane. Minimalny czas trwania przerwy. Musi być liczbą dodatnią. Czas trwania w sekundach składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „ |
FrequencyConstraint
Można też dodatkowo ograniczyć częstotliwość i czas trwania przerw określonych powyżej, narzucając minimalną częstotliwość przerwy, np. „Co 12 godzin musi być przerwa trwająca co najmniej 1 godzinę”. Zakładając, że można to interpretować jako „W dowolnym przesuwającym się oknie czasowym o długości 12 godzin musi być co najmniej 1 przerwa trwająca co najmniej 1 godzinę”, przykład ten przetłumaczylibyśmy w ten sposób: FrequencyConstraint
:
{
minBreakDuration { seconds: 3600 } # 1 hour.
maxInterBreakDuration { 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 dotyczyć przerw nieciągłych. Na przykład ten harmonogram uwzględnia przykład „1 godz. co 12 godz.”:
04:00 vehicle start
.. performing travel and visits ..
09:00 1 hour break
10:00 end of the break
.. performing travel and visits ..
12:00 20-min lunch break
12:20 end of the break
.. performing travel and visits ..
21:00 1 hour break
22:00 end of the break
.. performing travel and visits ..
23:59 vehicle end
Zapis JSON |
---|
{ "minBreakDuration": string, "maxInterBreakDuration": string } |
Pola | |
---|---|
minBreakDuration |
Wymagane. Minimalny czas trwania przerwy dla tego ograniczenia. Nieujemna. Zobacz opis Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „ |
maxInterBreakDuration |
Wymagane. Maksymalny dozwolony zakres czasu trwania dowolnego przedziału czasu na trasie, który nie zawiera przynajmniej częściowej przerwy wynoszącej Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „ |
DurationDistanceMatrix
Określa czas trwania i matrycę odległości od miejsca wizyty i rozpoczęcia pojazdu do odwiedzenia oraz lokalizacji zakończenia pojazdu.
Zapis JSON |
---|
{
"rows": [
{
object ( |
Pola | |
---|---|
rows[] |
Określa wiersze macierzy czasu trwania i odległości. Musi się składać z tylu elementów: |
vehicleStartTag |
Tag określający, do których pojazdów ma zastosowanie ta tablica czasu trwania i odległości. Jeśli jest pusty, ma zastosowanie do wszystkich pojazdów i może być tylko jedna matryca. Każdy początek pojazdu musi odpowiadać dokładnie jednej macierzy, czyli dokładnie jedno z pol Wszystkie macierze muszą mieć inny element |
Wiersz
Określa wiersz macierzy czasu trwania i odległości.
Zapis JSON |
---|
{ "durations": [ string ], "meters": [ number ] } |
Pola | |
---|---|
durations[] |
Wartości czasu trwania w danym wierszu. Musi się składać z tylu elementów: Czas trwania w sekundach składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „ |
meters[] |
Wartości odległości w danym wierszu. Jeśli brak kosztów lub ograniczeń odnosi się do odległości w modelu, możesz zostawić to pole puste. W przeciwnym razie model musi zawierać tyle elementów, ile |
TransitionAttributes
Określa atrybuty przejść między 2 kolejnymi wizytami na trasie. Do tego samego przejścia może mieć zastosowanie kilka TransitionAttributes
: w takim przypadku wszystkie dodatkowe koszty są sumowane, a następnie stosowany jest najbardziej restrykcyjny ogranicznik lub limit (zgodnie z naturalną semantyką „AND”).
Zapis JSON |
---|
{
"srcTag": string,
"excludedSrcTag": string,
"dstTag": string,
"excludedDstTag": string,
"cost": number,
"costPerKilometer": number,
"distanceLimit": {
object ( |
Pola | |
---|---|
srcTag |
Tagi definiujące zbiór przejść (src->dst), do których mają zastosowanie te atrybuty. Wizyta w źródle lub uruchomienie pojazdu powoduje dopasowanie, jeśli pole |
excludedSrcTag |
Zobacz |
dstTag |
Odpowiednia wizyta w miejscu docelowym lub koniec korzystania z pojazdu jest zgodna, jeśli pole |
excludedDstTag |
Zobacz |
cost |
Określa koszt wykonania tego przejścia. Jest on podawany w tych samych jednostkach co wszystkie inne koszty w modelu i nie może być ujemny. Jest doliczana do wszystkich innych istniejących kosztów. |
costPerKilometer |
Określa koszt kilometra stosowany do odległości pokonanej podczas wykonywania tej zmiany. Dodaje się do wszystkich |
distanceLimit |
Określa limit pokonywanej odległości podczas wykonywania tego przejścia. Od 6 czerwca 2021 r. obsługiwane są tylko limity wstępne. |
delay |
Określa opóźnienie związane z przejściem tej zmiany. To opóźnienie występuje zawsze po zakończeniu wizyty źródłowej i przed rozpoczęciem wizyty docelowej. Czas trwania w sekundach składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „ |
ShipmentTypeIncompatibility
Określa niezgodności między dostawami w zależności od parametru deliveryType. Występowanie niezgodnych przesyłek na tej samej trasie jest ograniczone na podstawie trybu niezgodności.
Zapis JSON |
---|
{
"types": [
string
],
"incompatibilityMode": enum ( |
Pola | |
---|---|
types[] |
Lista niezgodnych typów. 2 przesyłki z różnymi wartościami |
incompatibilityMode |
Tryb został zastosowany do niezgodności. |
IncompatibilityMode
Tryby określające, jak ograniczać pojawianie się 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 dwóch przesyłek z niezgodnymi typami w trybie niezgodności
|
ShipmentTypeRequirement
Określa wymagania dotyczące przesyłek na podstawie ich typu przesyłki. Konkretne wymagania są określane przez tryb wymagań.
Zapis JSON |
---|
{
"requiredShipmentTypeAlternatives": [
string
],
"dependentShipmentTypes": [
string
],
"requirementMode": enum ( |
Pola | |
---|---|
requiredShipmentTypeAlternatives[] |
Lista alternatywnych typów przesyłek wymaganych w dokumencie |
dependentShipmentTypes[] |
Wszystkie przesyłki o typie podanym w polu UWAGA: łańcuchy wymagań, w których |
requirementMode |
Tryb zastosowany do wymagań. |
RequirementMode
Tryby definiujące sposób wyświetlania przesyłek zależnych na trasie.
Wartości w polu enum | |
---|---|
REQUIREMENT_MODE_UNSPECIFIED |
Nieokreślony tryb wymagań. Tej wartości nie należy używać. |
PERFORMED_BY_SAME_VEHICLE |
W tym trybie wszystkie przesyłki „zależne” muszą być przewożone tym samym pojazdem co co najmniej jedna przesyłka „wymagana”. |
IN_SAME_VEHICLE_AT_PICKUP_TIME |
W trybie „Odbiór przesyłki zależnej” musi więc spełniać jeden z tych warunków:
|
IN_SAME_VEHICLE_AT_DELIVERY_TIME |
Tak jak wcześniej, z wyjątkiem przesyłek zależnych, które muszą być „wymagane” w momencie dostawy. |
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 offsetDuration
po rozpoczęciu „pierwszego”.
Kilka pierwszeństwa może odnosić się do tych samych (lub powiązanych) wydarzeń, np. „Odbiór B następuje po dostawie A” i „Odbiór C następuje po odbiorze B”.
Dodatkowo pierwszeństwo ma tylko wtedy, gdy obie przesyłki są realizowane, w przeciwnym razie są ignorowane.
Zapis JSON |
---|
{ "firstIsDelivery": boolean, "secondIsDelivery": boolean, "offsetDuration": string, "firstIndex": integer, "secondIndex": integer } |
Pola | |
---|---|
firstIsDelivery |
Wskazuje, czy „pierwsze” zdarzenie to dostawa. |
secondIsDelivery |
Wskazuje, czy „drugie” zdarzenie to dostawa. |
offsetDuration |
Przesunięcie między pierwszym a drugim zdarzeniem. Może być ujemna. Czas trwania w sekundach składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „ |
firstIndex |
Indeks dostawy „pierwszego” zdarzenia. To pole musi być określone. |
secondIndex |
Indeks dostawy „drugiego” zdarzenia. To pole musi być określone. |