ShipmentModel

Model dostawy zawiera zestaw dostaw, które muszą być wykonane przez zestaw pojazdów, przy jednoczesnym zminimalizowaniu całkowitego kosztu, który jest sumą:

  • koszt wyznaczania tras dla pojazdów (suma kosztu całkowitego czasu, kosztu czasu przejazdu 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 dla tego modelu, które przekształcimy w koszty. Jeśli model wejściowy nie jest pusty, musi być bezpłatny. Aby uzyskać zmodyfikowane żądanie, użyj funkcji solvingMode = TRANSFORM_AND_RETURN_REQUEST. Pamiętaj, że w takim przypadku zgłoszenie nie zostanie rozwiązane. 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ć uznane za prawidłowe.

Okres, którego dotyczy model, musi być krótszy niż rok, tzn. wartości globalEndTimeglobalStartTime muszą różnić się od siebie o mniej 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, domyślnie używana jest data 1 stycznia 1970 r., godzina 00:00:00 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 zostanie określona, 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śniejszą godziną rozpoczęcia a najpóźniejszą godziną 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 Mapach Google 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 „true”, a pola durationDistanceMatrixSrcTagsdurationDistanceMatrixDstTags nie mogą być puste.

Przykłady użycia:

  • Są 2 lokalizacje: locA i locB.
  • 1 pojazd rozpoczynający i kończący trasę 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 „wolno”.
  • 1 pojazd rozpoczynający trasę w lokalizacji B i kończący ją w lokalizacji B, korzystający z macierzy „fast”.
  • 1 prośba o odwiedzenie punktu odbioru 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 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 element 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 element 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)

Atrybuty przejścia dodane do modelu.

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 dostawę. 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 wykorzystania. Musi być ściśle dodatnia.

Wysyłka

Przesyłka pojedynczego produktu z jednego miejsca odbioru do jednego miejsca dostawy. Aby uznać dostawę za zrealizowaną, unikalny pojazd musi odwiedzić jeden z punktów odbioru (i odpowiednio zmniejszyć swoje wolne moce), a następnie jeden z punktów 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 nazwa wyświetlana 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 określono inaczej, pojazd musi tylko odwiedzić lokalizację odpowiadającą dostawom.

deliveries[]

object (VisitRequest)

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

loadDemands

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

Wymagania dotyczące załadunku (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 uznawany za pusty.

allowedVehicleIndices[]

integer

Zestaw pojazdów, które mogą zrealizować tę dostawę. Jeśli to pole jest puste, wszystkie pojazdy mogą wykonać to działanie. 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:

  • taką samą liczbę elementów jak costsPerVehicleIndices. costsPerVehicle[i] odpowiada pojazdowi costsPerVehicleIndices[i] w modelu.
  • zawierać 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, do których odnosi się 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. Następnie ustawienie pickupToDeliveryAbsoluteDetourLimit wymusza:

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

Jeśli w przypadku tej samej dostawy 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.

Czas trwania w sekundach z maksymalnie 9 miejscami po przecinku, zakończony znakiem „s”. Przykład: "3.5s".

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 objazdu: rozwiązanie będzie uwzględniać obie specyfikacje.

Czas trwania w sekundach z maksymalnie 9 miejscami po przecinku, zakończony znakiem „s”. Przykład: "3.5s".

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ę przesyłki. Ta etykieta jest zgłaszana w odpowiedzi w polu shipmentLabel odpowiedniego obiektu ShipmentRoute.Visit.

ignore

boolean

Jeśli wartość to prawda, 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 ogólnego 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ą 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. Następnie ustawienie pickupToDeliveryRelativeDetourLimit wymusza:

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

Jeśli w przypadku tej samej dostawy 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 w 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)

Lokalizacja geograficzna, do 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ć wartości 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ć wartości arrivalWaypoint.

departureLocation

object (LatLng)

Lokalizacja geograficzna, z której pojazd odjeżdża po zakończeniu tego VisitRequest. Można pominąć, jeśli jest taki sam jak arrivalLocation. Jeśli model dostawy zawiera macierze odległości i czasu trwania, nie można określić wartości 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 taki sam jak arrivalWaypoint. Jeśli model dostawy zawiera macierze odległości i czasu trwania, nie można określić wartości 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 wizyty. 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 ikony 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ć, a także muszą być podane w kolejności rosnącej.

Wartości costPerHourAfterSoftEndTimesoftEndTime można ustawić tylko wtedy, gdy jest dostępne jedno okno czasowe.

