ShipmentModel

Model dostawy zawiera zestaw dostaw, które muszą zostać zrealizowane przez zestaw pojazdów, przy jednoczesnym zminimalizowaniu ogólnego kosztu, który jest sumą:

  • koszt wyznaczania tras pojazdów (suma kosztu za łączny czas, kosztu za czas podróży i kosztu stałego dla wszystkich pojazdów).
  • kary za niezrealizowaną dostawę.
  • koszt globalnego czasu dostawy przesyłek,
Zapis JSON
{
  "shipments": [
    {
      object (Shipment)
    }
  ],
  "vehicles": [
    {
      object (Vehicle)
    }
  ],
  "objectives": [
    {
      object (Objective)
    }
  ],
  "globalStartTime": string,
  "globalEndTime": string,
  "globalDurationCostPerHour": number,
  "durationDistanceMatrices": [
    {
      object (DurationDistanceMatrix)
    }
  ],
  "durationDistanceMatrixSrcTags": [
    string
  ],
  "durationDistanceMatrixDstTags": [
    string
  ],
  "transitionAttributes": [
    {
      object (TransitionAttributes)
    }
  ],
  "shipmentTypeIncompatibilities": [
    {
      object (ShipmentTypeIncompatibility)
    }
  ],
  "shipmentTypeRequirements": [
    {
      object (ShipmentTypeRequirement)
    }
  ],
  "precedenceRules": [
    {
      object (PrecedenceRule)
    }
  ],
  "maxActiveVehicles": integer
}
Pola
shipments[]

object (Shipment)

Zbiór przesyłek, które muszą zostać zrealizowane w modelu.

vehicles[]

object (Vehicle)

Zbiór pojazdów, które mogą być używane do wykonywania wizyt.

objectives[]

object (Objective)

Zestaw celów dla tego modelu, które przekształcimy w koszty. Jeśli nie jest pusty, model wejściowy musi być bezpłatny. Aby uzyskać zmodyfikowane żądanie, użyj solvingMode = TRANSFORM_AND_RETURN_REQUEST. Pamiętaj, że w takim przypadku prośba nie zostanie rozpatrzona. Zobacz odpowiednią dokumentację.

Eksperymentalne: więcej informacji znajdziesz na stronie https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request.

globalStartTime

string (Timestamp format)

Globalny czas rozpoczęcia i zakończenia modelu: żaden czas spoza tego zakresu nie może być uznany za prawidłowy.

Przedział czasu modelu musi być krótszy niż rok, tzn. globalEndTime i globalStartTime muszą być od siebie oddalone o maksymalnie 31 536 000 sekund.

Jeśli używasz pól cost_per_*hour, możesz ustawić mniejszy interwał, aby zwiększyć wydajność (np. jeśli modelujesz pojedynczy dzień, ustaw globalne limity czasu na ten dzień). Jeśli nie zostanie ustawiona, domyślnie używana jest godzina 00:00:00 czasu UTC 1 stycznia 1970 r. (czyli sekundy: 0, nanosekundy: 0).

Korzysta ze standardu RFC 3339, w którym wygenerowane dane wyjściowe są zawsze znormalizowane do formatu Z i zawierają 0, 3, 6 lub 9 cyfr po przecinku. Akceptowane są też przesunięcia inne niż „Z”. Przykłady: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" lub "2014-10-02T15:01:23+05:30".

globalEndTime

string (Timestamp format)

Jeśli nie jest ustawiona, domyślnie używana jest godzina 00:00:00 czasu UTC, 1 stycznia 1971 r. (czyli sekundy: 31536000, nanosekundy: 0).

Korzysta ze standardu RFC 3339, w którym wygenerowane dane wyjściowe są zawsze znormalizowane do formatu Z i zawierają 0, 3, 6 lub 9 cyfr po przecinku. Akceptowane są też przesunięcia inne niż „Z”. Przykłady: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" lub "2014-10-02T15:01:23+05:30".

globalDurationCostPerHour

number

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

durationDistanceMatrices[]

object (DurationDistanceMatrix)

Określa macierze czasu trwania i odległości używane w modelu. Jeśli to pole jest puste, używane są odległości z Map Google lub odległości geodezyjne, w zależności od wartości pola useGeodesicDistances. Jeśli nie jest puste, useGeodesicDistances nie może mieć wartości true, a pola durationDistanceMatrixSrcTags i durationDistanceMatrixDstTags nie mogą być puste.

Przykłady użycia:

  • Masz 2 lokalizacje: locA i locB.
  • 1 pojazd, który rozpoczyna trasę w lokalizacji locA i kończy ją w lokalizacji locA.
  • 1 prośba o odbiór w lokalizacji B.
