ShipmentModel

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

  • koszt wyznaczania tras dla pojazdów (suma kosztu całkowitego czasu, kosztu czasu podróży i kosztu stałego dla wszystkich pojazdów);
  • kary za niezrealizowaną dostawę.
  • koszt globalnego czasu trwania dostaw;
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)

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

vehicles[]

object (Vehicle)

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

objectives[]

object (Objective)

Zbiór celów tego modelu, które przekształcimy w koszty. Jeśli nie jest puste, model wejściowy musi być bezpłatny. Aby uzyskać zmodyfikowane żądanie, użyj funkcji solvingMode = TRANSFORM_AND_RETURN_REQUEST. Pamiętaj, że w takim przypadku prośba nie zostanie rozwiązana. 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: żadne czasy poza tym zakresem nie mogą być uznawane za prawidłowe.

Okres, którego dotyczy model, musi być krótszy niż rok, tzn. wartości globalEndTime i globalStartTime muszą różnić się od siebie o nie więcej niż 31 536 000 sekund.

Jeśli używasz pól cost_per_*hour, możesz ustawić mniejszy przedział, aby zwiększyć skuteczność (np. jeśli modelujesz jeden dzień, ustaw globalne limity czasu na ten dzień). Jeśli nie zostanie ustawiona, jako wartość domyślna używana jest data 1 stycznia 1970 r., godzina 00:00:00 czasu UTC (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 data 1 stycznia 1971 r., godzina 00:00:00 UTC (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 czasem rozpoczęcia a najpóźniejszym czasem zakończenia wszystkich pojazdów. Użytkownicy mogą przypisać do tej ilości koszt za godzinę, aby na przykład zoptymalizować czas ukończenia zadania. 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 w Google Maps lub odległości geodezyjne, w zależności od wartości pola useGeodesicDistances. Jeśli nie jest pusta, useGeodesicDistances nie może mieć wartości „prawda”, a pola durationDistanceMatrixSrcTags i durationDistanceMatrixDstTags nie mogą być puste.

Przykłady użycia:

  • Są 2 lokalizacje: locA i locB.
  • 1 pojazd rozpoczynający trasę w lokalizacji A i kończący ją w lokalizacji A.
  • 1 prośba o odwiedzenie punktu odbioru 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 A i kończący ją w lokalizacji B, korzystający z macierzy „fast”.
  • 1 pojazd rozpoczynający trasę w lokalizacji B i kończący ją w lokalizacji B, 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 odwiedzenie punktu odbioru w lokalizacji locC.
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 określające źródła macierzy czasu trwania i odległości: durationDistanceMatrices(i).rows(j) określa czas trwania i odległości od wizyt z tagiem durationDistanceMatrixSrcTags(j) do innych wizyt w macierzy i.

Tagi odpowiadają polom VisitRequest.tags lub Vehicle.start_tags. Dany identyfikator VisitRequest lub Vehicle musi być zgodny z dokładnie jednym tagiem w tym polu. Pamiętaj, że tagi źródła, miejsca docelowego i macierzy w przypadku Vehicle mogą być takie same. Podobnie tagi źródła i miejsca docelowego w przypadku 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 określające miejsca docelowe macierzy czasu trwania i odległości: durationDistanceMatrices(i).rows(j).durations(k) (odpowiednio durationDistanceMatrices(i).rows(j).meters(k)) określa czas trwania (odpowiednio odległość) podróży od wizyt z tagiem durationDistanceMatrixSrcTags(j) do wizyt z tagiem durationDistanceMatrixDstTags(k) w macierzy i.

Tagi odpowiadają polom VisitRequest.tags lub Vehicle.start_tags. Dany identyfikator VisitRequest lub Vehicle musi być zgodny z dokładnie jednym tagiem w tym polu. Pamiętaj, że tagi źródła, miejsca docelowego i macierzy w przypadku Vehicle mogą być takie same. Podobnie tagi źródła i miejsca docelowego w przypadku 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)

Dodano do modelu atrybuty przejścia.

shipmentTypeIncompatibilities[]

object (ShipmentTypeIncompatibility)

Zestawy niezgodnych typów dostawy (patrz ShipmentTypeIncompatibility).

shipmentTypeRequirements[]

object (ShipmentTypeRequirement)

Zestawy shipmentType wymagań (patrz ShipmentTypeRequirement).

precedenceRules[]

object (PrecedenceRule)

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

WAŻNE: używanie 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 na jego trasie zrealizowano co najmniej 1 przesyłkę. Może to służyć do ograniczenia liczby tras w przypadku, gdy liczba kierowców jest mniejsza niż liczba pojazdów, a flota pojazdów jest niejednorodna. Optymalizacja wybierze wtedy najlepszy podzbiór pojazdów do użycia. Musi być liczbą dodatnią.

Wysyłka

Przesyłka 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 lokalizacji odbioru (i odpowiednio zmniejszyć swoje wolne moce), a następnie jedną z lokalizacji dostawy (i odpowiednio zwiększyć swoje wolne moce).

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 podasz tej wartości, pojazd musi tylko odwiedzić lokalizację odpowiadającą dostawom.

deliveries[]

object (VisitRequest)

Zestaw alternatywnych opcji dostawy powiązanych z przesyłką. Jeśli nie podasz tej wartości, pojazd musi tylko odwiedzić lokalizację odpowiadającą odbiorom.

loadDemands

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

Wymagania dotyczące załadunku przesyłki (np. waga, objętość, liczba palet itp.). Klucze w 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 danego klucza nie ma na mapie, odpowiedni ładunek jest traktowany jako wartość null.

allowedVehicleIndices[]

integer

Zestaw pojazdów, które mogą zrealizować tę dostawę. Jeśli to pole jest puste, wszystkie pojazdy mogą wykonać tę czynność. Pojazdy są podawane według indeksu na liście ShipmentModelvehicles.

costsPerVehicle[]

number

Określa koszt poniesiony w przypadku dostawy przesyłki każdym pojazdem. Jeśli jest określony, musi mieć JEDNĄ z tych wartości:

  • taka sama liczba elementów jak w przypadku costsPerVehicleIndices. costsPerVehicle[i] odpowiada pojazdowi costsPerVehicleIndices[i] w modelu.
  • mają tyle samo elementów, ile jest pojazdów w modelu. i-ty element odpowiada pojazdowi nr i w modelu.

Koszty te 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. Indeksu pojazdu nie można określić więcej niż raz. Jeśli pojazd jest wykluczony z costsPerVehicleIndices, jego koszt wynosi zero.

pickupToDeliveryAbsoluteDetourLimit

string (Duration format)

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

Niech t będzie najkrótszym czasem potrzebnym na przejazd z wybranej alternatywnej lokalizacji odbioru bezpośrednio do wybranej alternatywnej lokalizacji dostawy. Ustawienie pickupToDeliveryAbsoluteDetourLimit wymusza:

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

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

pickupToDeliveryTimeLimit

string (Duration format)

Określa maksymalny czas od rozpoczęcia odbioru do rozpoczęcia dostawy przesyłki. Jeśli jest określony, musi być nieujemny, a przesyłka musi zawierać co najmniej odbiór i dostawę. Nie zależy to od tego, które alternatywne opcje odbioru i dostawy zostały wybrane, ani od prędkości pojazdu. Można to określić wraz z maksymalnymi ograniczeniami dotyczącymi zmiany trasy: rozwiązanie będzie uwzględniać obie specyfikacje.

shipmentType

string

Niepusty ciąg znaków określający „typ” tej przesyłki. Za pomocą tej funkcji można określać niezgodności lub wymagania między shipment_types (patrz shipmentTypeIncompatibilities i shipmentTypeRequirements w ShipmentModel).

Różni się od visitTypes, który jest określony dla pojedynczej wizyty: wszystkie odbiory i dostawy należące do tej samej przesyłki mają ten sam shipmentType.

label

string

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

ignore

boolean

Jeśli wartość jest prawdziwa, pomiń tę przesyłkę, ale nie stosuj penaltyCost.

Zignorowanie dostawy powoduje błąd weryfikacji, jeśli w modelu znajdują się jakiekolwiek shipmentTypeRequirements.

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

penaltyCost

number

Jeśli przesyłka nie zostanie zrealizowana, ta kara zostanie dodana do całkowitego kosztu tras. Przesyłka jest uznawana za zrealizowaną, jeśli odwiedzono jedną z jej alternatywnych lokalizacji odbioru lub dostawy. Koszt może być wyrażony w tej samej jednostce, która jest używana w przypadku wszystkich innych pól związanych z kosztami w modelu, i musi być dodatni.

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

pickupToDeliveryRelativeDetourLimit

number

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

Niech t będzie najkrótszym czasem potrzebnym na przejazd z wybranej alternatywnej lokalizacji odbioru bezpośrednio do wybranej alternatywnej lokalizacji dostawy. Ustawienie pickupToDeliveryRelativeDetourLimit wymusza:

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

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

VisitRequest

Prośba o wizytę, którą można zrealizować pojazdem: ma lokalizację geograficzną (lub dwie, patrz poniżej), godziny otwarcia i zamknięcia reprezentowane przez przedziały czasowe oraz czas trwania usługi (czas spędzony przez pojazd po przybyciu na miejsce odbioru lub dostawy 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, w której pojazd dociera podczas wykonywania tej VisitRequest. Jeśli model dostawy zawiera macierze odległości i czasu trwania, nie można określić parametru arrivalLocation.

arrivalWaypoint

object (Waypoint)

Punkt pośredni, do którego pojazd dociera podczas wykonywania tego VisitRequest. Jeśli model dostawy zawiera macierze odległości i czasu trwania, nie można określić parametru arrivalWaypoint.

departureLocation

object (LatLng)

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

departureWaypoint

object (Waypoint)

Punkt pośredni, z którego pojazd odjeżdża po zakończeniu tego VisitRequest. Można pominąć, jeśli jest taka sama jak wartość arrivalWaypoint. Jeśli model dostawy zawiera macierze odległości i czasu trwania, nie można określić parametru departureWaypoint.

tags[]

string

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

timeWindows[]

object (TimeWindow)

Przedziały czasowe, które ograniczają czas przyjazdu do miejsca docelowego. 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 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 1 okno czasowe.

duration

string (Duration format)

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

cost

number

Koszt obsługi tego żądania wizyty na trasie pojazdu. Można go użyć do zapłaty różnych kosztów za każdy alternatywny odbiór lub dostawę przesyłki. 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ę. Jest to podobne do pola Shipment.load_demands, z tym że dotyczy tylko tego VisitRequest, a nie całego Shipment. Wymagania wymienione tutaj są dodawane do wymagań wymienionych w Shipment.load_demands.

visitTypes[]

string

Określa typy wizyt. Może to służyć do przydzielenia dodatkowego czasu potrzebnego pojazdowi na zakończenie wizyty (patrz Vehicle.extra_visit_duration_for_visit_type).

Typ może wystąpić tylko raz.

label

string

Określa etykietę dla tego elementu VisitRequest. Ta etykieta jest zgłaszana 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 zawracanie zostanie całkowicie wyeliminowane. Jest to funkcja eksperymentalna, a jej działanie może ulec zmianie.

Eksperymentalne: 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ę szerokości i długości geograficznej. Jest to 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 od –90,0 do +90,0.

longitude

number

Długość geograficzna w stopniach. Musi mieścić się w zakresie od –180,0 do +180,0.

Punkt pośredni

Zawiera punkt na trasie. Punkty pośrednie oznaczają lokalizacje przyjazdu i odjazdu w przypadku żądań VisitRequest oraz lokalizacje początkowe i końcowe w przypadku 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 trasy ma preferencję, aby pojazd zatrzymał się po określonej stronie drogi. Gdy ustawisz tę wartość, trasa będzie przebiegać przez daną lokalizację, aby pojazd mógł zatrzymać się po stronie drogi, w kierunku której jest ona przesunięta od środka drogi. Ta opcja nie działa w przypadku trybu podróży „PIESZO”.

vehicleStopover

boolean

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

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

Różne sposoby przedstawiania lokalizacji. Poniżej znajduje się lista pól, które się wzajemnie 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 kierunku.

placeId

string

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

Jeśli używasz identyfikatora miejsca do określenia lokalizacji przyjazdu lub odjazdu w przypadku 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ę jest niezalecany.

Koniec pól wykluczających się nawzajem.

Lokalizacja

Zawiera lokalizację (punkt geograficzny i opcjonalny kierunek).

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

object (LatLng)

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

heading

integer

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

TimeWindow

Okna czasowe ograniczają czas zdarzenia, np. czas przyjazdu podczas wizyty lub czas rozpoczęcia i zakończenia przejazdu pojazdu.

Sztywne granice czasowe startTime i endTime określają najwcześniejszy i najpóźniejszy czas zdarzenia, tak że startTime <= event_time <= endTime. Dolna granica miękkiego okna czasowego, softStartTime, wyraża preferencję, aby zdarzenie nastąpiło w momencie softStartTime lub później, poprzez poniesienie kosztu proporcjonalnego do tego, jak długo przed softStartTime nastąpiło zdarzenie. Górna granica miękkiego okna czasowego, softEndTime, wyraża preferencję, aby zdarzenie nastąpiło w momencie softEndTime lub wcześniej, poprzez poniesienie kosztu proporcjonalnego do tego, jak długo po softEndTime nastąpi zdarzenie. Wartości startTime, endTime, softStartTime i softEndTime powinny mieścić się w globalnych limitach czasu (patrz ShipmentModel.global_start_time i ShipmentModel.global_end_time) i być zgodne z tymi zasadami:

  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 ścisłego przedziału czasu. Jeśli nie zostanie określona, zostanie ustawiona 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)

Koniec przedziału czasu. Jeśli nie zostanie określona, zostanie ustawiona 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 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".

softEndTime

string (Timestamp format)

Przybliżony 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ąpi przed wartością softStartTime, obliczany jako:

   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 pole softStartTime.

costPerHourAfterSoftEndTime

number

Koszt za godzinę dodawany do innych kosztów w modelu, jeśli zdarzenie wystąpi po softEndTime, obliczany jako:

   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 pole softEndTime.

Pojazd

Modeluje pojazd w przypadku problemu z przesyłką. Rozwiązanie problemu z przesyłką spowoduje utworzenie trasy dla tego pojazdu, która zaczyna się w miejscu startLocation i kończy w miejscu 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 dostępne dla pojazdu i jego prędkość. Zobacz też travelDurationMultiple.

routeModifiers

object (RouteModifiers)

Zbiór warunków, które muszą zostać spełnione i które wpływają na sposób obliczania tras dla danego pojazdu.

startLocation

object (LatLng)

Położenie geograficzne, w którym pojazd rozpoczyna podróż przed odebraniem przesyłek. Jeśli nie zostanie określony, pojazd rozpocznie podróż od pierwszego miejsca odbioru. Jeśli model dostawy zawiera macierze czasu trwania i odległości, nie można określić parametru startLocation.

startWaypoint

object (Waypoint)

Punkt orientacyjny reprezentujący położenie geograficzne, w którym pojazd rozpoczyna podróż przed odebraniem przesyłek. Jeśli nie podasz ani startWaypoint, ani startLocation, pojazd rozpocznie podróż od pierwszego miejsca 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 VisitRequest. Jeśli nie zostanie określony, ShipmentRoute pojazdu kończy się natychmiast po zakończeniu ostatniego VisitRequest. Jeśli model dostawy zawiera macierze czasu trwania i odległości, nie można określić parametru endLocation.

endWaypoint

object (Waypoint)

Punkt pośredni reprezentujący położenie geograficzne, w którym pojazd kończy przejazd po wykonaniu ostatniego VisitRequest. Jeśli nie podasz wartości endWaypoint ani endLocation, ShipmentRoute pojazdu zakoń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 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)

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