duration

string (Duration format)

Czas trwania wizyty, czyli czas spędzony przez pojazd między przyjazdem a odjazdem (do dodania do ewentualnego czasu oczekiwania; patrz timeWindows).

Czas trwania w sekundach z maksymalnie 9 miejscami po przecinku, zakończony znakiem „s”. Przykład: "3.5s".

cost

number

Koszt obsługi tego żądania wizyty na trasie pojazdu. Możesz 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 tego żądania wizyty. Działa to tak samo jak pole 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 ukończenie wizyty (patrz Vehicle.extra_visit_duration_for_visit_type).

Typ może wystąpić tylko raz.

label

string

Określa etykietę dla tego 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, ale nie gwarantujemy, że zawracanie zostanie całkowicie wyeliminowane. 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 [–180,0, +180,0].

Punkt pośredni

Zawiera punkt pośredni. 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,

  // Union field location_type can be only one of the following:
  "location": {
    object (Location)
  },
  "placeId": string
  // End of list of possible types for union field location_type.
}
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 to miejsce, aby pojazd mógł zatrzymać się po stronie drogi, w kierunku której jest ono przesunięte 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żerów. 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ć.

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

object (Location)

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

placeId

string

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

Jeśli używasz identyfikatora miejsca do określania 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.

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 na kompasie powiązany z kierunkiem ruchu. Ta wartość służy do określania strony drogi, z której ma nastąpić odbiór lub 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 w ramach wizyty lub czas rozpoczęcia i zakończenia przejazdu pojazdu.

Sztywne granice czasowe startTimeendTime 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ło zdarzenie. Wartości startTime, endTime, softStartTimesoftEndTime powinny mieścić się w globalnych limitach czasu (patrz ShipmentModel.global_start_timeShipmentModel.global_end_time) i spełniać te warunki:

  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 okna ścisłego. 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)

Godzina zakończenia sztywnego 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żona godzina 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ę dodany do innych kosztów w modelu, jeśli zdarzenie wystąpi przed 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ę dodany 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 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

Nazwa pojazdu zdefiniowana przez użytkownika. 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, oraz na 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)

Lokalizacja geograficzna, w której 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ć wartości startLocation.

startWaypoint

object (Waypoint)

Punkt pośredni reprezentujący lokalizację geograficzną, w której pojazd rozpoczyna podróż przed odebraniem przesyłek. Jeśli nie określono ani startWaypoint, ani startLocation, pojazd rozpoczyna przejazd od pierwszego miejsca odbioru. Jeśli model dostawy zawiera macierze czasu trwania i odległości, nie można określić wartości startWaypoint.

endLocation

object (LatLng)

Lokalizacja geograficzna, w której pojazd kończy ostatni VisitRequest. Jeśli nie zostanie określony, ShipmentRoute pojazdu ShipmentRoute 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ć wartości endLocation.

endWaypoint

object (Waypoint)

Punkt pośredni reprezentujący lokalizację geograficzną, w której pojazd kończy ostatni VisitRequest. Jeśli nie podasz ani 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ć wartości 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)

Okresy, 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 limitów poza globalnymi limitami czasu.

Przedziały czasu należące do tego samego pola powtarzanego muszą być rozłączne, tzn. żaden przedział czasu nie może nakładać się na inny ani z nim sąsiadować, a ponadto muszą być ułożone w porządku chronologicznym.

Wartości costPerHourAfterSoftEndTimesoftEndTime można ustawić tylko wtedy, gdy jest dostępne jedno okno czasowe.

endTimeWindows[]

object (TimeWindow)

Przedziały czasowe, 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 limitów poza globalnymi limitami czasu.

Przedziały czasu należące do tego samego pola powtarzanego muszą być rozłączne, tzn. żaden przedział czasu nie może nakładać się na inny ani z nim sąsiadować, a ponadto muszą być ułożone w porządku chronologicznym.

Wartości costPerHourAfterSoftEndTimesoftEndTime można ustawić tylko wtedy, gdy jest dostępne jedno okno czasowe.

unloadingPolicy

enum (UnloadingPolicy)

Zasady rozładunku są egzekwowane w przypadku pojazdu.

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 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 godzinowy 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 jednego 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 do 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 pojazd nie będzie przemieszczać się z lokalizacji początkowej do końcowej i nie będzie dla niego zaplanowana żadna breakRule ani opóźnienie (od TransitionAttributes). W tym przypadku ShipmentRoute pojazdu nie zawiera żadnych informacji poza indeksem i etykietą pojazdu.