model {
  vehicles { startTags: "locA"  endTags: "locA" }
  shipments { pickups { tags: "locB" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixDstTags: "locA"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • Są 3 lokalizacje: locA, locB i locC.
  • 1 pojazd rozpoczynający trasę w lokalizacji locA i kończący ją w lokalizacji locB, korzystający z macierzy „fast”.
  • 1 pojazd rozpoczynający trasę w lokalizacji locB i kończący ją w lokalizacji locB, korzystający z macierzy „slow”.
  • 1 pojazd rozpoczynający trasę w lokalizacji locB i kończący ją w lokalizacji locB, korzystający z macierzy „fast”.
  • 1 prośba o odbiór w lokalizacji C.
model {
  vehicles { startTags: "locA" endTags: "locB" startTags: "fast" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "slow" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "fast" }
  shipments { pickups { tags: "locC" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixSrcTags: "locC"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrixDstTags: "locC"
  durationDistanceMatrices {
    vehicleStartTag: "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
    }
  }
  durationDistanceMatrices {
    vehicleStartTag: "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
    }
  }
}
durationDistanceMatrixSrcTags[]

string

Tagi definiujące źródła macierzy czasu trwania i macierzy odległości; durationDistanceMatrices(i).rows(j) definiuje czas trwania i odległość od wizyt z tagiem durationDistanceMatrixSrcTags(j) do innych wizyt w macierzy i.

Tagi odpowiadają VisitRequest.tags lub Vehicle.start_tags. Dana wartość VisitRequest lub Vehicle musi odpowiadać dokładnie jednemu tagowi w tym polu. Pamiętaj, że tagi źródła, miejsca docelowego i matrycy Vehicle mogą być takie same. Podobnie tagi źródła i miejsca docelowego 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 durationDistanceMatrices nie może być puste.

durationDistanceMatrixDstTags[]

string

Tagi definiujące miejsca docelowe macierzy czasu trwania i macierzy odległości; durationDistanceMatrices(i).rows(j).durations(k) (lub ) durationDistanceMatrices(i).rows(j).meters(k)) określa czas trwania (lub odległość) podróży od wizyt z tagiem durationDistanceMatrixSrcTags(j) do wizyt z tagiem durationDistanceMatrixDstTags(k) w macierzy i.

Tagi odpowiadają VisitRequest.tags lub Vehicle.start_tags. Dana wartość VisitRequest lub Vehicle musi odpowiadać dokładnie jednemu tagowi w tym polu. Pamiętaj, że tagi źródła, miejsca docelowego i matrycy Vehicle mogą być takie same. Podobnie tagi źródła i miejsca docelowego 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 durationDistanceMatrices nie może być puste.

transitionAttributes[]

object (TransitionAttributes)

Do modelu dodano atrybuty przejścia.

shipmentTypeIncompatibilities[]

object (ShipmentTypeIncompatibility)

Zbiory niezgodnych typów przesyłek (patrz ShipmentTypeIncompatibility).

shipmentTypeRequirements[]

object (ShipmentTypeRequirement)

Zestawy wymagań shipmentType (patrz ShipmentTypeRequirement).

precedenceRules[]

object (PrecedenceRule)

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

WAŻNE: użycie reguł pierwszeństwa ogranicza rozmiar problemu, który można zoptymalizować. Żądania korzystające z reguł pierwszeństwa, które obejmują wiele przesyłek, mogą zostać odrzucone.

maxActiveVehicles

integer

Ogranicza maksymalną liczbę aktywnych pojazdów. Pojazd jest aktywny, jeśli jego trasa obejmuje co najmniej 1 przesyłkę. Można go użyć do ograniczenia liczby tras w przypadku, gdy jest mniej kierowców niż pojazdów, a flota pojazdów jest niejednorodna. Optymalizacja wybierze najlepszy podzbiór pojazdów do użycia. Musi być liczbą dodatnią.

Wysyłka

Dostawa pojedynczego produktu, od jednego z miejsc odbioru do jednego z miejsc dostawy. Aby przesyłka została uznana za zrealizowaną, unikalny pojazd musi odwiedzić jedną z jej lokalizacji odbioru (i odpowiednio zmniejszyć swoje wolne miejsce), a następnie odwiedzić jedną z jej lokalizacji dostawy (i odpowiednio zwiększyć swoje wolne miejsce).

Zapis JSON
{
  "displayName": string,
  "pickups": [
    {
      object (VisitRequest)
    }
  ],
  "deliveries": [
    {
      object (VisitRequest)
    }
  ],
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "allowedVehicleIndices": [
    integer
  ],
  "costsPerVehicle": [
    number
  ],
  "costsPerVehicleIndices": [
    integer
  ],
  "pickupToDeliveryAbsoluteDetourLimit": string,
  "pickupToDeliveryTimeLimit": string,
  "shipmentType": string,
  "label": string,
  "ignore": boolean,
  "penaltyCost": number,
  "pickupToDeliveryRelativeDetourLimit": number
}
Pola
displayName

string

Zdefiniowana przez użytkownika wyświetlana nazwa przesyłki. Może mieć maksymalnie 63 znaki i zawierać znaki UTF-8.

pickups[]

object (VisitRequest)

Zestaw alternatywnych opcji odbioru powiązanych z przesyłką. Jeśli nie zostanie określony, pojazd musi tylko odwiedzić lokalizację odpowiadającą dostawom.

deliveries[]

object (VisitRequest)

Zestaw alternatywnych opcji dostawy powiązanych z przesyłką. Jeśli nie zostanie określona, pojazd musi odwiedzić tylko lokalizację odpowiadającą odbiorom.

loadDemands

map (key: string, value: object (Load))

Wymagania dotyczące ładunku przesyłki (np. waga, objętość, liczba palet itp.). Klucze na mapie powinny być identyfikatorami opisującymi typ odpowiedniego obciążenia, najlepiej z uwzględnieniem jednostek. Na przykład: „weight_kg”, „volume_gallons”, „pallet_count” itp. Jeśli dany klucz nie pojawia się na mapie, odpowiednie obciążenie jest traktowane jako null.

allowedVehicleIndices[]

integer

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

costsPerVehicle[]

number

Określa koszt ponoszony, gdy ta przesyłka jest dostarczana przez każdy pojazd. Jeśli jest określony, musi mieć JEDNĄ z tych wartości:

  • taką samą liczbę elementów jak costsPerVehicleIndices. costsPerVehicle[i] odpowiada pojazdowi costsPerVehicleIndices[i] modelu.
  • taką samą liczbę elementów, ile jest pojazdów w modelu. Element i-ty odpowiada pojazdowi #i modelu.

Te koszty muszą być podane w tej samej jednostce co penaltyCost i nie mogą być ujemne. Jeśli nie ma takich kosztów, pozostaw to pole puste.

costsPerVehicleIndices[]

integer

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

pickupToDeliveryAbsoluteDetourLimit

string (Duration format)

Określa maksymalny bezwzględny czas objazdu w porównaniu z najkrótszą trasą od odbioru do dostawy. Jeśli jest określona, musi być nieujemna, a przesyłka musi zawierać co najmniej odbiór i dostawę.

Załóżmy na przykład, że t to najkrótszy czas potrzebny na przejazd z wybranej alternatywy odbioru bezpośrednio do wybranej alternatywy dostawy. Ustawienie pickupToDeliveryAbsoluteDetourLimit wymusza:

startTime(delivery) - startTime(pickup) <=
t + pickupToDeliveryAbsoluteDetourLimit

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

pickupToDeliveryTimeLimit

string (Duration format)

Określa maksymalny czas od rozpoczęcia odbioru do rozpoczęcia dostawy przesyłki. Jeśli jest określona, musi być nieujemna, a przesyłka musi zawierać co najmniej odbiór i dostawę. Nie zależy to od tego, które alternatywy zostały wybrane do odbioru i dostawy, ani od prędkości pojazdu. Można to określić razem z ograniczeniami maksymalnego objazdu – rozwiązanie będzie uwzględniać obie specyfikacje.

shipmentType

string

Niepusty ciąg znaków określający „typ” tej przesyłki. Ta funkcja może służyć do definiowania niezgodności lub wymagań między shipment_types (patrz shipmentTypeIncompatibilities i shipmentTypeRequirements w ShipmentModel).

Różni się od pola visitTypes, które jest określone dla pojedynczej wizyty: wszystkie odbiory i dostawy należące do tej samej przesyłki mają to samo pole shipmentType.

label

string

Określa etykietę tej przesyłki. Ta etykieta jest raportowana w odpowiedzi w polu shipmentLabel odpowiedniego elementu ShipmentRoute.Visit.

ignore

boolean

Jeśli ma wartość prawda, pomiń tę przesyłkę, ale nie stosuj kary penaltyCost.

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

Ignorowanie dostawy, która jest realizowana w injectedFirstSolutionRoutes lub injectedSolutionConstraint, jest dozwolone. Solver usuwa powiązane wizyty odbioru/dostawy z realizowanej trasy. precedenceRules, które odwołują się do ignorowanych przesyłek, również będą ignorowane.

penaltyCost

number

Jeśli dostawa nie zostanie zrealizowana, ta kara zostanie dodana do łącznego kosztu tras. Przesyłka jest uznawana za zrealizowaną, jeśli odwiedzono jeden z alternatywnych punktów odbioru i dostawy. Koszt może być wyrażony w tej samej jednostce, która jest używana we wszystkich innych polach związanych z kosztami w modelu, i musi być dodatni.

WAŻNE: jeśli ta kara nie jest określona, jest uważana za nieskończoną, tzn. dostawa musi zostać zrealizowana.

pickupToDeliveryRelativeDetourLimit

number

Określa maksymalny względny czas objazdu w porównaniu z najkrótszą trasą od odbioru do dostawy. Jeśli jest określona, musi być nieujemna, a przesyłka musi zawierać co najmniej odbiór i dostawę.

Załóżmy na przykład, że t to najkrótszy czas potrzebny na przejazd z wybranej alternatywy odbioru bezpośrednio do wybranej alternatywy dostawy. Ustawienie pickupToDeliveryRelativeDetourLimit wymusza:

startTime(delivery) - startTime(pickup) <=
std::ceil(t * (1.0 + pickupToDeliveryRelativeDetourLimit))

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

VisitRequest

Prośba o wizytę, którą może wykonać pojazd: ma geolokalizację (lub 2, patrz poniżej), godziny otwarcia i zamknięcia reprezentowane przez okna czasowe oraz czas trwania usługi (czas spędzony przez pojazd po przybyciu w celu odbioru lub dostarczenia towarów).

Zapis JSON
{
  "arrivalLocation": {
    object (LatLng)
  },
  "arrivalWaypoint": {
    object (Waypoint)
  },
  "departureLocation": {
    object (LatLng)
  },
  "departureWaypoint": {
    object (Waypoint)
  },
  "tags": [
    string
  ],
  "timeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "duration": string,
  "cost": number,
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "visitTypes": [
    string
  ],
  "label": string,
  "avoidUTurns": boolean
}
Pola
arrivalLocation

object (LatLng)

Geolokalizacja, do której pojazd dociera podczas wykonywania tego działania (VisitRequest). Jeśli model przesyłki zawiera macierze czasu trwania i odległości, nie można określić parametru arrivalLocation.

arrivalWaypoint

object (Waypoint)

Punkt, do którego pojazd dociera podczas wykonywania tego działania (VisitRequest). Jeśli model przesyłki zawiera macierze czasu trwania i odległości, nie można określić parametru arrivalWaypoint.

departureLocation

object (LatLng)

Lokalizacja geograficzna, z której pojazd odjeżdża po zakończeniu tego zadania (VisitRequest). Można pominąć, jeśli jest taki sam jak arrivalLocation. Jeśli model przesyłki zawiera macierze czasu trwania i odległości, nie można określić parametru departureLocation.

departureWaypoint

object (Waypoint)

Punkt na trasie, z którego pojazd odjeżdża po zakończeniu tego zadania (VisitRequest). Można pominąć, jeśli jest taki sam jak arrivalWaypoint. Jeśli model przesyłki zawiera macierze czasu trwania i odległości, nie można określić parametru departureWaypoint.

tags[]

string

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

timeWindows[]

object (TimeWindow)

Przedziały czasu, które ograniczają czas przybycia na wizytę. Pamiętaj, że pojazd może odjechać poza przedziałem czasu przyjazdu, tzn. czas przyjazdu + czas trwania nie muszą mieścić się w przedziale czasu. Jeśli pojazd przyjedzie przed TimeWindow.start_time, może to spowodować czas oczekiwania.

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

Przedziały czasu muszą być rozłączne, tzn.żaden przedział czasu nie może nakładać się na inny ani z nim sąsiadować. Muszą być też podane w kolejności rosnącej.

Wartości costPerHourAfterSoftEndTime i softEndTime można ustawić tylko wtedy, gdy jest tylko jedno okno czasowe.

duration

string (Duration format)

Czas trwania wizyty, czyli czas spędzony przez pojazd między przyjazdem a odjazdem (należy dodać do możliwego czasu oczekiwania; patrz timeWindows).

cost

number

Koszt obsługi tej prośby o wizytę na trasie pojazdu. Można go użyć do opłacenia różnych kosztów za każdą alternatywną opcję odbioru lub dostawy przesyłki. Ten koszt musi być podany w tej samej jednostce co Shipment.penalty_cost i nie może być ujemny.

loadDemands

map (key: string, value: object (Load))

Wczytaj wymagania dotyczące tej prośby o wizytę. To pole jest podobne do pola Shipment.load_demands, ale dotyczy tylko tego elementu VisitRequest, a nie całego elementu Shipment. Wymagania wymienione tutaj są dodawane do wymagań wymienionych w pliku Shipment.load_demands.

visitTypes[]

string

Określa typy wizyt. Można go użyć do przydzielenia dodatkowego czasu wymaganego do zrealizowania wizyty przez pojazd (patrz Vehicle.extra_visit_duration_for_visit_type).

Typ może pojawić się tylko raz.

label

string

Określa etykietę dla tego elementu: VisitRequest. Ta etykieta jest raportowana w odpowiedzi jako visitLabel w odpowiednim polu ShipmentRoute.Visit.

avoidUTurns

boolean

Określa, czy na trasach dojazdu w tej lokalizacji należy unikać zawracania. Unikanie zawracania jest realizowane w miarę możliwości i nie gwarantujemy, że uda się całkowicie uniknąć takich manewrów. To funkcja eksperymentalna, której działanie może ulec zmianie.

Funkcja eksperymentalna: więcej informacji znajdziesz na stronie https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request.

LatLng

Obiekt reprezentujący parę współrzędnych szerokości i długości geograficznej. Jest ona wyrażona jako para liczb zmiennoprzecinkowych podwójnej precyzji, które reprezentują stopnie szerokości i długości geograficznej. O ile nie określono inaczej, ten obiekt musi być zgodny ze standardem WGS84. Wartości muszą mieścić się w znormalizowanych zakresach.

Zapis JSON
{
  "latitude": number,
  "longitude": number
}
Pola
latitude

number

Szerokość geograficzna w stopniach. Musi mieścić się w zakresie [-90,0, +90,0].

longitude

number

Długość geograficzna w stopniach. Musi mieścić się w zakresie [-180.0, +180.0].

Punkt pośredni

Hermetyzuje punkt na trasie. Punkty pośrednie oznaczają lokalizacje przyjazdu i odjazdu w przypadku żądań wizyty oraz lokalizacje początkowe i końcowe pojazdów.

Zapis JSON
{
  "sideOfRoad": boolean,
  "vehicleStopover": boolean,

  // The following is a list of mutually exclusive fields. At most one of the
  // fields will be set in a response:
  "location": {
    object (Location)
  },
  "placeId": string
  // End of mutually exclusive fields.
}
Pola
sideOfRoad

boolean

Opcjonalnie: Wskazuje, że lokalizacja tego punktu na trasie ma preferować zatrzymanie pojazdu po określonej stronie drogi. Gdy ustawisz tę wartość, trasa będzie przebiegać przez lokalizację, dzięki czemu pojazd będzie mógł zatrzymać się po tej stronie drogi, po której znajduje się lokalizacja. Ta opcja nie działa w przypadku trybu podróży „WALKING”.

vehicleStopover

boolean

Wskazuje, że punkt pośredni jest przeznaczony dla pojazdów, które mają się zatrzymać, aby odebrać lub wysadzić pasażera. Ta opcja działa tylko w trybie podróży „DRIVING” i gdy „locationType” to „location”.

Eksperymentalne: działanie lub obecność tego pola może się zmienić w przyszłości.

Różne sposoby reprezentowania lokalizacji. Poniżej znajduje się lista pól, które wzajemnie się wykluczają. W odpowiedzi zostanie ustawione co najwyżej jedno z tych pól:
location

object (Location)

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

placeId

string

Identyfikator miejsca POI powiązany z punktem na trasie.

Jeśli używasz identyfikatora miejsca do określenia lokalizacji przyjazdu lub odjazdu w VisitRequest, użyj identyfikatora miejsca, który jest wystarczająco szczegółowy, aby określić lokalizację LatLng na potrzeby nawigacji do tego miejsca. Na przykład identyfikator miejsca reprezentujący budynek jest odpowiedni, ale identyfikator miejsca reprezentujący drogę nie jest zalecany.

Koniec pól wykluczających się wzajemnie.

Lokalizacja

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

Zapis JSON
{
  "latLng": {
    object (LatLng)
  },
  "heading": integer
}
Pola
latLng

object (LatLng)

Współrzędne geograficzne punktu na trasie.

heading

integer

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

TimeWindow

Okna czasowe ograniczają czas zdarzenia, np. czas przybycia na wizytę lub czas rozpoczęcia i zakończenia trasy pojazdu.

Sztywne granice przedziału czasu, startTime i endTime, wymuszają najwcześniejszy i najpóźniejszy czas zdarzenia, tak aby startTime <= event_time <= endTime. Dolna granica elastycznego okna czasowego, softStartTime, wyraża preferencję, aby zdarzenie miało miejsce o softStartTime lub później, przez naliczenie kosztu proporcjonalnego do czasu, jaki upłynął przed wystąpieniem zdarzenia softStartTime. Górna granica elastycznego okna czasowego, softEndTime, wyraża preferencję, aby zdarzenie miało miejsce o softEndTime lub wcześniej, przez naliczenie kosztu proporcjonalnego do czasu, jaki upłynął od softEndTime do wystąpienia zdarzenia. startTime, endTime, softStartTime i softEndTime powinny mieścić się w globalnych limitach czasu (patrz ShipmentModel.global_start_time i ShipmentModel.global_end_time) i powinny uwzględniać:

  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

string (Timestamp format)

Czas rozpoczęcia sztywnego przedziału czasu. Jeśli nie zostanie określony, zostanie ustawiony na ShipmentModel.global_start_time.

Korzysta ze standardu RFC 3339, w którym wygenerowane dane wyjściowe są zawsze znormalizowane do formatu Z i zawierają 0, 3, 6 lub 9 cyfr po przecinku. Akceptowane są też przesunięcia inne niż „Z”. Przykłady: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" lub "2014-10-02T15:01:23+05:30".

endTime

string (Timestamp format)

Czas zakończenia sztywnego przedziału czasu. Jeśli nie zostanie określony, zostanie ustawiony na ShipmentModel.global_end_time.

Korzysta ze standardu RFC 3339, w którym wygenerowane dane wyjściowe są zawsze znormalizowane do formatu Z i zawierają 0, 3, 6 lub 9 cyfr po przecinku. Akceptowane są też przesunięcia inne niż „Z”. Przykłady: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" lub "2014-10-02T15:01:23+05:30".

softStartTime

string (Timestamp format)

Czas rozpoczęcia „miękkiego” okna czasowego.

Korzysta ze standardu RFC 3339, w którym wygenerowane dane wyjściowe są zawsze znormalizowane do formatu Z i zawierają 0, 3, 6 lub 9 cyfr po przecinku. Akceptowane są też przesunięcia inne niż „Z”. Przykłady: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" lub "2014-10-02T15:01:23+05:30".

softEndTime

string (Timestamp format)

Miękki czas zakończenia przedziału czasu.

Korzysta ze standardu RFC 3339, w którym wygenerowane dane wyjściowe są zawsze znormalizowane do formatu Z i zawierają 0, 3, 6 lub 9 cyfr po przecinku. Akceptowane są też przesunięcia inne niż „Z”. Przykłady: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" lub "2014-10-02T15:01:23+05:30".

costPerHourBeforeSoftStartTime

number

Koszt za godzinę dodawany do innych kosztów w modelu, jeśli zdarzenie występuje przed czasem softStartTime, obliczany w ten sposób:

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

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

costPerHourAfterSoftEndTime

number

Koszt za godzinę dodawany do innych kosztów w modelu, jeśli zdarzenie występuje po softEndTime, obliczany w następujący sposób:

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

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

Pojazd

Modeluje pojazd w problemie z wysyłką. Rozwiązanie problemu z przesyłką spowoduje utworzenie trasy dla tego pojazdu, która zaczyna się w lokalizacji startLocation i kończy w lokalizacji endLocation. Trasa to sekwencja wizyt (patrz ShipmentRoute).

Zapis JSON
{
  "displayName": string,
  "travelMode": enum (TravelMode),
  "routeModifiers": {
    object (RouteModifiers)
  },
  "startLocation": {
    object (LatLng)
  },
  "startWaypoint": {
    object (Waypoint)
  },
  "endLocation": {
    object (LatLng)
  },
  "endWaypoint": {
    object (Waypoint)
  },
  "startTags": [
    string
  ],
  "endTags": [
    string
  ],
  "startTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "endTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "unloadingPolicy": enum (UnloadingPolicy),
  "loadLimits": {
    string: {
      object (LoadLimit)
    },
    ...
  },
  "costPerHour": number,
  "costPerTraveledHour": number,
  "costPerKilometer": number,
  "fixedCost": number,
  "usedIfRouteIsEmpty": boolean,
  "routeDurationLimit": {
    object (DurationLimit)
  },
  "travelDurationLimit": {
    object (DurationLimit)
  },
  "routeDistanceLimit": {
    object (DistanceLimit)
  },
  "extraVisitDurationForVisitType": {
    string: string,
    ...
  },
  "breakRule": {
    object (BreakRule)
  },
  "label": string,
  "ignore": boolean,
  "travelDurationMultiple": number
}
Pola
displayName

string

Zdefiniowana przez użytkownika wyświetlana nazwa pojazdu. Może mieć maksymalnie 63 znaki i zawierać znaki UTF-8.

travelMode

enum (TravelMode)

Tryb podróży, który wpływa na drogi, po których może poruszać się pojazd, i jego prędkość. Zobacz też travelDurationMultiple.

routeModifiers

object (RouteModifiers)

Zbiór warunków, które należy spełnić, wpływających na sposób obliczania tras dla danego pojazdu.

startLocation

object (LatLng)

Położenie geograficzne, w którym pojazd zaczyna trasę, zanim odbierze przesyłki. Jeśli nie zostanie określona, pojazd rozpocznie trasę od pierwszego odbioru. Jeśli model dostawy zawiera macierze czasu trwania i odległości, nie można określić parametru startLocation.

startWaypoint

object (Waypoint)

Punkt pośredni reprezentujący położenie geograficzne, w którym pojazd zaczyna trasę, zanim odbierze przesyłki. Jeśli nie określono ani startWaypoint, ani startLocation, pojazd rozpoczyna trasę od pierwszego odbioru. Jeśli model dostawy zawiera macierze czasu trwania i odległości, nie można określić parametru startWaypoint.

endLocation

object (LatLng)

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

endWaypoint

object (Waypoint)

Punkt na trasie reprezentujący położenie geograficzne, w którym pojazd kończy jazdę po zakończeniu ostatniego zadania (VisitRequest). Jeśli nie określono ani endWaypoint, ani endLocation, ShipmentRoute pojazdu kończy się natychmiast po zakończeniu ostatniej VisitRequest. Jeśli model dostawy zawiera macierze czasu trwania i odległości, nie można określić parametru endWaypoint.

startTags[]

string

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

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

endTags[]

string

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

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

startTimeWindows[]

object (TimeWindow)

Okna czasowe, w których pojazd może opuścić lokalizację początkową. Muszą mieścić się w globalnych limitach czasu (patrz pola ShipmentModel.global_*). Jeśli nie określisz tej wartości, nie będzie żadnych ograniczeń poza globalnymi limitami czasu.

Okna czasowe należące do tego samego pola powtarzanego muszą być rozłączne, tzn. żadne okno czasowe nie może nakładać się na inne ani z nim sąsiadować, i muszą być uporządkowane chronologicznie.

Wartości costPerHourAfterSoftEndTime i softEndTime można ustawić tylko wtedy, gdy jest tylko jedno okno czasowe.

endTimeWindows[]

object (TimeWindow)

Przedziały czasu, w których pojazd może dotrzeć do lokalizacji końcowej. Muszą mieścić się w globalnych limitach czasu (patrz pola ShipmentModel.global_*). Jeśli nie określisz tej wartości, nie będzie żadnych ograniczeń poza globalnymi limitami czasu.

Okna czasowe należące do tego samego pola powtarzanego muszą być rozłączne, tzn. żadne okno czasowe nie może nakładać się na inne ani z nim sąsiadować, i muszą być uporządkowane chronologicznie.

Wartości costPerHourAfterSoftEndTime i softEndTime można ustawić tylko wtedy, gdy jest tylko jedno okno czasowe.

unloadingPolicy

enum (UnloadingPolicy)

Zasada rozładunku obowiązująca w pojeździe.

loadLimits

map (key: string, value: object (LoadLimit))

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

costPerHour

number

Koszty pojazdu: wszystkie koszty sumują się i muszą być podane w tej samej jednostce co Shipment.penalty_cost.

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

costPerTraveledHour

number

Koszt godziny podróży na trasie pojazdu. Ten koszt jest stosowany tylko do czasu podróży na trasie (czyli czasu podanego w polu ShipmentRoute.transitions) i nie obejmuje czasu oczekiwania ani czasu wizyty.

costPerKilometer

number

Koszt za kilometr trasy pojazdu. Ten koszt jest stosowany do odległości podanej w polu ShipmentRoute.transitions i nie dotyczy odległości przebytej między polami arrivalLocation i departureLocation w ramach jednego pola VisitRequest.

fixedCost

number

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

usedIfRouteIsEmpty

boolean

To pole dotyczy tylko pojazdów, których trasa nie obejmuje żadnych przesyłek. Wskazuje, czy w tym przypadku pojazd powinien być uznawany za używany.

Jeśli ma wartość „true”, pojazd jedzie z lokalizacji początkowej do końcowej, nawet jeśli nie obsługuje żadnych przesyłek, a koszty czasu i odległości wynikające z podróży z lokalizacji początkowej do końcowej są brane pod uwagę.

W przeciwnym razie nie przemieszcza się z lokalizacji początkowej do końcowej i nie są dla niego planowane żadne breakRule ani opóźnienia (z TransitionAttributes). W takim przypadku ShipmentRoute pojazdu nie zawiera żadnych informacji oprócz indeksu i etykiety pojazdu.

routeDurationLimit

object (DurationLimit)

Limit stosowany do łącznego czasu trwania trasy pojazdu. W danym OptimizeToursResponse czas trwania trasy pojazdu to różnica między vehicleEndTime a vehicleStartTime.

travelDurationLimit

object (DurationLimit)

Limit stosowany do czasu podróży na trasie pojazdu. W danym OptimizeToursResponse czas trwania podróży na trasie jest sumą wszystkich transitions.travel_duration.

routeDistanceLimit

object (DistanceLimit)

Limit zastosowany do łącznej odległości trasy pojazdu. W danym OptimizeToursResponse odległość trasy jest sumą wszystkich transitions.travel_distance_meters.

extraVisitDurationForVisitType

map (key: string, value: string (Duration format))

Określa mapowanie ciągów znaków visitTypes na czas trwania. Czas trwania to czas dodatkowy do VisitRequest.duration, który należy uwzględnić podczas wizyt z określonym visitTypes. Ten dodatkowy czas wizyty zwiększa koszt, jeśli określono parametr costPerHour. Klucze (np. visitTypes) nie mogą być pustymi ciągami znaków.

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

breakRule

object (BreakRule)

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

label

string

Określa etykietę tego pojazdu. Ta etykieta jest raportowana w odpowiedzi jako vehicleLabel odpowiedniego elementu ShipmentRoute.

ignore

boolean

Jeśli ma wartość true, parametr usedIfRouteIsEmpty musi mieć wartość false, a ten pojazd pozostanie nieużywany.

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

Jeśli przesyłka jest realizowana przez ignorowany pojazd w injectedSolutionConstraint, a powiązany odbiór lub dostawa muszą pozostać w pojeździe (czyli nie są rozluźnione do poziomu RELAX_ALL_AFTER_THRESHOLD), są pomijane w odpowiedzi. Jeśli przesyłka ma niepuste pole allowedVehicleIndices, a wszystkie dozwolone pojazdy są ignorowane, jest ona pomijana w odpowiedzi.

travelDurationMultiple

number

Określa współczynnik, który można wykorzystać do zwiększenia lub zmniejszenia czasu podróży tego pojazdu. Na przykład ustawienie wartości 2,0 oznacza, że pojazd jest wolniejszy, a czas podróży jest 2 razy dłuższy niż w przypadku standardowych pojazdów. Ta wielokrotność nie ma wpływu na czas trwania wizyt. Ma to wpływ na koszt, jeśli określono costPerHour lub costPerTraveledHour. Musi mieścić się w zakresie [0,001; 1000,0]. Jeśli nie zostanie ustawiony, pojazd jest standardowy, a mnożnik wynosi 1,0.

OSTRZEŻENIE: czasy podróży zostaną zaokrąglone do najbliższej sekundy po zastosowaniu tej wielokrotności, ale przed wykonaniem jakichkolwiek operacji numerycznych, więc mała wielokrotność może spowodować utratę precyzji.

Zobacz też extraVisitDurationForVisitType poniżej.

TravelMode

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

Powinien to być podzbiór środków transportu dostępnych w interfejsie Routes API Google Maps Platform. Więcej informacji znajdziesz na stronie https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteTravelMode.

Uwaga: trasy WALKING są w wersji beta i czasami mogą nie uwzględniać chodników lub ścieżek dla pieszych. Musisz wyświetlać to ostrzeżenie użytkownikowi w przypadku wszystkich tras pieszych, które wyświetlasz w aplikacji.

Wartości w polu enum
TRAVEL_MODE_UNSPECIFIED Nieokreślony środek transportu, odpowiednik DRIVING.
DRIVING Tryb podróży odpowiadający wskazówkom dojazdu (samochód, ...).
WALKING Tryb podróży odpowiadający trasie pieszej.
TWO_WHEELER Dwukołowy pojazd silnikowy. Na przykład motocykl. Pamiętaj, że różni się on od trybu BICYCLING, który obejmuje tryb napędzany siłą mięśni. Ten tryb podróży jest obsługiwany tylko w krajach wymienionych w artykule Kraje i regiony, w których obsługiwane są pojazdy dwukołowe.

RouteModifiers

Zawiera zestaw opcjonalnych warunków, które należy spełnić podczas obliczania tras pojazdów. Jest to podobne do RouteModifiers w interfejsie Routes Preferred API Google Maps Platform. Więcej informacji znajdziesz na stronie https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.

Zapis JSON
{
  "avoidTolls": boolean,
  "avoidHighways": boolean,
  "avoidFerries": boolean,
  "avoidIndoor": boolean
}
Pola
avoidTolls

boolean

Określa, czy w miarę możliwości unikać dróg płatnych. Preferowane będą trasy, które nie zawierają dróg płatnych. Dotyczy tylko zmotoryzowanych środków transportu.

avoidHighways

boolean

Określa, czy w miarę możliwości unikać autostrad. Preferowane będą trasy, które nie obejmują autostrad. Dotyczy tylko zmotoryzowanych środków transportu.

avoidFerries

boolean

Określa, czy w miarę możliwości unikać promów. Preferowane będą trasy, które nie obejmują podróży promem. Dotyczy tylko zmotoryzowanych środków transportu.

avoidIndoor

boolean

Opcjonalnie: Określa, czy w miarę możliwości unikać nawigacji w budynkach. Preferowane będą trasy, które nie zawierają nawigacji wewnątrz budynków. Dotyczy tylko trybu podróży WALKING.

UnloadingPolicy

Zasady dotyczące sposobu rozładunku pojazdu. Dotyczy tylko przesyłek, które mają zarówno odbiór, jak i dostawę.

Inne przesyłki mogą być dostarczane w dowolnym miejscu na trasie niezależnie od przesyłki unloadingPolicy.

Wartości w polu enum
UNLOADING_POLICY_UNSPECIFIED Nieokreślona zasada rozładunku; dostawy muszą być realizowane po odpowiadających im odbiorach.
LAST_IN_FIRST_OUT Dostawy muszą być realizowane w odwrotnej kolejności niż odbiory
FIRST_IN_FIRST_OUT Dostawy muszą odbywać się w tej samej kolejności co odbiory

LoadLimit

Określa limit obciążenia pojazdu, np. „ta ciężarówka może przewozić tylko do 3500 kg”. Zobacz loadLimits.

Zapis JSON
{
  "softMaxLoad": string,
  "costPerUnitAboveSoftMax": number,
  "startLoadInterval": {
    object (Interval)
  },
  "endLoadInterval": {
    object (Interval)
  },
  "maxLoad": string,
  "costPerKilometer": {
    object (LoadCost)
  },
  "costPerTraveledHour": {
    object (LoadCost)
  }
}
Pola
softMaxLoad

string (int64 format)

Limit obciążenia. Zobacz costPerUnitAboveSoftMax.

costPerUnitAboveSoftMax

number

Jeśli obciążenie na trasie tego pojazdu przekroczy softMaxLoad, zostanie naliczona następująca kara (tylko raz na pojazd): (obciążenie – softMaxLoad) * costPerUnitAboveSoftMax. Wszystkie koszty sumują się i muszą być podane w tej samej jednostce co Shipment.penalty_cost. Limity miękkie można definiować tylko w przypadku typów, które w całym modelu dotyczą tylko odbiorów lub tylko dostaw.

startLoadInterval

object (Interval)

Dopuszczalny przedział obciążenia pojazdu na początku trasy.

endLoadInterval

object (Interval)

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

maxLoad

string (int64 format)

Maksymalna dopuszczalna wielkość obciążenia.

costPerKilometer

object (LoadCost)

Koszt przemieszczenia 1 jednostki ładunku na odległość 1 kilometra tym pojazdem. Można go używać jako wskaźnika zużycia paliwa: jeśli obciążenie jest wagą (w niutonach), to obciążenie*kilometr ma wymiar energii.

Eksperymentalne: więcej informacji znajdziesz na stronie https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.

costPerTraveledHour

object (LoadCost)

Koszt podróży z jednostką ładunku przez godzinę w przypadku tego pojazdu.

Eksperymentalne: więcej informacji znajdziesz na stronie https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.

Interwał

Przedział akceptowalnych wartości obciążenia.

Zapis JSON
{
  "min": string,
  "max": string
}
Pola
min

string (int64 format)

Minimalne akceptowalne obciążenie. Musi być ≥ 0. Jeśli podano obie wartości, min musi być mniejsze lub równe max.

max

string (int64 format)

Maksymalne dopuszczalne obciążenie. Musi być ≥ 0. Jeśli nie zostanie określone, maksymalne obciążenie nie będzie ograniczone przez tę wiadomość. Jeśli podano obie wartości, min musi być mniejsze lub równe max.

LoadCost

Koszt przeniesienia 1 jednostki obciążenia w ciągu Transition. W przypadku danego obciążenia koszt jest sumą 2 części:

  • min(load, loadThreshold) * costPerUnitBelowThreshold
  • max(0, load - loadThreshold) * costPerUnitAboveThreshold

Przy tym koszcie rozwiązania wolą najpierw dostarczać duże zapotrzebowanie lub, co jest równoważne, odbierać duże zapotrzebowanie na końcu. Jeśli na przykład pojazd ma

load_limit {
  key: "weight"
  value {
    costPerKilometer {
      loadThreshold: 15
      costPerUnitBelowThreshold: 2.0
      costPerUnitAboveThreshold: 10.0
    }
  }
}

a jej trasa to start,odbiór,odbiór,dostawa,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: 20 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }

to koszt poniesiony przez ten pojazd LoadCost wynosi (cost_below * load_below * kilometry + cost_above * load_above * kilometry)

  • 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

Wartość LoadCost na trasie wynosi więc 120,0.

Jeśli jednak trasa to początek, 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 }