Okna czasowe należące do tego samego pola powtarzanego muszą być rozłączne, tzn. żadne okno czasowe nie może się pokrywać z innym ani z nim sąsiadować, a ponadto muszą być ułożone w porządku chronologicznym.

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

endTimeWindows[]

object (TimeWindow)

Przedziały czasu, w których pojazd może dotrzeć do miejsca docelowego. Muszą mieścić się w globalnych limitach czasowych (patrz pola ShipmentModel.global_*). Jeśli nie określisz tu żadnej wartości, nie będzie limitu poza globalnymi limitami czasu.

Okna czasowe należące do tego samego pola powtarzanego muszą być rozłączne, tzn. żadne okno czasowe nie może się pokrywać z innym ani z nim sąsiadować, a ponadto muszą być ułożone w porządku chronologicznym.

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

unloadingPolicy

enum (UnloadingPolicy)

Zasady rozładunku egzekwowane w przypadku pojazdu.

loadLimits

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

pojemność pojazdu (np. waga, objętość, liczba palet); Klucze w mapie to identyfikatory typu obciążenia, zgodne z kluczami pola Shipment.load_demands. Jeśli danego klucza nie ma na tej mapie, odpowiednia pojemność jest uznawana 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żywanie costPerHour zamiast samego costPerTraveledHour może powodować dodatkowe opóźnienia.