routeDurationLimit

object (DurationLimit)

Limit zastosowany do łącznego czasu trwania trasy pojazdu. W danym OptimizeToursResponse czas trwania trasy pojazdu to różnica między jego vehicleEndTimevehicleStartTime.

travelDurationLimit

object (DurationLimit)

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

routeDistanceLimit

object (DistanceLimit)

Limit zastosowany do całkowitej odległości trasy 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 elementem 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 każdego z nich zostanie dodany czas trwania na mapie.

breakRule

object (BreakRule)

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

label

string

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

ignore

boolean

Jeśli ma wartość true, atrybut 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żenia, który można zastosować 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 wartości 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 jest traktowany jako 1,0.

OSTRZEŻENIE: czasy podróży zostaną zaokrąglone 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

Tryby podróży, 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: WALKING trasy 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 swojej 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 wskazówkom dojazdu pieszo.

RouteModifiers

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

avoidHighways

boolean

Określa, czy w miarę możliwości unikać autostrad. Preferowane będą trasy bez autostrad. Dotyczy to 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 to tylko zmotoryzowanych środków transportu.

avoidIndoor

boolean

Opcjonalnie: Określa, czy należy unikać nawigacji w pomieszczeniach, jeśli jest to możliwe. Priorytet będą miały trasy, które nie zawierają nawigacji w pomieszczeniach. Dotyczy to tylko trybu podróży WALKING.

UnloadingPolicy

Zasady dotyczące sposobu rozładunku pojazdu. Dotyczy tylko przesyłek, w przypadku których występuje zarówno odbiór, jak i dostawa.

Pozostałe przesyłki mogą być dostarczane 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 niż odbiory
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 kiedykolwiek przekroczy softMaxLoad na trasie tego 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 definiować tylko w przypadku typów, które w całym modelu dotyczą tylko odbiorów lub tylko dostaw.

startLoadInterval

object (Interval)

Dopuszczalny przedział czasu załadunku pojazdu na początku trasy.

endLoadInterval

object (Interval)

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

maxLoad

string (int64 format)

Maksymalna dopuszczalna wartość obciążenia.

costPerKilometer

object (LoadCost)

Koszt przewiezienia 1 jednostki ładunku na odległość 1 km w przypadku tego pojazdu. Może to być używane jako 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 kwot obciążenia.

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

string (int64 format)

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

max

string (int64 format)

Maksymalne dopuszczalne obciążenie. Wartość musi być ≥ 0. Jeśli nie zostanie określona, maksymalne obciążenie nie będzie ograniczone przez tę wiadomość. Jeśli oba parametry są określone, wartość min musi być ≤ max.

LoadCost

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

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

W przypadku tego kosztu rozwiązania preferują najpierw realizować żądania o wysokim priorytecie lub odbierać je 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

W tym przypadku 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ć >= 0.

costPerUnitBelowThreshold

number

Koszt przeniesienia jednostki ładunku dla każdej jednostki w zakresie od 0 do wartości progowej. Musi to być wartość skończona i >= 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 i >= 0.

DurationLimit

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

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

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

string (Duration format)

Limit bezwzględny ograniczający czas trwania do maksymalnie maxDuration.

Czas trwania w sekundach z maksymalnie 9 miejscami po przecinku, zakończony znakiem „s”. Przykład: "3.5s".

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 wartość softMaxDuration jest zdefiniowana, musi być nieujemna. Jeśli zdefiniowano też maxDuration, wartość softMaxDuration musi być mniejsza niż maxDuration.

Czas trwania w sekundach z maksymalnie 9 miejscami po przecinku, zakończony znakiem „s”. Przykład: "3.5s".

quadraticSoftMaxDuration

string (Duration format)

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

Jeśli wartość quadraticSoftMaxDuration jest zdefiniowana, musi być nieujemna. Jeśli zdefiniowano też wartość maxDuration, wartość quadraticSoftMaxDuration musi być mniejsza niż maxDuration, a różnica nie może być większa niż jeden dzień:

maxDuration - quadraticSoftMaxDuration <= 86400 seconds

Czas trwania w sekundach z maksymalnie 9 miejscami po przecinku, zakończony znakiem „s”. Przykład: "3.5s".

costPerHourAfterSoftMax

number

