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 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 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ś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 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 wizytę w celu 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 przesyłka została uznana 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 wartość null.

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] tego 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 alternatywy są wybrane w przypadku odbioru i dostawy, 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.

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 shipmentLabel odpowiedniego 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ć 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 taki sam jak 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 taki sam jak 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 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 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 tylko 1 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))

Wymagania dotyczące wczytywania związane z tą prośbą o wizytę. 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 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. 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 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 daną lokalizację, aby pojazd mógł zatrzymać się po stronie drogi, w kierunku której jest przesunięta ta lokalizacja względem ś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 przedziału czasowego, 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 powinny uwzględniać:

  0 <= `startTime` <= `endTime` and
  0 <= `startTime` <= `softStartTime` and
  0 <= `softEndTime` <= `endTime`.
Zapis JSON
{
  "startTime": string,
  "endTime": string,
  "softStartTime": string,
  "softEndTime": string,
  "costPerHourBeforeSoftStartTime": number,
  "costPerHourAfterSoftEndTime": number
}
Pola
startTime

string (Timestamp format)

Czas rozpoczęcia 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)

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ę 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 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 nazwa wyświetlana pojazdu. Może mieć maksymalnie 63 znaki i zawierać znaki UTF-8.

travelMode

enum (TravelMode)

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

routeModifiers

object (RouteModifiers)

Zbiór warunków, 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 pośredni 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 przejazd 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 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ć parametru endLocation.

endWaypoint

object (Waypoint)

Punkt pośredni reprezentujący położenie geograficzne, w którym 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ć 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)

Okresy, w których pojazd może wyruszyć z lokalizacji początkowej. Muszą mieścić się w globalnych limitach czasu (patrz pola ShipmentModel.global_*). Jeśli nie określisz tu żadnej wartości, nie będzie limitów 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 kolejności chronologicznej.

Wartości costPerHourAfterSoftEndTimesoftEndTime można ustawić tylko wtedy, gdy jest tylko 1 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 czasu (patrz pola ShipmentModel.global_*). Jeśli nie określisz tu żadnej wartości, nie będzie limitów 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 kolejności chronologicznej.

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

unloadingPolicy

enum (UnloadingPolicy)

Zasady rozładunku obowiązują w przypadku pojazdu.

loadLimits

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

ładowność pojazdu (waga, objętość, liczba palet itp.); 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 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 kilometra 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 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 nie będzie się przemieszczać z lokalizacji początkowej do końcowej, a dla tego pojazdu nie będzie zaplanowana żadna właściwość breakRule ani opóźnienie (od TransitionAttributes). W tym przypadku ShipmentRoute pojazdu nie zawiera żadnych informacji poza indeksem i etykietą pojazdu.

routeDurationLimit

object (DurationLimit)

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

travelDurationLimit

object (DurationLimit)

Limit zastosowany 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 czasy 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 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 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 parametrze injectedFirstSolutionRoutes, jest pomijana w pierwszym rozwiązaniu, ale może być realizowana w odpowiedzi.

Jeśli dostawa jest realizowana przez pojazd zignorowany w parametrze 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 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 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 trasie pieszej.

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 miarę możliwości należy unikać dróg płatnych. Priorytetowo traktowane będą trasy, na których nie ma dróg płatnych. Dotyczy to tylko zmotoryzowanych środków transportu.

avoidHighways

boolean

Określa, czy w miarę możliwości unikać autostrad. Priorytetowo traktowane 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. 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 należy unikać nawigacji w pomieszczeniach, jeśli jest to możliwe. Priorytetowo traktowane będą trasy, które nie zawierają nawigacji w pomieszczeniach. Dotyczy 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 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ą po prostu następować 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 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. 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ś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 realizację żądań o wysokim priorytecie lub odbiór żądań o wysokim priorytecie 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 tę 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 w przypadku przekroczenia 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 gdy zostanie przekroczony, 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:

  • Musi być nieujemna.
  • Wartość maxDuration musi być zdefiniowana.
  • Wartość quadraticSoftMaxDuration musi być mniejsza niż maxDuration.
  • Różnica nie może przekraczać 1 dnia: 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 softMaxMeterscostPerKilometerAboveSoftMax, 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)

Limit miękki, 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 może wzrosnąć do softMaxMeters, obliczany według tego 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 pracy pojazdu (np. przerw na lunch). Przerwa to ciągły okres, w którym pojazd pozostaje w bezruchu w bieżącej 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 takim przypadku wydłuża to odpowiedni czas przejazdu między wizytami.
  • lub przed rozpoczęciem jazdy (pojazd nie może zostać uruchomiony w trakcie przerwy), w którym to przypadku nie ma to wpływu na czas rozpoczęcia jazdy.
  • 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 muszą być 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, 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ć w ten sposób: 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 przedziały 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, 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 Tak samo jak powyżej, ale z uwzględnieniem tylko czasu podróży.
MIN_NUM_VEHICLES Ogranicz liczbę używanych pojazdów.

DurationDistanceMatrix

Określa macierz czasu trwania i odległości od lokalizacji wizyty i punktów początkowych pojazdów do lokalizacji wizyty i punktów końcowych pojazdów.

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 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 źródłowa lub uruchomienie pojazdu pasuje, jeśli jego 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 przejazdu pasuje, jeśli jej 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 on doliczany 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ż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 (shipmentType). Wygląd niezgodnych przesyłek na tej samej trasie jest ograniczony 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 mające różne shipment_types spośród wymienionych 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ą, zrealizowana na trasie po
  • Wymagany transport odebrany na trasie przed nim, a jeśli wymagany transport ma dostawę, musi ona zostać zrealizowana po odbiorze transportu zależnego.
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”.

Kilka relacji 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.