costPerTraveledHour

number

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

costPerKilometer

number

Koszt na kilometr trasy pojazdu. Ten koszt jest stosowany do odległości podanej w ShipmentRoute.transitions i nie dotyczy żadnej odległości przebytej w sposób dorozumiany z arrivalLocation do departureLocation w ramach pojedynczego VisitRequest.

fixedCost

number

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

usedIfRouteIsEmpty

boolean

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

Jeśli wartość to „true”, pojazd przemieszcza się 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 przejazdu z lokalizacji początkowej do końcowej są uwzględniane.

W przeciwnym razie nie będzie się przemieszczać z lokalizacji początkowej do końcowej, a dla tego pojazdu nie będzie zaplanowany żaden breakRule ani opóźnienie (od TransitionAttributes). W tym przypadku element ShipmentRoute pojazdu nie zawiera żadnych informacji poza indeksem i etykietą pojazdu.

routeDurationLimit

object (DurationLimit)

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

travelDurationLimit

object (DurationLimit)

Limit zastosowany do czasu trwania podróży pojazdu. W danym OptimizeToursResponse czas trwania podróży na trasie to suma wszystkich transitions.travel_duration.

routeDistanceLimit

object (DistanceLimit)

Limit zastosowany do całkowitej odległości na trasie pojazdu. W danym OptimizeToursResponse odległość trasy to suma wszystkich jej transitions.travel_distance_meters.