to koszt poniesiony przez ten element LoadCost wynosi

  • przejście 0: 0.0
  • przejście 1: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
  • przejście 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 wartość LoadCost na trasie wynosi 40,0.

LoadCost sprawia, że rozwiązania z dużą liczbą przejść są droższe.

Eksperymentalne: więcej informacji znajdziesz na stronie https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.

Zapis JSON
{
  "loadThreshold": string,
  "costPerUnitBelowThreshold": number,
  "costPerUnitAboveThreshold": number
}
Pola
loadThreshold

string (int64 format)

Ilość ładunku, powyżej której koszt przeniesienia jednostki ładunku zmienia się z costPerUnitBelowThreshold na costPerUnitAboveThreshold. Musi być większa lub równa 0.

costPerUnitBelowThreshold

number

Koszt przeniesienia jednostki ładunku dla każdej jednostki między 0 a progiem. Musi być wartością skończoną i większą lub równą 0.

costPerUnitAboveThreshold

number

Koszt przeniesienia jednostki ładunku dla każdej jednostki powyżej progu. W szczególnym przypadku, gdy próg = 0, jest to stały koszt jednostkowy. Musi być wartością skończoną i większą lub równą 0.

DurationLimit

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

Jeśli zdefiniowane jest pole limitu miękkiego, należy zdefiniować zarówno próg maksymalny, jak i powiązany z nim koszt.