Koszt za godzinę 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 sposób opisany poniżej:

  costPerHourAfterSoftMax * (duration - softMaxDuration)

Koszt musi być nieujemny.

costPerSquareHourAfterQuadraticSoftMax

number

Koszt za godzinę kwadratową poniesiony 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 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 tymczasowy, musisz określić wartości softMaxMeters i costPerKilometerAboveSoftMax, które nie mogą być ujemne.

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ć liczbą ujemną.

softMaxMeters

string (int64 format)

Miękki limit, który nie wymusza maksymalnej odległości, ale w przypadku przekroczenia powoduje naliczenie kosztu, 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, który wzrasta do softMaxMeters, obliczany według wzoru:

  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 wystą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 uruchomieniem pojazdu (pojazd nie może zostać uruchomiony w trakcie przerwy), w którym to przypadku nie ma wpływu na czas uruchomienia pojazdu.
  • lub po zakończeniu przejazdu (analogicznie z godziną zakończenia przejazdu).
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 te warunki muszą zostać spełnione do BreakRequest BreakRule. Zobacz FrequencyConstraint.

BreakRequest

Sekwencja przerw (czyli ich liczba i kolejność) obowiązująca w przypadku każdego pojazdu musi być znana z wyprzedzeniem. Powtarzające się symbole BreakRequest określają 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. Musi być dodatnia.

Czas trwania w sekundach z maksymalnie 9 miejscami po przecinku, zakończony znakiem „s”. Przykład: "3.5s".

FrequencyConstraint

Można dodatkowo ograniczyć częstotliwość i czas trwania przerw określonych powyżej, wprowadzają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.

FrequencyConstraint może w praktyce dotyczyć przerw, które nie następują po sobie. Na przykład ten 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 w przypadku tego ograniczenia. Nieujemna. Zobacz opis FrequencyConstraint.

Czas trwania w sekundach z maksymalnie 9 miejscami po przecinku, zakończony znakiem „s”. Przykład: "3.5s".

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. Musi być dodatnia.

Czas trwania w sekundach z maksymalnie 9 miejscami po przecinku, zakończony znakiem „s”. Przykład: "3.5s".

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ą zdefiniowanych wcześniej 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. 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 Tak samo jak 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 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 odległości. Jeśli to pole jest puste, dotyczy wszystkich pojazdów i może zawierać tylko jedną macierz.

Każdy początek podróży 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ć inne 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 w danym wierszu. Musi zawierać tyle elementów, ile pole ShipmentModel.duration_distance_matrix_dst_tags.

Czas trwania w sekundach z maksymalnie 9 miejscami po przecinku, zakończony znakiem „s”. Przykład: "3.5s".

meters[]

number

Wartości odległości dla danego wiersza. Jeśli w modelu nie ma kosztów ani ograniczeń związanych z odległościami, 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 2 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 ich 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 jedno z pól srcTag i excludedSrcTag musi być niepuste.

dstTag

string

Wizyta w miejscu docelowym lub zakończenie podróży pojazdem są zgodne, jeśli ich 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 jedno z pól dstTag i excludedDstTag musi być niepuste.

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 tej zmiany. Może się sumować z dowolną wartością Vehicle.cost_per_kilometer określoną 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.

Czas trwania w sekundach z maksymalnie 9 miejscami po przecinku, zakończony znakiem „s”. Przykład: "3.5s".

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. Dwie przesyłki o różnych wartościach shipment_types na liście są „niezgodne”.

incompatibilityMode

enum (IncompatibilityMode)

Tryb zastosowany w przypadku niezgodności.

IncompatibilityMode

Tryby określające, jak wygląd niezgodnych przesyłek jest ograniczony 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ą udostępniać ten sam pojazd tylko wtedy, gdy jeden 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ą określone 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 samego, 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 wymagania. 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 co najmniej 1 przesyłkę „wymaganą” w pojeździe.

Odbiór przesyłki „zależnej” musi zatem mieć:

  • dostawa „wymaganego” zamówienia tylko z dostawą na trasie po
  • Wymagana przesyłka odebrana na trasie przed przesyłką zależną, 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 jak wcześniej, z tym że w momencie dostawy przesyłki „zależne” muszą mieć w pojeździe przesyłkę „wymaganą”.

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

Kilka precedensów 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)

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

Czas trwania w sekundach z maksymalnie 9 miejscami po przecinku, zakończony znakiem „s”. Przykład: "3.5s".

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.