extraVisitDurationForVisitType

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

Określa mapę ciągó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. Jeśli określono wartość costPerHour, dodatkowy czas trwania wizyty zwiększa koszt. Klucze (np. visitTypes) nie mogą być pustymi ciągami znaków.

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

breakRule

object (BreakRule)

Opisuje harmonogram przerw, który ma być stosowany w przypadku tego pojazdu. Jeśli jest pusta, dla tego pojazdu nie będą planowane żadne przerwy.

label

string

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

ignore

boolean

Jeśli wartość to „true”, usedIfRouteIsEmpty musi mieć wartość „false”, a ten pojazd pozostanie nieużywany.

Jeśli dostawa jest realizowana przez zignorowany pojazd w injectedFirstSolutionRoutes, jest pomijana w pierwszym rozwiązaniu, ale może być realizowana w odpowiedzi.

Jeśli dostawa jest realizowana przez zignorowany pojazd w injectedSolutionConstraint, a wszelkie powiązane odbiory lub dostawy są ograniczone do tego pojazdu (tzn. 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, przesyłka jest pomijana w odpowiedzi.

travelDurationMultiple

number

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

OSTRZEŻENIE: czasy podróży będą zaokrąglane do najbliższej sekundy po zastosowaniu tego mnożnika, ale przed wykonaniem jakichkolwiek operacji numerycznych. Mały mnożnik może więc spowodować utratę precyzji.

Zobacz też extraVisitDurationForVisitType poniżej.

TravelMode

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

Powinny to być podzbiory trybów podróży interfejsu Routes API w 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 mieć wyraźnych 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 Środek transportu odpowiadający trasie pieszej.

RouteModifiers

Zawiera zestaw opcjonalnych warunków, które należy spełnić podczas obliczania tras pojazdów. Jest to podobne do parametru RouteModifiers w interfejsie Routes Preferred API w 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 uzasadnionych przypadkach unikać dróg płatnych. Priorytetowo traktowane będą trasy, które nie obejmują dróg płatnych. Dotyczy to tylko zmotoryzowanych środków transportu.

avoidHighways

boolean

Określa, czy w uzasadnionych przypadkach należy unikać autostrad. Priorytetowo traktowane będą trasy, które nie obejmują autostrad. Dotyczy to tylko zmotoryzowanych środków transportu.

avoidFerries

boolean

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

avoidIndoor

boolean

Opcjonalnie: Określa, czy unikać nawigacji w pomieszczeniach, gdy jest to uzasadnione. Priorytetowo traktowane będą trasy, które nie zawierają nawigacji w pomieszczeniach. Dotyczy tylko trybu podróży WALKING.

UnloadingPolicy

Zasady dotyczące rozładunku pojazdu. Dotyczy tylko przesyłek, które są odbierane i dostarczane.

Inne dostawy mogą odbywać się w dowolnym miejscu na trasie niezależnie od unloadingPolicy.

Wartości w polu enum
UNLOADING_POLICY_UNSPECIFIED Nieokreślone zasady rozładunku; dostawy muszą być realizowane po odpowiednich odbiorach.
LAST_IN_FIRST_OUT Dostawy muszą być realizowane w odwrotnej kolejności do odbiorów.
FIRST_IN_FIRST_OUT Dostawy muszą być realizowane w tej samej kolejności co odbiory.

LoadLimit

Określa limit obciążenia pojazdu, np. „ten samochód ciężarowy 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 przekroczy softMaxLoad na trasie pojazdu, obowiązuje 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 elastyczne można określać tylko w przypadku typów, które w całym modelu dotyczą tylko odbiorów lub tylko dostaw.

startLoadInterval

object (Interval)

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

endLoadInterval

object (Interval)

Dopuszczalny przedział czasu załadunku pojazdu na końcu trasy.

maxLoad

string (int64 format)

Maksymalna dopuszczalna wielkość obciążenia.

costPerKilometer

object (LoadCost)

Koszt przewiezienia 1 jednostki ładunku na odległość 1 km w przypadku tego pojazdu. Może to być przybliżone zużycie 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 w ciągu godziny 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ł dopuszczalnych wartości obciążenia.

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

string (int64 format)

Minimalne dopuszczalne obciążenie. Musi być ≥ 0. Jeśli oba parametry są określone, wartość min musi być ≤ max.

max

string (int64 format)

Maksymalne dopuszczalne obciążenie. Musi być ≥ 0. Jeśli nie zostanie określony, maksymalne obciążenie nie jest ograniczone przez ten komunikat. Jeśli oba parametry są określone, wartość min musi być ≤ max.

LoadCost

Koszt przeniesienia jednej jednostki ładunku w czasie Transition. W przypadku danego zadania koszt jest sumą 2 części:

  • min(load, loadThreshold) * costPerUnitBelowThreshold
  • max(0, obciążenie – loadThreshold) * costPerUnitAboveThreshold

W przypadku tego kosztu rozwiązania preferują najpierw realizację dużych zamówień lub odbiór dużych zamówień 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,pickup,pickup,delivery,delivery,end 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 }