Zapis JSON
{
  "maxDuration": string,
  "softMaxDuration": string,
  "quadraticSoftMaxDuration": string,
  "costPerHourAfterSoftMax": number,
  "costPerSquareHourAfterQuadraticSoftMax": number
}
Pola
maxDuration

string (Duration format)

Ścisły limit ograniczający czas trwania do maksymalnie maxDuration.

softMaxDuration

string (Duration format)

Limit miękki nie wymusza maksymalnego limitu czasu trwania, ale jego przekroczenie powoduje, że trasa generuje koszt. Ten koszt jest dodawany do innych kosztów zdefiniowanych w modelu, z tą samą jednostką.

Jeśli podasz właściwość softMaxDuration, nie może ona być ujemna. Jeśli zdefiniowano też właściwość maxDuration, wartość softMaxDuration musi być mniejsza niż maxDuration.

quadraticSoftMaxDuration

string (Duration format)

Limit miękki nie wymusza maksymalnego limitu czasu trwania, ale gdy zostanie naruszony, trasa generuje koszt, który jest kwadratem czasu trwania. Ten koszt jest dodawany do innych kosztów zdefiniowanych w modelu, z tą samą jednostką.

Jeśli ustawiono quadraticSoftMaxDuration, muszą być spełnione te warunki:

  • Wartość nie może być ujemna.
  • Wartość maxDuration musi być zdefiniowana.
  • Wartość quadraticSoftMaxDuration musi być mniejsza niż maxDuration.
  • Różnica nie może przekraczać 1 dnia: maxDuration - quadraticSoftMaxDuration <= 86400 seconds
