ShipmentModel

Model dostawy obejmuje zestaw dostaw, który musi być realizowany przez zestaw pojazdów przy minimalizacji całkowitego kosztu, który jest sumą:

  • koszt kierowania pojazdami (suma kosztu łącznego czasu, koszt podróży i stały koszt dla wszystkich pojazdów).
  • kary za niewykonaną dostawę.
  • globalny koszt dostaw
Zapis JSON
{
  "shipments": [
    {
      object (Shipment)
    }
  ],
  "vehicles": [
    {
      object (Vehicle)
    }
  ],
  "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ć zrealizowane w ramach modelu.

vehicles[]

object (Vehicle)

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

globalStartTime

string (Timestamp format)

Globalny czas rozpoczęcia i zakończenia modelu: żadne okresy spoza tego zakresu nie mogą zostać uznane za prawidłowe.

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

Gdy używasz pól cost_per_*hour, możesz ustawić krótszy przedział czasu, aby zwiększyć skuteczność (np. jeśli modelujesz jeden dzień, ustaw globalne limity czasu na ten dzień). Jeśli nie jest ustawiona, domyślnie jest używany czas 00:00:00 UTC, 1 stycznia 1970 r. (tzn. sekundy: 0, nanos: 0).

Sygnatura czasowa w RFC3339 UTC „Zulu” z rozdzielczością nanosekundową i maksymalnie 9 cyframi po przecinku. Przykłady: "2014-10-02T15:01:23Z" i "2014-10-02T15:01:23.045123456Z".

globalEndTime

string (Timestamp format)

Jeśli nie jest ustawiona, domyślnie używana jest wartość 00:00:00 UTC, 1 stycznia 1971 r. (tzn. sekund: 31536000, nanos: 0).

Sygnatura czasowa w RFC3339 UTC „Zulu” z rozdzielczością nanosekundową i maksymalnie 9 cyframi po przecinku. Przykłady: "2014-10-02T15:01:23Z" i "2014-10-02T15:01:23.045123456Z".

globalDurationCostPerHour

number

„Globalny czas trwania” całego planu to różnica między najwcześniejszym rzeczywistym godzinem rozpoczęcia a najpóźniejszą obowiązującą godziną zakończenia wszystkich pojazdów. Użytkownicy mogą przypisać kosztowi godzinowemu temu rodzajowi konwersji, aby np. zoptymalizować kampanię pod kątem najwcześniejszego realizacji zadania. Ten koszt musi być 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 będzie puste, zamiast niego będą używane Mapy Google lub odległości geodezyjne w zależności od wartości w polu useGeodesicDistances. Jeśli pole nie jest puste, useGeodesicDistances nie może mieć wartości true (prawda), ani durationDistanceMatrixSrcTags, ani durationDistanceMatrixDstTags nie mogą być puste.

Przykłady użycia:

  • Są 2 lokalizacje: locA i locB.
  • 1 pojazd rozpoczynający trasę w lokalu locA i kończący go w lokalizacji locA.
  • 1 prośba o odbiór w lokalu locB.
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ą trzy lokalizacje: locA, locB oraz locC.
  • 1 pojazd, który rozpoczyna swoją trasę w locA, a kończy w lokalizacji locB, korzystając z matrycy „szybkiej”.
  • 1 pojazd rozpoczynający swoją trasę w locB, a kończący w lokalizacji locB, z wykorzystaniem matrycy „slow”.
  • 1 pojazd, który rozpoczyna swoją trasę w locB, a kończy w lokalizacji locB, korzystając z matrycy „szybkiej”.
  • 1 prośba o odbiór w lokalu locC.
model {
  vehicles { startTags: "locA" endTags: "locB" startTags: "fast" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "slow" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "fast" }
  shipments { pickups { tags: "locC" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixSrcTags: "locC"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrixDstTags: "locC"
  durationDistanceMatrices {
    vehicleStartTag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  durationDistanceMatrices {
    vehicleStartTag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
durationDistanceMatrixSrcTags[]

string

tagi definiujące źródła macierzy czasu trwania i odległości; Funkcja durationDistanceMatrices(i).rows(j) określa czasy trwania i odległości od wizyt z tagiem durationDistanceMatrixSrcTags(j) do innych wizyt w tabeli i.

Znaczniki odpowiadają wartości VisitRequest.tags lub Vehicle.start_tags. Dany parametr VisitRequest lub Vehicle musi pasować dokładnie do 1 tagu w tym polu. Pamiętaj, że tagi źródła, miejsca docelowego i matrycy elementu Vehicle mogą być takie same. podobnie tag źródłowy i docelowy tagu 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

tagów definiujących docelowe macierze czasu trwania i odległości; durationDistanceMatrices(i).rows(j).durations(k) (odp. Funkcja durationDistanceMatrices(i).rows(j).meters(k)) określa czas trwania (reprezentatywną odległość) podróży z wizyt z tagiem durationDistanceMatrixSrcTags(j) do wizyt z tagiem durationDistanceMatrixDstTags(k) w macierzy i.

Znaczniki odpowiadają wartości VisitRequest.tags lub Vehicle.start_tags. Dany parametr VisitRequest lub Vehicle musi pasować dokładnie do 1 tagu w tym polu. Pamiętaj, że tagi źródła, miejsca docelowego i matrycy elementu Vehicle mogą być takie same. podobnie tag źródłowy i docelowy tagu 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 zostały dodane do modelu.

shipmentTypeIncompatibilities[]

object (ShipmentTypeIncompatibility)

Zestawy niezgodnych typów przesyłki (patrz ShipmentTypeIncompatibility).

shipmentTypeRequirements[]

object (ShipmentTypeRequirement)

Zestawy wymagań shipmentType (patrz ShipmentTypeRequirement).

precedenceRules[]

object (PrecedenceRule)

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

maxActiveVehicles

integer

Ogranicza maksymalną liczbę aktywnych pojazdów. Pojazd jest aktywny, jeśli na trasie jest realizowana co najmniej 1 dostawa. Pozwala to ograniczyć liczbę tras w sytuacjach, gdy kierowców jest mniej niż pojazdów, a flota jest heterogeniczna. Optymalizacja wybierze najlepszy podzbiór pojazdów do użycia. Musi być wyłącznie dodatnia.

Wysyłka

Dostawa pojedynczego produktu, od odbioru do jednej dostawy. Aby przesyłka została uznana za wykonaną, unikalny pojazd musi odwiedzić jedno z miejsc odbioru (i odpowiednio zmniejszyć ilość zapasowego), a następnie odwiedzić jedno z miejsc dostawy (i w związku z tym odpowiednio zwiększyć pojemność zapasową).

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

string

Zdefiniowana przez użytkownika wyświetlana nazwa przesyłki. Może składać się z maksymalnie 63 znaków i zawierać znaki UTF-8.

pickups[]

object (VisitRequest)

Zestaw alternatywnych opcji odbioru powiązanych z dostawą. Jeśli go nie podasz, pojazd musi udać się tylko do lokalizacji odpowiadającej dostawcom.

deliveries[]

object (VisitRequest)

Zestaw alternatywnych opcji dostawy powiązanych z dostawą. Jeśli go nie podasz, pojazd musi udać się tylko do lokalizacji odpowiadającej punktom odbioru.

loadDemands

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

Obciążenie przesyłki (np. waga, objętość, liczba palet itd.). Klucze na mapie powinny być identyfikatorami opisującymi rodzaj danego obciążenia, najlepiej uwzględniając też jednostki. Na przykład: „weight_kg”, „volume_gallons”, „pallet_count” itp. Jeśli dany klucz nie pojawi się na mapie, odpowiadające mu obciążenie zostanie uznane za puste.

Obiekt zawierający listę par "key": value. Przykład: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

allowedVehicleIndices[]

integer

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

costsPerVehicle[]

number

Określa koszt, jaki jest naliczany w momencie dostarczenia tej przesyłki przez każdy pojazd. Jeśli pole jest określone, musi zawierać KAŻDY:

  • tyle samo co costsPerVehicleIndices. costsPerVehicle[i] odpowiada pojazdowi costsPerVehicleIndices[i] tego modelu.
  • tyle samo elementów, ile jest w modelu. i-tym element odpowiada pojazdowi nr i modelu.

Koszty muszą być podane w tej samej jednostce co penaltyCost i nie mogą być ujemne. Pozostaw to pole puste, jeśli nie ma takich kosztów.

costsPerVehicleIndices[]

integer

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

pickupToDeliveryAbsoluteDetourLimit

string (Duration format)

Określa maksymalny bezwzględny czas objazdu w porównaniu z najkrótszą ścieżką od odbioru do dostawy. Jeśli jest określona, nie może być ujemna, a przesyłka musi zawierać co najmniej informacje o odbiorze i dostawie.

Na przykład nie może to być najkrótszy czas, jaki zajmie Ci przejście z wybranej opcji odbioru bezpośrednio do wybranej opcji dostawy. Następnie ustawienie zasady pickupToDeliveryAbsoluteDetourLimit wymusza:

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

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

Czas trwania w sekundach składający się z maksymalnie 9 cyfr po przecinku, kończący się cyfrą „s”. Przykład: "3.5s".

pickupToDeliveryTimeLimit

string (Duration format)

Określa maksymalny czas trwania od rozpoczęcia odbioru do rozpoczęcia dostawy. Jeśli jest określona, nie może być ujemna, a przesyłka musi zawierać co najmniej informacje o odbiorze i dostawie. Nie zależy to od tego, które alternatywne rozwiązania zostaną wybrane do odbioru i dostawy, ani od szybkości pojazdu. Można to określić razem z maksymalnymi ograniczeniami objazdu, ponieważ rozwiązanie będzie przestrzegać obu specyfikacji.

Czas trwania w sekundach składający się z maksymalnie 9 cyfr po przecinku, kończący się cyfrą „s”. Przykład: "3.5s".

shipmentType

string

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

Różni się od visitTypes, który jest określony dla pojedynczej wizyty: wszystkie odbioru/dostawy należące do tej samej przesyłki korzystają z tego samego identyfikatora shipmentType.

label

string

Określa etykietę wysyłki. Ta etykieta jest podawana w odpowiedzi w shipmentLabel odpowiedniego elementu ShipmentRoute.Visit.

ignore

boolean

Jeśli tak, pomiń tę przesyłkę, ale nie stosuj penaltyCost.

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

Dopuszczalne jest ignorowanie wysyłki w injectedFirstSolutionRoutes lub injectedSolutionConstraint. usunie z tej trasy powiązane wizyty związane z odbiorem/dostawą. precedenceRules, które odwołują się do ignorowanych przesyłek, również będą ignorowane.

penaltyCost

number

Jeśli dostawa nie zostanie ukończona, kara zostanie dodana do całkowitego kosztu tras. Wysyłka jest uznawana za zrealizowaną, jeśli dostępna jest jedna z alternatywnych opcji odbioru lub dostawy. Koszt może być wyrażony w tej samej jednostce, która jest używana we wszystkich innych polach związanych z kosztem w modelu, i musi być dodatni.

WAŻNE: jeśli ta kara nie zostanie określona, uznamy ją za nieskończoną, co oznacza, że dostawa musi zostać zrealizowana.

pickupToDeliveryRelativeDetourLimit

number

Określa maksymalny względny czas objazdu w porównaniu z najkrótszą ścieżką od odbioru do dostawy. Jeśli jest określona, nie może być ujemna, a przesyłka musi zawierać co najmniej informacje o odbiorze i dostawie.

Na przykład nie może to być najkrótszy czas, jaki zajmie Ci przejście z wybranej opcji odbioru bezpośrednio do wybranej opcji dostawy. Następnie ustawienie zasady pickupToDeliveryRelativeDetourLimit wymusza:

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

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

VisitRequest

Prośba o zwiedzanie, którą może zrealizować pojazd: określona lokalizacja geograficzna (lub dwie, patrz poniżej), godziny otwarcia i zamknięcia wyrażone w przedziałach czasowych oraz czas trwania obsługi (czas spędzony przez pojazd po dotarciu do miejsca odbioru lub odesłaniu 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
}
Pola
arrivalLocation

object (LatLng)

Lokalizacja geograficzna, do której przyjeżdża pojazd podczas wykonywania tej czynności (VisitRequest). Jeśli model dostawy zawiera macierze odległości między czasem trwania, nie można podawać wartości arrivalLocation.

arrivalWaypoint

object (Waypoint)

Punkt pośredni, do którego przyjeżdża pojazd, wykonując tę czynność VisitRequest. Jeśli model dostawy zawiera macierze odległości między czasem trwania, nie można podawać wartości arrivalWaypoint.

departureLocation

object (LatLng)

Lokalizacja geograficzna, z której pojazd odjeżdża po ukończeniu tego celu: VisitRequest. Tę wartość można pominąć, jeśli jest taka sama jak arrivalLocation. Jeśli model dostawy zawiera macierze odległości między czasem trwania, nie można podawać wartości departureLocation.

departureWaypoint

object (Waypoint)

Punkt pośredni, do którego odjeżdża pojazd po ukończeniu tego celu: VisitRequest. Tę wartość można pominąć, jeśli jest taka sama jak arrivalWaypoint. Jeśli model dostawy zawiera macierze odległości między czasem trwania, nie można podawać 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 czasu, które ograniczają godzinę przybycia podczas wizyty. Pamiętaj, że pojazd może odjechać poza przedział czasu przyjazdu, tj. godzina przyjazdu + czas przyjazdu nie muszą znajdować się w określonym przedziale czasu. Może to spowodować wydłużenie czasu oczekiwania, jeśli pojazd dotrze do TimeWindow.start_time.

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

Przedziały czasu muszą być rozłączne, tzn. żadne przedziały czasu nie mogą na siebie nachodzić ani przylegać do siebie, a także muszą rosnąć.

Wartości costPerHourAfterSoftEndTime i softEndTime można ustawić tylko wtedy, gdy istnieje 1 przedział czasu.

duration

string (Duration format)

Długość wizyty, tj. czas spędzony w samochodzie między przyjazdem a odjazdem (należy dodać do możliwego czasu oczekiwania; patrz timeWindows).

Czas trwania w sekundach składający się z maksymalnie 9 cyfr po przecinku, kończący się cyfrą „s”. Przykład: "3.5s".

cost

number

Koszt obsługi tej prośby o wizytę w przypadku trasy pojazdu. Umożliwia ona pokrycie różnych kosztów każdego alternatywnego odbioru lub dostawy przesyłki. Koszt musi być w tej samej jednostce co Shipment.penalty_cost i nie może być ujemny.

loadDemands

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

Wczytywanie żądań dotyczących tej wizyty. Działa ono tak samo jak pole Shipment.load_demands z tą różnicą, że dotyczy tylko tego pola VisitRequest, a nie całego pola Shipment. Wymienione tutaj żądania zostaną dodane do żądań wymienionych w sekcji Shipment.load_demands.

Obiekt zawierający listę par "key": value. Przykład: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

visitTypes[]

string

Określa typy wizyty. Możesz go wykorzystać, aby zarezerwować dodatkowy czas wymagany na dokonanie tej wizyty (patrz Vehicle.extra_visit_duration_for_visit_type).

Typ może się pojawić tylko raz.

label

string

Określa etykietę elementu VisitRequest. Ta etykieta jest zgłaszany w odpowiedzi jako visitLabel w odpowiedniej wartości ShipmentRoute.Visit.

LatLng

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

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

number

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

longitude

number

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

Punkt pośredni

Obejmuje punkt pośredni. Punkty Waypoints oznaczają miejsca przyjazdu i wyjazdu w żądaniach VisitRequests oraz lokalizację początkową i końcową Pojazdów.

Zapis JSON
{
  "sideOfRoad": 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 umiejscowienie tego punktu pośredniego powinno umożliwiać zatrzymanie pojazdu po określonej stronie drogi. Po ustawieniu tej wartości trasa będzie przechodzić przez lokalizację, tak aby pojazd mógł się zatrzymać na poboczu drogi, w kierunku której lokalizacja jest przekierowana od środka drogi. Ta opcja nie działa w przypadku opcji „SPACER” środkami transportu.

Pole sumy 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, w tym opcjonalny nagłówek.

placeId

string

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

Lokalizacja

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

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

object (LatLng)

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

heading

integer

Nagłówek kompasu powiązany z kierunkiem ruchu. Ta wartość służy do określania strony drogi na potrzeby odbioru i dostawy. Wartości nagłówka mogą należeć do zakresu od 0 do 360, gdzie 0 oznacza kierunek północny, 90 oznacza kierunek kierunku północnego itd.

TimeWindow

Przedziały czasu ograniczają czas zdarzenia, np. godzinę przyjazdu podczas wizyty lub godzinę rozpoczęcia i zakończenia pojazdu.

Wartości graniczne sztywnych przedziałów czasowych, startTime i endTime, egzekwują najwcześniejszy i najnowszy czas zdarzenia, na przykład startTime <= event_time <= endTime. Dolna granica łagodnego okresu czasu (softStartTime) określa preferencję, aby zdarzenie miało miejsce softStartTime lub później przez naliczanie kosztu proporcjonalnie do czasu, jaki upłynął przed wystąpieniem zdarzenia softStartTime. Górna granica zakresu czasowego (softEndTime) określa preferencję, aby zdarzenie miało miejsce softEndTime lub wcześniej, ponieważ powoduje naliczanie kosztów proporcjonalnie do czasu, jaki upłynął od zdarzenia softEndTime. Wartości startTime, endTime, softStartTime i softEndTime powinny mieścić się w globalnych limitach czasowych (patrz ShipmentModel.global_start_time i ShipmentModel.global_end_time) oraz spełniać te warunki:

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

string (Timestamp format)

Trudny czas rozpoczęcia okna czasowego. Jeśli nie określono inaczej, wartość zostanie ustawiona na ShipmentModel.global_start_time.

Sygnatura czasowa w RFC3339 UTC „Zulu” z rozdzielczością nanosekundową i maksymalnie 9 cyframi po przecinku. Przykłady: "2014-10-02T15:01:23Z" i "2014-10-02T15:01:23.045123456Z".

endTime

string (Timestamp format)

Trudny czas zakończenia przedziału czasowego. Jeśli nie określono inaczej, wartość zostanie ustawiona na ShipmentModel.global_end_time.

Sygnatura czasowa w RFC3339 UTC „Zulu” z rozdzielczością nanosekundową i maksymalnie 9 cyframi po przecinku. Przykłady: "2014-10-02T15:01:23Z" i "2014-10-02T15:01:23.045123456Z".

softStartTime

string (Timestamp format)

Godzina łagodnego rozpoczęcia przedziału czasu.

Sygnatura czasowa w RFC3339 UTC „Zulu” z rozdzielczością nanosekundową i maksymalnie 9 cyframi po przecinku. Przykłady: "2014-10-02T15:01:23Z" i "2014-10-02T15:01:23.045123456Z".

softEndTime

string (Timestamp format)

Godzina zakończenia okresu.

Sygnatura czasowa w RFC3339 UTC „Zulu” z rozdzielczością nanosekundową i maksymalnie 9 cyframi po przecinku. Przykłady: "2014-10-02T15:01:23Z" i "2014-10-02T15:01:23.045123456Z".

costPerHourBeforeSoftStartTime

number

Koszt za godzinę dodany do innych kosztów w modelu, jeśli zdarzenie nastąpi przed softStartTime. Wartość jest obliczana według wzoru:

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

costPerHourAfterSoftEndTime

number

Koszt za godzinę dodany do innych kosztów w modelu, jeśli zdarzenie wystąpi po softEndTime. Wartość obliczana ze wzoru:

   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 skonfigurowano opcję softEndTime.

Pojazd

Modelowanie pojazdu w przypadku problemu z dostawą. Rozwiązanie problemu z dostawą spowoduje utworzenie trasy dla tego pojazdu rozpoczynającej się od startLocation i kończącej na endLocation. Trasa jest sekwencją wizyt (patrz ShipmentRoute).

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

string

Zdefiniowana przez użytkownika wyświetlana nazwa pojazdu. Może składać się z maksymalnie 63 znaków i zawierać znaki UTF-8.

travelMode

enum (TravelMode)

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

startLocation

object (LatLng)

Lokalizacja geograficzna, w której pojazd rozpoczyna się przed odebraniem przesyłki. Jeśli nie podasz żadnej wartości, pojazd rozpocznie się przy pierwszym odbiorze. Jeśli model dostawy zawiera macierze czasu trwania i odległości, nie można określić startLocation.

startWaypoint

object (Waypoint)

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

endLocation

object (LatLng)

Lokalizacja geograficzna, w której kończy się pojazd (VisitRequest). Jeśli nie określono inaczej, okres ShipmentRoute pojazdu kończy się natychmiast po zakończeniu ostatnich VisitRequest. Jeśli model dostawy zawiera macierze czasu trwania i odległości, nie można określić endLocation.

endWaypoint

object (Waypoint)

Punkt pośredni reprezentujący lokalizację geograficzną, w której kończy się pojazd po zakończeniu ostatniego VisitRequest. Jeśli nie określisz wartości endWaypoint ani endLocation, ShipmentRoute pojazdu zakończy się natychmiast po zakończeniu ostatniego okresu VisitRequest. Jeśli model dostawy zawiera macierze czasu trwania i odległości, nie można określić endWaypoint.

startTags[]

string

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

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

endTags[]

string

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

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

startTimeWindows[]

object (TimeWindow)

Przedziały czasu, w których pojazd może odjechać ze swojej lokalizacji początkowej. Muszą mieścić się w globalnych limitach czasowych (patrz pola ShipmentModel.global_*). Jeśli nie określono inaczej, nie ma żadnych ograniczeń poza tymi globalnymi limitami czasu.

Przedziały czasu należące do tego samego pola powtarzanego muszą być rozłączne, tj. żadne przedziały czasu nie mogą na siebie nachodzić ani przylegać do siebie i muszą być ułożone w kolejności chronologicznej.

Wartości costPerHourAfterSoftEndTime i softEndTime można ustawić tylko wtedy, gdy istnieje 1 przedział czasu.

endTimeWindows[]

object (TimeWindow)

Przedziały czasu, w których pojazd może dotrzeć do miejsca docelowego. Muszą mieścić się w globalnych limitach czasowych (patrz pola ShipmentModel.global_*). Jeśli nie określono inaczej, nie ma żadnych ograniczeń poza tymi globalnymi limitami czasu.

Przedziały czasu należące do tego samego pola powtarzanego muszą być rozłączne, tj. żadne przedziały czasu nie mogą na siebie nachodzić ani przylegać do siebie i muszą być ułożone w kolejności chronologicznej.

Wartości costPerHourAfterSoftEndTime i softEndTime można ustawić tylko wtedy, gdy istnieje 1 przedział czasu.

unloadingPolicy

enum (UnloadingPolicy)

W pojeździe egzekwowane są zasady wyładowywania.

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 w polu Shipment.load_demands. Jeśli na tej mapie nie ma danego klucza, odpowiadająca mu pojemność jest uznawana za nieograniczoną.

Obiekt zawierający listę par "key": value. Przykład: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

costPerHour

number

Koszty pojazdu: wszystkie koszty są sumowane i muszą być podane w tej samej jednostce co Shipment.penalty_cost.

Koszt za godzinę trasy pojazdu. Koszt ten jest stosowany do łącznego czasu podróży pokonanego na trasie i obejmuje czas podróży, czas oczekiwania i czas wizyty. Użycie usługi costPerHour zamiast tylko costPerTraveledHour może spowodować dodatkowe opóźnienia.

costPerTraveledHour

number

Koszt przebytej godziny trasy pojazdu. Koszt ten jest stosowany tylko do czasu podróży na danej trasie (tj. raportowanego w ShipmentRoute.transitions) i nie uwzględnia czasu oczekiwania ani czasu wizyty.

costPerKilometer

number

Koszt za kilometr trasy pojazdu. Koszt ten jest stosowany do odległości podawanej w raportach ShipmentRoute.transitions i nie dotyczy żadnej odległości pokonanej domyślnie z miejsca arrivalLocation do departureLocation w pojedynczej linii VisitRequest.

fixedCost

number

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

usedIfRouteIsEmpty

boolean

To pole dotyczy tylko pojazdów, których trasa nie obsługuje żadnych przesyłek. Informuje, czy w tym przypadku pojazd należy uznać za używany.

Jeśli wybrano opcję prawda, pojazd porusza się od początku do końca, nawet jeśli nie obsługuje żadnych przesyłek, oraz koszty czasu i odległości związane z rozpoczęciem pracy --> bierzemy pod uwagę podróż końcową.

W przeciwnym razie nie będzie podróżować z początku do miejsca docelowego, a dla tego pojazdu nie zaplanowano żadnych breakRule ani opóźnienia (od TransitionAttributes). W tym przypadku atrybut ShipmentRoute pojazdu nie zawiera żadnych informacji poza numerem indeksu i etykietą pojazdu.

routeDurationLimit

object (DurationLimit)

Limit został zastosowany do łącznego czasu trwania trasy pojazdu. W danym okresie (OptimizeToursResponse) długość trasy pojazdu to różnica między wartościami vehicleEndTime a vehicleStartTime.

travelDurationLimit

object (DurationLimit)

Limit został zastosowany do czasu podróży na trasie pojazdu. W danym okresie (OptimizeToursResponse) czas podróży jest sumą wszystkich wartości wymiaru transitions.travel_duration.

routeDistanceLimit

object (DistanceLimit)

Limit został zastosowany do całkowitej odległości na trasie pojazdu. W danym regionie OptimizeToursResponse odległość na trasie jest sumą wszystkich jego transitions.travel_distance_meters.

extraVisitDurationForVisitType

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

Określa mapowanie z ciągów visitTypes na czasy trwania. Czas trwania jest uzupełnieniem VisitRequest.duration, które mają być wykonywane w przypadku wizyt z określoną wartością visitTypes. Ten dodatkowy czas trwania wizyty zwiększa koszt, jeśli określono costPerHour. Klucze (np. visitTypes) nie mogą być puste.

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

Obiekt zawierający listę par "key": value. Przykład: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

breakRule

object (BreakRule)

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

label

string

Określa etykietę tego pojazdu. Ta etykieta jest zgłaszana w odpowiedzi jako vehicleLabel odpowiadającej jej wartości ShipmentRoute.

ignore

boolean

Jeśli ma wartość true (prawda), usedIfRouteIsEmpty musi mieć wartość false (fałsz), a pojazd pozostanie nieużywany.

Jeśli dostawa jest realizowana przez zignorowany pojazd w injectedFirstSolutionRoutes, zostanie to pominięte w pierwszym rozwiązaniu, ale można je wykonać w odpowiedzi.

Jeśli przesyłka jest realizowana przez zignorowany pojazd w injectedSolutionConstraint, a wszelkie powiązane z nim odbiór lub dostawa muszą pozostać w pojeździe (tj. nie zrelaksowane do poziomu RELAX_ALL_AFTER_THRESHOLD), zostanie to pominięte w odpowiedzi. Jeśli pole allowedVehicleIndices w dostawie nie jest puste, a wszystkie dozwolone pojazdy są ignorowane, zostaną one pominięte w odpowiedzi.

travelDurationMultiple

number

Określa mnożnik, którego można użyć do zwiększenia lub skrócenia czasu podróży tego pojazdu. Na przykład ustawienie wartości 2,0 oznacza, że ten pojazd jest wolniejszy i czas podróży jest 2 razy dłuższy niż w przypadku standardowych pojazdów. Ta wielokrotność nie ma wpływu na czas trwania wizyty. Wpływa na koszty, jeśli określono costPerHour lub costPerTraveledHour. Musi mieścić się w zakresie od 0,001 do 1000,0. Jeśli nie jest skonfigurowana, pojazd jest standardowy, a mnożnik jest uznawany za 1,0.

OSTRZEŻENIE: czas podróży zostanie zaokrąglony do najbliższej sekundy po zastosowaniu wielokrotności, ale przed wykonaniem jakichkolwiek operacji liczbowych, dlatego mała wielokrotność może spowodować utratę dokładności.

Zobacz też extraVisitDurationForVisitType poniżej.

TravelMode

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

Powinny one być podzbiorem preferowanych trybów podróży w interfejsie API tras Google Maps Platform. Zobacz: https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode.

Wartości w polu enum
TRAVEL_MODE_UNSPECIFIED Nieokreślony środek transportu, odpowiednik: DRIVING.
DRIVING Tryb podróży odpowiadający kierunkom jazdy (samochód, ...).
WALKING Tryb podróży odpowiadający trasom pieszym.

UnloadingPolicy

Zasady dotyczące wyładowywania pojazdu. Dotyczy tylko przesyłek z odbiorem i dostawą.

W przypadku innych przesyłek mogą one zostać dostarczone w dowolnym miejscu na trasie niezależnie od firmy unloadingPolicy.

Wartości w polu enum
UNLOADING_POLICY_UNSPECIFIED Nieokreślona zasada wyładowywania; dostawy muszą następować dopiero po odpowiednim odbiorze.
LAST_IN_FIRST_OUT Dostawy muszą być w odwrotnej kolejności do odbioru
FIRST_IN_FIRST_OUT Dostawy muszą być w tym samym zamówieniu co odbiór

LoadLimit

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

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

string (int64 format)

Ograniczony limit obciążenia. Zobacz costPerUnitAboveSoftMax.

costPerUnitAboveSoftMax

number

Jeśli obciążenie na trasie tego pojazdu kiedykolwiek przekroczy softMaxLoad, zostanie nałożona następująca kara za koszt (tylko raz na pojazd): (obciążenie – softMaxLoad) * costPerUnitAboveSoftMax. Wszystkie koszty sumują się i muszą być podane w tej samej jednostce co Shipment.penalty_cost.

startLoadInterval

object (Interval)

Dopuszczalny czas obciążenia pojazdu na początku trasy.

endLoadInterval

object (Interval)

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

maxLoad

string (int64 format)

Maksymalna akceptowalna ilość obciążenia.

Interwał

Odstęp między akceptowanymi wielkościami wczytywania.

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

string (int64 format)

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

max

string (int64 format)

Maksymalne dopuszczalne obciążenie. Wartość musi być ≥ 0. Jeśli nie określono inaczej, ten komunikat nie będzie ograniczać maksymalnego obciążenia. Jeśli obie są określone, min musi mieć wartość ≤ max.

DurationLimit

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

Gdy zdefiniowano pole opcjonalnego limitu, muszą być one określone razem.

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

string (Duration format)

Stały limit ogranicza czas trwania do maksymalnie maxDuration.

Czas trwania w sekundach składający się z maksymalnie 9 cyfr po przecinku, kończący się cyfrą „s”. Przykład: "3.5s".

softMaxDuration

string (Duration format)

Ograniczony limit nie egzekwuje maksymalnego czasu trwania, ale jego naruszenie powoduje naliczanie opłat za trasę. Ten koszt jest częścią innych kosztów określonych w modelu, które obejmują tę samą jednostkę.

Jeśli została określona, softMaxDuration nie może być ujemna. Jeśli zdefiniowano również parametr maxDuration, wartość softMaxDuration musi być mniejsza niż parametr maxDuration.

Czas trwania w sekundach składający się z maksymalnie 9 cyfr po przecinku, kończący się cyfrą „s”. Przykład: "3.5s".

quadraticSoftMaxDuration

string (Duration format)

Ograniczony limit nie egzekwuje maksymalnego czasu trwania, ale w przypadku naruszenia powoduje naliczanie kosztu w postaci kwadratowej. Ten koszt jest częścią innych kosztów określonych w modelu, które obejmują tę samą jednostkę.

Jeśli została określona, quadraticSoftMaxDuration nie może być ujemna. Jeśli zdefiniowano również 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 składający się z maksymalnie 9 cyfr po przecinku, kończący się cyfrą „s”. Przykład: "3.5s".

costPerHourAfterSoftMax

number

Koszt za godzinę po przekroczeniu progu softMaxDuration. Koszt dodatkowy wynosi 0, jeśli czas trwania jest poniżej progu. W przeciwnym razie koszt zależy od czasu trwania:

  costPerHourAfterSoftMax * (duration - softMaxDuration)

Koszt nie może być ujemny.

costPerSquareHourAfterQuadraticSoftMax

number

Koszt godziny kwadratowej poniesiony w przypadku naruszenia progu quadraticSoftMaxDuration.

Koszt dodatkowy wynosi 0, jeśli czas trwania jest poniżej progu. W przeciwnym razie koszt zależy od czasu trwania:

  costPerSquareHourAfterQuadraticSoftMax *
  (duration - quadraticSoftMaxDuration)^2

Koszt nie może być ujemny.

DistanceLimit

Ograniczenie określające maksymalną odległość, jaką można przebyć. Może być twarda lub miękka.

Jeśli zdefiniowany jest limit tymczasowy, muszą być zdefiniowane zarówno softMaxMeters, jak i costPerKilometerAboveSoftMax, i nie mogą być ujemne.

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

string (int64 format)

Twardy limit ogranicza odległość wynoszącą maksymalnie maxMeters. Limit nie może być ujemny.

softMaxMeters

string (int64 format)

Limit częściowy nie egzekwuje maksymalnego limitu odległości, ale jego naruszenie powoduje naliczenie kosztów, które wliczają się do innych kosztów określonych w modelu z tą samą jednostką.

Zdefiniowana wartość softMaxMeters musi być mniejsza niż maxMeters i nie może być ujemna.

costPerKilometerAboveSoftMax

number

Koszt za kilometr naliczany, jeśli odległość przekracza limit softMaxMeters. Koszt dodatkowy wynosi 0, jeśli odległość nie mieści się w limicie. W przeciwnym razie formuła służąca do obliczania kosztu jest następująca:

  (distanceMeters - softMaxMeters) / 1000.0 *
  costPerKilometerAboveSoftMax.

Koszt nie może być ujemny.

BreakRule

Reguły generowania przerw na przejazd pojazdem (np. przerwy na lunch). Przerwa to ciągły okres, w którym pojazd pozostaje nieaktywny w swojej aktualnej pozycji i nie może wykonać żadnej wizyty. Przerwa może wystąpić:

  • w trakcie podróży między dwiema wizytami (obejmuje to czas bezpośrednio przed wizytą lub tuż po niej, ale nie w jej trakcie). W takim przypadku wydłuża on odpowiedni czas przewozu między kolejnymi wizytami.
  • lub przed uruchomieniem pojazdu (pojazd może nie uruchomić się w trakcie przerwy) – w takim przypadku nie ma to wpływu na czas uruchomienia pojazdu.
  • lub po zakończeniu pojazdu (edytuj, z godziną zakończenia pojazdu).
Zapis JSON
{
  "breakRequests": [
    {
      object (BreakRequest)
    }
  ],
  "frequencyConstraints": [
    {
      object (FrequencyConstraint)
    }
  ]
}
Pola
breakRequests[]

object (BreakRequest)

Kolejność przerw. Zobacz wiadomość: BreakRequest.

frequencyConstraints[]

object (FrequencyConstraint)

Może obowiązywać kilka zasad (FrequencyConstraint). BreakRequest: BreakRule musi spełnić wszystkie wymagania. Zobacz FrequencyConstraint.

BreakRequest

Sekwencja przerw (tj. ich liczba i kolejność) musi być wcześniej znana. Powtarzające się elementy BreakRequest definiują tę sekwencję w kolejności, w jakiej muszą wystąpić. Przedziały czasu (earliestStartTime / latestStartTime) mogą się pokrywać, ale muszą być zgodne z zamówieniem (jest to zaznaczone).

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

string (Timestamp format)

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

Sygnatura czasowa w RFC3339 UTC „Zulu” z rozdzielczością nanosekundową i maksymalnie 9 cyframi po przecinku. Przykłady: "2014-10-02T15:01:23Z" i "2014-10-02T15:01:23.045123456Z".

latestStartTime

string (Timestamp format)

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

Sygnatura czasowa w RFC3339 UTC „Zulu” z rozdzielczością nanosekundową i maksymalnie 9 cyframi po przecinku. Przykłady: "2014-10-02T15:01:23Z" i "2014-10-02T15:01:23.045123456Z".

minDuration

string (Duration format)

Wymagane. Minimalny czas trwania przerwy. Musi być liczbą dodatnią.

Czas trwania w sekundach składający się z maksymalnie 9 cyfr po przecinku, kończący się cyfrą „s”. Przykład: "3.5s".

FrequencyConstraint

Można jeszcze bardziej ograniczyć częstotliwość i czas trwania przerw określonych powyżej przez wymuszenie minimalnej częstotliwości, na przykład „Co 12 godzin musi być przerwa co najmniej 1 godzinę”. Zakładając, że można to zinterpretować w ten sposób: „W każdym przesuwającym się przedziale czasu wynoszącym 12 godzin musi istnieć co najmniej jedna przerwa o długości co najmniej 1 godziny”, przykłada prezentuje się tak: FrequencyConstraint:

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

Czas i czas trwania przerw w rozwiązaniach uwzględniają wszystkie takie ograniczenia, a także przedziały czasowe i minimalne czasy trwania określone w zasadzie BreakRequest.

FrequencyConstraint może w praktyce mieć zastosowanie do przerw, które nie następują po sobie. Na przykład ten harmonogram uwzględnia zasadę „1 godz. co 12 godz.” przykład:

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

string (Duration format)

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

Czas trwania w sekundach składający się z maksymalnie 9 cyfr po przecinku, kończący się cyfrą „s”. Przykład: "3.5s".

maxInterBreakDuration

string (Duration format)

Wymagane. Maksymalny dozwolony zakres czasu trwania dowolnego przedziału czasu na trasie, który nie zawiera przynajmniej częściowej przerwy wynoszącej duration >= minBreakDuration. Musi być liczbą dodatnią.

Czas trwania w sekundach składający się z maksymalnie 9 cyfr po przecinku, kończący się cyfrą „s”. Przykład: "3.5s".

DurationDistanceMatrix

Określa czas trwania i tablicę odległości od wizyty i miejsca rozpoczęcia podróży pojazdu oraz lokalizacji końcowej pojazdu.

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

object (Row)

Określa wiersze macierzy czasu trwania i odległości. Musi się składać z tylu elementów: ShipmentModel.duration_distance_matrix_src_tags.

vehicleStartTag

string

Tag definiujący, do których pojazdów ma zastosowanie dany czas trwania i tablica odległości. Jeśli pole jest puste, dotyczy to wszystkich pojazdów i może zawierać tylko jedną macierz.

Każdy początek pojazdu musi pasować do jednej macierzy, tzn. dokładnie jedno z jego pola startTags musi odpowiadać wartości vehicleStartTag macierzy (i tylko tej macierzy).

Wszystkie macierze muszą mieć inny element vehicleStartTag.

Wiersz

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

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

string (Duration format)

Czas trwania danego wiersza. Musi się składać z tylu elementów: ShipmentModel.duration_distance_matrix_dst_tags.

Czas trwania w sekundach składający się z maksymalnie 9 cyfr po przecinku, kończący się cyfrą „s”. Przykład: "3.5s".

meters[]

number

Wartości odległości w danym wierszu. Jeśli brak kosztów lub ograniczeń odnosi się do odległości w modelu, to pole może pozostać puste; w przeciwnym razie musi mieć tyle elementów, co durations.

TransitionAttributes

Określa atrybuty przejścia między 2 kolejnymi wizytami na trasie. Do tego samego przejścia może być stosowanych kilka elementów TransitionAttributes: w takim przypadku wszystkie dodatkowe koszty sumują się i zastosowane jest najbardziej rygorystyczne ograniczenie lub limit (zgodnie z naturalną semantyką „ORAZ”).

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

string

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

Wizyty w źródle lub rozpoczęcie pojazdu pasują do tych, które VisitRequest.tags lub Vehicle.start_tags zawierają wartość srcTag albo nie zawierają excludedSrcTag (zależnie od tego, które z tych 2 pól nie jest puste).

excludedSrcTag

string

Zobacz srcTag. tylko jeden z elementów srcTag i excludedSrcTag nie może być pusty.

dstTag

string

Wizyty w miejscu docelowym lub data zakończenia pojazdu pasują do tych, które VisitRequest.tags lub Vehicle.end_tags zawierają wartość dstTag albo nie zawierają excludedDstTag (w zależności od tego, które z tych 2 pól nie jest puste).

excludedDstTag

string

Zobacz dstTag. tylko jeden z elementów dstTag i excludedDstTag nie może być pusty.

cost

number

Określa koszt przeprowadzenia tej zmiany. Ta jednostka jest taka sama jak wszystkie inne koszty w modelu i nie może być ujemna. Jest doliczana do wszystkich innych istniejących kosztów.

costPerKilometer

number

Określa koszt kilometra stosowany do odległości pokonanej podczas wykonywania tej zmiany. Suma wartości tych atrybutów jest równa wartości Vehicle.cost_per_kilometer określonej w pojazdach.

distanceLimit

object (DistanceLimit)

Określa limit odległości pokonanej podczas wykonywania tej zmiany.

Od 6 czerwca 2021 r. obsługiwane są tylko limity wstępne.

delay

string (Duration format)

Określa opóźnienie związane z przeprowadzeniem tej zmiany.

Opóźnienie to zawsze następuje po zakończeniu wizyty źródłowej i przed jej rozpoczęciem.

Czas trwania w sekundach składający się z maksymalnie 9 cyfr po przecinku, kończący się cyfrą „s”. Przykład: "3.5s".

ShipmentTypeIncompatibility

Określa niezgodności między dostawami w zależności od parametru deliveryType. Wyświetlanie niezgodnych przesyłek na tej samej trasie jest ograniczone ze względu na tryb niezgodności.

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

string

Lista niezgodnych typów. Dwie przesyłki, których shipment_types różni się od wymienionych na liście, są „niezgodne”.

incompatibilityMode

enum (IncompatibilityMode)

Tryb został zastosowany do niezgodności.

IncompatibilityMode

Środki określające, jak ograniczone jest wyświetlanie niezgodnych przesyłek na tej samej trasie.

Wartości w polu enum
INCOMPATIBILITY_MODE_UNSPECIFIED Nieokreślony tryb niezgodności. Tej wartości nie należy używać.
NOT_PERFORMED_BY_SAME_VEHICLE W tym trybie 2 przesyłki o niewłaściwych typach nie mogą być współdzielone z tym samym pojazdem.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

W przypadku 2 przesyłek o niezgodnych typach z trybem zgodności NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY:

  • Jeśli w obu przypadkach oferowana jest tylko opcja odbioru (bez dostawy) lub tylko dostawa (bez odbioru), nie mogą w ogóle współdzielić tego samego pojazdu.
  • Jeśli jedna z przesyłek obejmuje dostawę, a druga odbiór, obie mogą obejmować ten sam pojazd, jeśli poprzednia została dostarczona przed odebraniem drugiej.

ShipmentTypeRequirement

Określa wymagania dotyczące poszczególnych przesyłek na podstawie ich dostawy. Konkretne wymagania są określane przez tryb wymagań.

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

string

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

dependentShipmentTypes[]

string

Wszystkie przesyłki o typie podanym w polu dependentShipmentTypes wymagają co najmniej jednej przesyłki typu requiredShipmentTypeAlternatives, aby odwiedzić ją na tej samej trasie.

UWAGA: łańcuchy wymagań, takie jak shipmentType zależą od siebie, są niedozwolone.

requirementMode

enum (RequirementMode)

Tryb zastosowany do wymagania.

RequirementMode

Tryby określające wygląd przesyłek zależnych na trasie.

Wartości w polu enum
REQUIREMENT_MODE_UNSPECIFIED Tryb nieokreślonych wymagań. Tej wartości nie należy używać.
PERFORMED_BY_SAME_VEHICLE W tym trybie wszystkie „zależne” przesyłki muszą być z tym samym pojazdem co co najmniej jeden z „wymaganych” przesyłek.
IN_SAME_VEHICLE_AT_PICKUP_TIME

W trybie IN_SAME_VEHICLE_AT_PICKUP_TIME wszystkie są „zależne” przesyłki muszą mieć co najmniej jeden „wymagany” przesyłki na swój pojazd w momencie odbioru.

„zależny”; opcja odbioru przesyłki musi więc spełniać jeden z tych warunków:

  • „Wymagane” tylko do wyświetlania przesyłka dostarczona na trasie po tym terminie;
  • „Wymagane” przesyłka odebrana na trasie przed nią, a jeśli „wymagane” przesyłka ma dostawę, musi ona zostać zrealizowana po „podległym” odbiór przesyłki.
IN_SAME_VEHICLE_AT_DELIVERY_TIME Tak samo jak poprzednio, z wyjątkiem pola „zależnego” przesyłki muszą mieć atrybut „wymagany”, przesyłki na swój pojazd w momencie dostawy.

PrecedenceRule

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

Kilka pierwszeństwa może odnosić się do tych samych (lub powiązanych) wydarzeń, np. „Odbiór towaru B odbywa się po dostarczeniu produktu A” a „odbiór produktu C odbywa się po odbiorze produktu B”.

Dodatkowo pierwszeństwo ma tylko wtedy, gdy obie przesyłki są realizowane, w przeciwnym razie są ignorowane.

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

boolean

Wskazuje, czy „pierwszy” zdarzenie to dostawa.

secondIsDelivery

boolean

Wskazuje, czy parametr „second” zdarzenie to dostawa.

offsetDuration

string (Duration format)

Przesunięcie między pierwszą wartością i „drugi” . Wynik może być ujemny.

Czas trwania w sekundach składający się z maksymalnie 9 cyfr po przecinku, kończący się cyfrą „s”. Przykład: "3.5s".

firstIndex

integer

Indeks dostawy pierwszego produktu . To pole musi być określone.

secondIndex

integer

Indeks dostawy „sekundy” . To pole musi być określone.