wtedy koszt poniesiony przez ten LoadCost wynosi (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

Wartość LoadCost na trasie wynosi 120,0.

Jeśli jednak trasa to start,pickup,delivery,pickup,delivery,end 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 }

wtedy koszt poniesiony przez ten 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 LoadCost na trasie wynosi 40,0.

LoadCost sprawia, że rozwiązania z przejściami o dużym obciążeniu 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)

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

costPerUnitBelowThreshold

number

Koszt przeniesienia jednostki ładunku dla każdej jednostki z zakresu od 0 do wartości progowej. Musi to być wartość skończona, która jest większa lub równa 0.

costPerUnitAboveThreshold

number

Koszt przeniesienia jednostki ładunku za każdą jednostkę powyżej progu. W przypadku specjalnym, gdy próg = 0, jest to stały koszt za jednostkę. Musi to być wartość skończona, która jest większa lub równa 0.

DurationLimit

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

Jeśli zdefiniujesz pole limitu tymczasowego, musisz określić zarówno próg maksymalny limitu tymczasowego, jak i powiązany z nim koszt.

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

string (Duration format)

Sztywny limit ograniczający czas trwania do maksymalnie maxDuration.

softMaxDuration

string (Duration format)

Miękki limit, który nie wymusza maksymalnego czasu trwania, ale po przekroczeniu powoduje naliczenie kosztu trasy. Ten koszt jest dodawany do innych kosztów zdefiniowanych w modelu, w tej samej jednostce.