costPerHourAfterSoftMax

number

Koszt za godzinę naliczany w przypadku przekroczenia progu softMaxDuration. Jeśli czas trwania jest krótszy niż próg, dodatkowy koszt wynosi 0. W przeciwnym razie koszt zależy od czasu trwania w następujący sposób:

  costPerHourAfterSoftMax * (duration - softMaxDuration)

Koszt nie może być ujemny.

costPerSquareHourAfterQuadraticSoftMax

number

Koszt za godzinę kwadratową naliczany w przypadku przekroczenia progu quadraticSoftMaxDuration.

Jeśli czas trwania jest krótszy niż próg, dodatkowy koszt wynosi 0. W przeciwnym razie koszt zależy od czasu trwania w następujący sposób:

  costPerSquareHourAfterQuadraticSoftMax *
  (duration - quadraticSoftMaxDuration)^2

Koszt nie może być ujemny.

DistanceLimit

Limit określający maksymalną odległość, jaką można przebyć. Może być twardy lub miękki.

Jeśli zdefiniowano limit miękki, należy zdefiniować zarówno softMaxMeters, jak i costPerKilometerAboveSoftMax, i muszą one być nieujemne.

Zapis JSON
{
  "maxMeters": string,
  "softMaxMeters": string,
  "costPerKilometerBelowSoftMax": number,
  "costPerKilometerAboveSoftMax": number
}
Pola
maxMeters