Jeśli podano wartość, softMaxDuration musi być nieujemna. Jeśli zdefiniowano też parametr maxDuration, wartość softMaxDuration musi być mniejsza niż maxDuration.

quadraticSoftMaxDuration

string (Duration format)

Miękki limit, który nie wymusza maksymalnego czasu trwania, ale w przypadku przekroczenia powoduje, że trasa generuje koszt kwadratowy w stosunku do czasu trwania. Ten koszt jest dodawany do innych kosztów zdefiniowanych w modelu, w tej samej jednostce.

Jeśli ustawienie quadraticSoftMaxDuration jest włączone, muszą być spełnione te warunki:

  • 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ę w przypadku przekroczenia progu softMaxDuration. Jeśli czas trwania jest poniżej progu, dodatkowy koszt wynosi 0. W przeciwnym razie koszt zależy od czasu trwania w sposób opisany poniżej:

  costPerHourAfterSoftMax * (duration - softMaxDuration)

Koszt musi być nieujemny.

costPerSquareHourAfterQuadraticSoftMax

number

Koszt za godzinę kwadratową, jeśli zostanie przekroczony próg quadraticSoftMaxDuration.

Jeśli czas trwania jest poniżej progu, dodatkowy koszt wynosi 0. W przeciwnym razie koszt zależy od czasu trwania w sposób opisany poniżej:

  costPerSquareHourAfterQuadraticSoftMax *
  (duration - quadraticSoftMaxDuration)^2