string (int64 format)

Ścisły limit ograniczający odległość do maksymalnie maxMeters. Limit nie może być liczbą ujemną.

softMaxMeters

string (int64 format)

Limit miękki nie wymusza maksymalnego limitu odległości, ale jego naruszenie powoduje naliczenie kosztu, który jest dodawany do innych kosztów zdefiniowanych w modelu, z tą samą jednostką.

Jeśli zdefiniowano parametr softMaxMeters, musi on być mniejszy niż maxMeters i nieujemny.

costPerKilometerBelowSoftMax

number

Koszt poniesiony na kilometr, który wzrasta do softMaxMeters, obliczany według wzoru:

  min(distanceMeters, softMaxMeters) / 1000.0 *
  costPerKilometerBelowSoftMax.

Ten koszt nie jest obsługiwany w: routeDistanceLimit.

costPerKilometerAboveSoftMax

number

Koszt za kilometr naliczany, jeśli odległość przekracza limit softMaxMeters. Dodatkowy koszt wynosi 0, jeśli odległość jest mniejsza niż limit. W przeciwnym razie koszt jest obliczany według tego wzoru:

  (distanceMeters - softMaxMeters) / 1000.0 *
  costPerKilometerAboveSoftMax.

Koszt nie może być ujemny.

BreakRule

Reguły generowania przerw dla pojazdu (np. przerw na lunch). Przerwa to ciągły okres, podczas którego pojazd pozostaje bezczynny w obecnej pozycji i nie może wykonywać żadnych wizyt. Przerwa może wystąpić:

  • podczas podróży między 2 wizytami (co obejmuje czas tuż przed wizytą lub tuż po niej, ale nie w jej trakcie) – w takim przypadku wydłuża odpowiedni czas przejazdu między wizytami;
  • lub przed rozpoczęciem pracy pojazdu (pojazd nie może rozpocząć pracy w środku przerwy), w którym to przypadku nie ma wpływu na czas rozpoczęcia pracy pojazdu.
  • lub po zakończeniu jazdy (podobnie, z godziną zakończenia jazdy).
Zapis JSON
{
  "breakRequests": [
    {
      object (BreakRequest)
    }
  ],
  "frequencyConstraints": [
    {
      object (FrequencyConstraint)
    }
  ]
}
Pola
breakRequests[]

object (BreakRequest)

Sekwencja przerw. Zobacz wiadomość BreakRequest.

frequencyConstraints[]

object (FrequencyConstraint)

Może obowiązywać kilka FrequencyConstraint. Wszystkie muszą być spełnione przez BreakRequest tego BreakRule. Zobacz: FrequencyConstraint.

BreakRequest

Sekwencja przerw (czyli ich liczba i kolejność) obowiązująca w przypadku każdego pojazdu musi być znana z góry. Powtarzające się pola BreakRequest definiują tę sekwencję w kolejności, w jakiej muszą wystąpić. Ich przedziały czasowe (earliestStartTime / latestStartTime) mogą się nakładać, ale muszą być zgodne z zamówieniem (jest to sprawdzane).

Zapis JSON
{
  "earliestStartTime": string,
  "latestStartTime": string,
  "minDuration": string
}
Pola
earliestStartTime

string (Timestamp format)

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

Korzysta ze standardu RFC 3339, w którym wygenerowane dane wyjściowe są zawsze znormalizowane do formatu Z i zawierają 0, 3, 6 lub 9 cyfr po przecinku. Akceptowane są też przesunięcia inne niż „Z”. Przykłady: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" lub "2014-10-02T15:01:23+05:30".

latestStartTime

string (Timestamp format)

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

Korzysta ze standardu RFC 3339, w którym wygenerowane dane wyjściowe są zawsze znormalizowane do formatu Z i zawierają 0, 3, 6 lub 9 cyfr po przecinku. Akceptowane są też przesunięcia inne niż „Z”. Przykłady: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" lub "2014-10-02T15:01:23+05:30".

minDuration

string (Duration format)

Wymagane. Minimalny czas trwania przerwy. Wartość musi być dodatnia.

FrequencyConstraint

Można dodatkowo ograniczyć częstotliwość i czas trwania przerw określonych powyżej, wymuszając minimalną częstotliwość przerw, np. „Co 12 godzin musi być przerwa trwająca co najmniej 1 godzinę”. Zakładając, że można to interpretować jako „W dowolnym przedziale czasowym wynoszącym 12 godzin musi być co najmniej 1 przerwa trwająca co najmniej 1 godzinę”, ten przykład można przełożyć na następujący obiekt FrequencyConstraint:

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

Czas i czas trwania przerw w rozwiązaniu będą uwzględniać wszystkie te ograniczenia, a także przedziały czasowe i minimalne czasy trwania określone już w BreakRequest.

W praktyce FrequencyConstraint może dotyczyć przerw, które nie następują po sobie. Na przykład ten harmonogram jest zgodny z przykładem „1 godzina co 12 godzin”:

  04:00 vehicle start
   .. performing travel and visits ..
  09:00 1 hour break
  10:00 end of the break
   .. performing travel and visits ..
  12:00 20-min lunch break
  12:20 end of the break
   .. performing travel and visits ..
  21:00 1 hour break
  22:00 end of the break
   .. performing travel and visits ..
  23:59 vehicle end
Zapis JSON
{
  "minBreakDuration": string,
  "maxInterBreakDuration": string
}
Pola
minBreakDuration

string (Duration format)

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

maxInterBreakDuration

string (Duration format)

Wymagane. Maksymalny dozwolony czas trwania dowolnego przedziału czasu na trasie, który nie obejmuje przynajmniej częściowo przerwy wynoszącej duration >= minBreakDuration. Wartość musi być dodatnia.

Cel

Cele całkowicie zastępują model kosztów, dlatego są niezgodne z dotychczasowymi kosztami. Każdy cel jest mapowany na szereg wstępnie zdefiniowanych kosztów, np. pojazdów, przesyłek lub atrybutów przejścia.

Eksperymentalne: więcej informacji znajdziesz na stronie https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request.

Zapis JSON
{
  "type": enum (Type),
  "weight": number
}
Pola
type

enum (Type)

Typ celu.

weight

number

Jak bardzo ten cel powinien się liczyć w porównaniu z innymi. Może to być dowolna liczba nieujemna, a wagi nie muszą sumować się do 1. Domyślna wartość wag to 1,0.

Typ

Typ celu, który zostanie zmapowany na zestaw kosztów.

Wartości w polu enum
DEFAULT Aby zapewnić rozsądne rozwiązanie, zostanie użyty domyślny zestaw kosztów. Uwaga: ten cel może być używany samodzielnie, ale zawsze będzie też dodawany z wagą 1,0 jako punkt odniesienia do celów określonych przez użytkownika, jeśli nie został jeszcze dodany.
MIN_DISTANCE „MIN”. Zminimalizuj całkowitą przebytą odległość.
MIN_WORKING_TIME Zminimalizuj łączny czas pracy wszystkich pojazdów.
MIN_TRAVEL_TIME Jak wyżej, ale skupiając się tylko na czasie podróży.
MIN_NUM_VEHICLES Zminimalizuj liczbę używanych pojazdów.