Koszt musi być nieujemny.

DistanceLimit

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

Jeśli zdefiniowano limit elastyczny, musisz określić zarówno parametr softMaxMeters, jak i costPerKilometerAboveSoftMax, a ich wartości muszą być nieujemne.

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

string (int64 format)

Limit bezwzględny ograniczający odległość do maksymalnie maxMeters. Limit nie może być ujemny.

softMaxMeters

string (int64 format)

Limit miękki, który nie wymusza maksymalnego limitu odległości, ale w przypadku jego przekroczenia generuje koszt, który jest dodawany do innych kosztów zdefiniowanych w modelu, w tej samej jednostce.

Jeśli zdefiniowano parametr softMaxMeters, musi on być mniejszy niż maxMeters i nie może być ujemny.

costPerKilometerBelowSoftMax

number

Koszt na kilometr wzrasta do softMaxMeters zgodnie z tym wzorem:

  min(distanceMeters, softMaxMeters) / 1000.0 *
  costPerKilometerBelowSoftMax.

Ten koszt nie jest obsługiwany w regionie routeDistanceLimit.

costPerKilometerAboveSoftMax

number

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

  (distanceMeters - softMaxMeters) / 1000.0 *
  costPerKilometerAboveSoftMax.

Koszt musi być nieujemny.

BreakRule

Reguły generowania przerw w czasie pracy pojazdu (np. przerw na lunch). Przerwa to ciągły okres, w którym pojazd pozostaje w bezruchu w obecnej pozycji i nie może wykonać żadnej wizyty. Przerwa może nastąpić:

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

object (BreakRequest)

Kolejność przerw. Zobacz komunikat BreakRequest.

frequencyConstraints[]

object (FrequencyConstraint)

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

BreakRequest

Kolejność przerw (czyli ich liczba i kolejność) w przypadku każdego pojazdu musi być znana z wyprzedzeniem. Powtarzające się symbole BreakRequest definiują sekwencję w kolejności, w jakiej muszą wystąpić. Przedziały czasowe (earliestStartTime / latestStartTime) mogą się pokrywać, 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 zinterpretować jako „W dowolnym 12-godzinnym przedziale czasu musi być co najmniej jedna przerwa trwająca co najmniej godzinę”, ten przykład można przetłumaczyć na następujący warunek FrequencyConstraint:

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

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

Symbol FrequencyConstraint może w praktyce odnosić się do przerw, które nie następują po sobie. Na przykład poniższy harmonogram uwzględnia przykład „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 FrequencyConstraint.

maxInterBreakDuration

string (Duration format)

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

Cel

Cele całkowicie zastępują model kosztów, dlatego są niezgodne z wcześniej ustalonymi kosztami. Każdy cel jest powiązany z określoną liczbą 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. Wagi domyślnie wynoszą 1,0.

Typ

Typ celu, który zostanie przypisany do zestawu 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 jeśli nie jest jeszcze obecny, zawsze będzie dodawany z wagą 1,0 jako wartość bazowa do celów określonych przez użytkownika.
MIN_DISTANCE cele „MIN”. zminimalizować całkowitą przebytą odległość;
MIN_WORKING_TIME zminimalizować łączny czas pracy wszystkich pojazdów;
MIN_TRAVEL_TIME To samo co powyżej, ale z uwzględnieniem tylko czasu podróży.
MIN_NUM_VEHICLES Zminimalizuj liczbę używanych pojazdów.

DurationDistanceMatrix

Określa macierz czasu trwania i macierz odległości od lokalizacji rozpoczęcia wizyty i pojazdu do lokalizacji zakończenia wizyty i 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 elementów, ile pole ShipmentModel.duration_distance_matrix_src_tags.

vehicleStartTag

string

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

Każde rozpoczęcie jazdy 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ć inny 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 w danym wierszu. Musi zawierać tyle elementów, ile pole ShipmentModel.duration_distance_matrix_dst_tags.

meters[]

number

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

TransitionAttributes

Określa atrybuty przejść między dwiema kolejnymi wizytami na trasie. Do tego samego przejścia może mieć zastosowanie kilka TransitionAttributes. W takim przypadku wszystkie dodatkowe koszty sumują się, a obowiązuje najsurowsze ograniczenie lub limit (zgodnie z naturalną semantyką „I”).

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

string

Tagi określające zbiór przejść (src->dst), do których mają zastosowanie te atrybuty.

Wizyta w źródle lub uruchomienie pojazdu są zgodne, jeśli pole 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 musi być niepusta.

dstTag

string

Wizyta w miejscu docelowym lub zakończenie podróży pojazdem pasuje, jeśli pole 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 musi być niepusta.

cost

number

Określa koszt wykonania tego przejścia. Jest to ta sama jednostka co wszystkie inne koszty w modelu i nie może być ujemna. Jest ona doliczana do wszystkich innych istniejących kosztów.

costPerKilometer

number

Określa koszt za kilometr stosowany do odległości pokonanej podczas wykonywania tego przejścia. Można ją dodać do dowolnej wartości Vehicle.cost_per_kilometer określonej w przypadku pojazdów.

distanceLimit

object (DistanceLimit)

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

Od czerwca 2021 r. obsługiwane są tylko limity elastyczne.

delay

string (Duration format)

Określa opóźnienie występujące podczas wykonywania tego przejścia.

To opóźnienie zawsze występuje po zakończeniu wizyty w źródle i przed rozpoczęciem wizyty w miejscu docelowym.

ShipmentTypeIncompatibility

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

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

string

Lista niezgodnych typów. Dwa przesyłki mające różne shipment_types spośród wymienionych są „niezgodne”.

incompatibilityMode

enum (IncompatibilityMode)

Tryb zastosowany do niezgodności.

IncompatibilityMode

Tryby określające, jak ograniczone jest wyświetlanie niekompatybilnych przesyłek na tej samej trasie.

Wartości w polu enum
INCOMPATIBILITY_MODE_UNSPECIFIED Nieokreślony tryb niezgodności. Tej wartości nie należy nigdy używać.
NOT_PERFORMED_BY_SAME_VEHICLE W tym trybie 2 przesyłki o niezgodnych typach 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 przed odebraniem drugiego.
  • Jeśli oba zamówienia są przeznaczone tylko do odbioru lub tylko do dostawy, nie mogą być przewożone tym samym pojazdem.

ShipmentTypeRequirement

Określa wymagania dotyczące przesyłek na podstawie ich typu (shipmentType). Szczegóły wymagania są definiowane przez tryb wymagania.

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

string

Lista alternatywnych typów dostawy wymaganych przez dependentShipmentTypes.

dependentShipmentTypes[]

string

Wszystkie przesyłki z typem w polu dependentShipmentTypes wymagają, aby na tej samej trasie odwiedzono co najmniej 1 przesyłkę typu requiredShipmentTypeAlternatives.

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 Tryb wymagania nieokreślony. Tej wartości nie należy nigdy 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 z przesyłek „wymaganych”.
IN_SAME_VEHICLE_AT_PICKUP_TIME

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

Odbiór przesyłki „zależnej” musi zatem spełniać jeden z tych warunków:

  • Wymagana przesyłka „tylko dostawa” dostarczona na trasie po
  • Wymagana przesyłka 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 przesyłki „zależne” muszą mieć w momencie dostawy przesyłkę „wymaganą” w pojeździe.

PrecedenceRule

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

Kilka zależności 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 ma zastosowanie 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 zdarzenie „first” jest dostawą.

secondIsDelivery

boolean

Wskazuje, czy „drugie” zdarzenie to dostawa.

offsetDuration

string (Duration format)

Różnica między zdarzeniem „pierwszym” a „drugim”. Może być ujemna.

firstIndex

integer

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

secondIndex

integer

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