DurationDistanceMatrix

Określa macierz czasu trwania i macierz odległości od lokalizacji wizyty i punktu początkowego pojazdu do lokalizacji wizyty i punktu końcowego pojazdu.

Zapis JSON
{
  "rows": [
    {
      object (Row)
    }
  ],
  "vehicleStartTag": string
}
Pola
rows[]

object (Row)

Określa wiersze macierzy czasu trwania i odległości. Musi zawierać tyle samo elementów co ShipmentModel.duration_distance_matrix_src_tags.

vehicleStartTag

string

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

Każdy punkt początkowy pojazdu musi pasować do dokładnie jednej macierzy, tzn. dokładnie jedno pole startTags musi pasować do pola vehicleStartTag macierzy (i tylko tej macierzy).

Wszystkie macierze muszą mieć różne wartości vehicleStartTag.

Wiersz

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

Zapis JSON
{
  "durations": [
    string
  ],
  "meters": [
    number
  ]
}
Pola
durations[]

string (Duration format)

Wartości czasu trwania dla danego wiersza. Musi zawierać tyle samo elementów co ShipmentModel.duration_distance_matrix_dst_tags.

meters[]

number

Wartości odległości dla danego wiersza. Jeśli żadne koszty ani ograniczenia nie odnoszą się do odległości w modelu, to pole może pozostać puste. W przeciwnym razie musi zawierać tyle elementów co durations.

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 i obowiązuje najbardziej rygorystyczne ograniczenie lub limit (zgodnie z naturalną semantyką „ORAZ”).

Zapis JSON
{
  "srcTag": string,
  "excludedSrcTag": string,
  "dstTag": string,
  "excludedDstTag": string,
  "cost": number,
  "costPerKilometer": number,
  "distanceLimit": {
    object (DistanceLimit)
  },
  "delay": string
}
Pola
srcTag

string

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

Wizyta źródłowa lub początek pojazdu pasuje, jeśli VisitRequest.tags lub Vehicle.start_tags zawiera srcTag lub nie zawiera excludedSrcTag (w zależności od tego, które z tych 2 pól nie jest puste).

excludedSrcTag

string

Zobacz srcTag. Dokładnie jedna z wartości srcTag i excludedSrcTag nie może być pusta.

dstTag

string

Wizyta w miejscu docelowym lub zakończenie trasy pojazdu pasuje, jeśli VisitRequest.tags lub Vehicle.end_tags zawiera dstTag lub nie zawiera excludedDstTag (w zależności od tego, które z tych 2 pól nie jest puste).

excludedDstTag

string

Zobacz dstTag. Dokładnie jedna z wartości dstTag i excludedDstTag nie może być pusta.

cost

number

Określa koszt wykonania tego przejścia. Jest ona wyrażona w tej samej jednostce co wszystkie inne koszty w modelu i nie może być ujemna. Jest on stosowany oprócz wszystkich innych istniejących kosztów.

costPerKilometer

number

Określa koszt za kilometr stosowany do odległości przebytej podczas wykonywania tego przejścia. Suma obejmuje wszystkie wartości Vehicle.cost_per_kilometer określone w przypadku pojazdów.

distanceLimit

object (DistanceLimit)

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

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

delay

string (Duration format)

Określa opóźnienie podczas wykonywania tego przejścia.

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

ShipmentTypeIncompatibility

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

Zapis JSON
{
  "types": [
    string
  ],
  "incompatibilityMode": enum (IncompatibilityMode)
}
Pola
types[]

string

Lista niezgodnych typów. Dwie przesyłki, które mają różne wartości shipment_types spośród wymienionych, są „niezgodne”.

incompatibilityMode

enum (IncompatibilityMode)

Tryb zastosowany do niezgodności.

IncompatibilityMode

Tryby określające, jak ograniczane jest występowanie niezgodnych przesyłek na tej samej trasie.

Wartości w polu enum
INCOMPATIBILITY_MODE_UNSPECIFIED Nieokreślony tryb niezgodności. Ta wartość nie powinna być nigdy używana.
NOT_PERFORMED_BY_SAME_VEHICLE W tym trybie 2 przesyłki o niezgodnych typach nigdy nie mogą być przewożone tym samym pojazdem.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

W tym trybie 2 przesyłki o niezgodnych typach nigdy nie mogą znajdować się w tym samym pojeździe w tym samym czasie:

  • Mogą korzystać z tego samego pojazdu tylko wtedy, gdy jeden z nich zostanie dostarczony, zanim drugi zostanie odebrany.
  • Jeśli obie przesyłki są tylko do odbioru (bez dostaw) lub tylko do dostawy (bez odbioru), nie mogą być przewożone tym samym pojazdem.

ShipmentTypeRequirement

Określa wymagania między przesyłkami na podstawie ich typu shipmentType. Szczegóły wymagania są określane przez tryb wymagania.

Zapis JSON
{
  "requiredShipmentTypeAlternatives": [
    string
  ],
  "dependentShipmentTypes": [
    string
  ],
  "requirementMode": enum (RequirementMode)
}
Pola
requiredShipmentTypeAlternatives[]

string

Lista alternatywnych typów przesyłek wymaganych przez dependentShipmentTypes.

dependentShipmentTypes[]

string

Wszystkie przesyłki z typem w polu dependentShipmentTypes wymagają co najmniej 1 przesyłki typu requiredShipmentTypeAlternatives do odwiedzenia na tej samej trasie.

UWAGA: łańcuchy wymagań, w których shipmentType zależy od siebie, są niedozwolone.

requirementMode

enum (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 Nieokreślony tryb wymagań. Ta wartość nie powinna być nigdy używana.
PERFORMED_BY_SAME_VEHICLE W tym trybie wszystkie „zależne” przesyłki muszą być przewożone tym samym pojazdem co co najmniej jedna z „wymaganych” przesyłek.
IN_SAME_VEHICLE_AT_PICKUP_TIME

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

Dlatego „zależny” odbiór przesyłki musi mieć:

  • przesyłka „wymagana” tylko do dostarczenia, która została dostarczona na trasie po, lub
  • „Wymagana” przesyłka musi zostać odebrana na trasie przed nią, a jeśli „wymagana” przesyłka ma dostawę, musi ona zostać zrealizowana po odbiorze przesyłki „zależnej”.
IN_SAME_VEHICLE_AT_DELIVERY_TIME Tak samo jak wcześniej, z tym że „zależne” przesyłki muszą mieć „wymaganą” przesyłkę w pojeździe w momencie dostawy.

PrecedenceRule

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

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

Ponadto pierwszeństwo obowiązuje tylko wtedy, gdy obie przesyłki są realizowane, a w przeciwnym razie jest ignorowane.

Zapis JSON
{
  "firstIsDelivery": boolean,
  "secondIsDelivery": boolean,
  "offsetDuration": string,
  "firstIndex": integer,
  "secondIndex": integer
}
Pola
firstIsDelivery

boolean

Wskazuje, czy „pierwsze” zdarzenie to dostawa.

secondIsDelivery

boolean

Wskazuje, czy „drugie” zdarzenie to dostawa.

offsetDuration

string (Duration format)

Przesunięcie między „pierwszym” a „drugim” zdarzeniem. Może być ujemna.

firstIndex

integer

Indeks przesyłki „pierwszego” zdarzenia. To pole musi być określone.

secondIndex

integer

Indeks przesyłki „drugiego” zdarzenia. To pole musi być określone.