ShipmentModel

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

  • kosztu wyznaczania trasy dla pojazdów (suma kosztu na godzinę, kosztu na czas przejazdu i kosztów stałych na wszystkie pojazdy);
  • kary za niewywiązanie się z obowiązku dostawy.
  • 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ć wykonane w 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: nie można uznać za prawidłowego żadnego czasu spoza tego zakresu.

Zakres czasowy modelu musi być krótszy niż rok, czyli globalEndTimeglobalStartTime muszą być oddalone od siebie o nie więcej niż 31536 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. sekund: 0, nanos: 0).

Sygnatura czasowa w formacie UTC „Zulu” zdefiniowanym w dokumencie RFC 3339, z dokładnością do nanosekund i maksymalnie 9 miejsc 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 formacie UTC „Zulu” zdefiniowanym w dokumencie RFC 3339, z dokładnością do nanosekund i maksymalnie 9 miejsc 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 obowiązującym czasem rozpoczęcia a najnowszym obowiązującym czasem zakończenia wszystkich pojazdów. Użytkownicy mogą przypisać koszt za godzinę do danej ilości, 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 jest puste, zamiast niego używane są odległości na mapach Google lub geodezyjne, w zależności od wartości pola 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:

  • Istnieją 2 lokalizacje: locA i locB.
  • 1 pojazd, który rozpoczyna trasę w miejscu locA i kończy w miejscu locA.
  • 1 prośba o odbiór w miejscu 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 zaczynający trasę w miejscu locA i kończący ją w miejscu locB, korzystając z macierzy „szybka”.
  • 1 pojazd zaczynający swoją trasę w locB i kończący ją w locB, korzystając z matrycy „slow”.
  • 1 pojazd zaczynający swoją trasę w locB i kończący ją w locB, korzystając z macierzy „fast”.
  • 1 prośba o odbiór w miejscu: 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 czasu trwania oraz macierzy odległości; durationDistanceMatrices(i).rows(j) określa czasy trwania i odległości od wizyt za pomocą tagu durationDistanceMatrixSrcTags(j) do innych wizyt w tabeli i.

Znaczniki odpowiadają wartości VisitRequest.tags lub Vehicle.start_tags. Podany identyfikator VisitRequest lub Vehicle musi odpowiadać dokładnie 1 tagowi w tym polu. Pamiętaj, że tagi źródła, miejsca docelowego i macierzy elementu Vehicle mogą być takie same. Podobnie tagi źródłowe i docelowe elementu 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) (resp. durationDistanceMatrices(i).rows(j).meters(k)) określa czas trwania (odpowiednio odległość) podróży z wizytacji z tagiem durationDistanceMatrixSrcTags(j) do wizyty z tagiem durationDistanceMatrixDstTags(k) w macierz i.

Znaczniki odpowiadają wartości VisitRequest.tags lub Vehicle.start_tags. Podany identyfikator VisitRequest lub Vehicle musi odpowiadać dokładnie 1 tagowi w tym polu. Pamiętaj, że tagi źródła, miejsca docelowego i macierzy elementu Vehicle mogą być takie same. Podobnie tagi źródłowe i docelowe elementu 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 jego trasa obejmuje co najmniej jedną dostawę. 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ć dodatni.

Wysyłka

Dostawa pojedynczego produktu, od odbioru do jednej dostawy. Aby przesyłka została uznana za zrealizowaną, pojazd musi odwiedzić jedną z lokalizacji odbioru (i odpowiednio zmniejszyć ilość wolnych miejsc), a następnie odwiedzić jedną z lokalizacji dostawy (i odpowiednio zwiększyć ilość wolnych miejsc).

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 on zawierać maksymalnie 63 znaki i 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 sposobów 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.

allowedVehicleIndices[]

integer

Zestaw pojazdów, które mogą zrealizować tę przesyłkę. Jeśli pole jest puste, wszystkie pojazdy mogą je wykonać. 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] w przypadku modelu.
  • taką samą liczbę elementów, jak pojazdów w modelu. I-ty element odpowiada pojazdowi o numerze i modelu.

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

costsPerVehicleIndices[]

integer

Indeksy pojazdów, do których ma zastosowanie 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.

Niech na przykład t będzie najkrótszym czasem potrzebnym na dotarcie z wybranego miejsca odbioru bezpośrednio do wybranego miejsca dostawy. Ustawienie pickupToDeliveryAbsoluteDetourLimit powoduje:

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

Jeśli w przypadku jednej przesyłki są określone zarówno względne, jak i bezwzględne limity, w przypadku każdej możliwej pary odbioru/dostawy stosuje się 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 składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „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 od tego, które alternatywne rozwiązania zostaną wybrane do odbioru i dostawy, ani od prędkości pojazdu. Można je określić razem z ograniczeniami maksymalnego objazdu: rozwiązanie będzie przestrzegać obu specyfikacji.

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

shipmentType

string

Niepusty ciąg znaków określający „typ” przesyłki. 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ę dla tej przesyłki. Ta etykieta jest raportowana w odpowiedzi w shipmentLabel odpowiedniego ShipmentRoute.Visit.

ignore

boolean

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

Ignorowanie dostawy powoduje błąd weryfikacji, jeśli w modelu występują jakiekolwiek shipmentTypeRequirements.

Dostawa realizowana w injectedFirstSolutionRoutes lub injectedSolutionConstraint jest dozwolona. Rozwiązanie usuwa powiązane wizyty z odbiorem lub dostawą z trasy, która odbywa się na trasie. precedenceRules, które odwołują się do ignorowanych przesyłek, również zostaną zignorowane.

penaltyCost

number

Jeśli dostawa nie zostanie ukończona, kara zostanie dodana do całkowitego kosztu tras. Przesyłka jest uważana za ukończoną, jeśli wybrano jedną z dostępnych 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 czas objazdu w porównaniu z najkrótszą ścieżką od odbioru do dostawy. Jeśli jest podany, musi być dodatni, a przesyłka musi zawierać co najmniej odbiór i dostawę.

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. Ustawienie pickupToDeliveryRelativeDetourLimit powoduje:

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

Jeśli w przypadku jednej przesyłki są określone zarówno względne, jak i bezwzględne limity, w przypadku każdej możliwej pary odbioru/dostawy stosuje się 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 wizytację, którą można wykonać pojazdem: ma ona geolokalizację (lub 2 lokalizacje, patrz poniżej), godziny otwarcia i zamknięcia reprezentowane przez okna czasowe oraz czas trwania usługi (czas spędzony przez pojazd od momentu przyjazdu do odbioru lub dostarczenia towarów).

Zapis JSON
{
  "arrivalLocation": {
    object (LatLng)
  },
  "arrivalWaypoint": {
    object (Waypoint)
  },
  "departureLocation": {
    object (LatLng)
  },
  "departureWaypoint": {
    object (Waypoint)
  },
  "tags": [
    string
  ],
  "timeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "duration": string,
  "cost": number,
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "visitTypes": [
    string
  ],
  "label": string
}
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 czasowej, nie można podać parametru 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 czasowej, nie można podać parametru 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 czasowej, nie można podać parametru departureLocation.

departureWaypoint

object (Waypoint)

Punkt orientacyjny, w którym pojazd wyrusza po zakończeniu tego 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 wyjechać poza okno czasu przyjazdu, czyli czas przyjazdu + czas trwania nie muszą mieścić się w oknie czasowym. Może to spowodować oczekiwanie, jeśli pojazd dotrze przed 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 costPerHourAfterSoftEndTimesoftEndTime można ustawić tylko wtedy, gdy istnieje jedno okno czasowe.

duration

string (Duration format)

Czas trwania wizyty, czyli czas spędzony przez pojazd między przybyciem a odejściem (dodawany do możliwego czasu oczekiwania; patrz timeWindows).

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

cost

number

Koszt realizacji tego żądania wizyty na trasie pojazdu. Można go używać do płacenia różnych kosztów za odbiór lub dostawę przesyłki. Te koszty muszą być wyrażone w tych samych jednostkach co Shipment.penalty_cost i nie mogą być ujemne.

loadDemands

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

Wczytaj wymagania dotyczące tego żądania wizyty. To pole jest podobne do pola Shipment.load_demands, z tym że ma zastosowanie tylko do tego elementu VisitRequest, a nie do całego elementu Shipment. Wymienione tutaj żądania zostaną dodane do żądań wymienionych w sekcji Shipment.load_demands.

visitTypes[]

string

Określa typy wizyt. Może ona służyć do przydzielenia dodatkowego czasu potrzebnego pojazdowi na wykonanie tej wizyty (patrz Vehicle.extra_visit_duration_for_visit_type).

Typ może wystąpić tylko raz.

label

string

Określa etykietę elementu VisitRequest. Ta etykieta jest raportowana w odpowiedzi jako visitLabel w odpowiednim 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. Jeśli nie określono inaczej, 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 pośrednie oznaczają miejsca przyjazdu i wyjazdu w żądaniach VisitRequests oraz lokalizacje początkowe i końcowe Pojazdy.

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 przebiegać 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 trybie podróży „SPACER”.

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 opcjonalnego nagłówka.

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

heading

integer

Nagłówek kompasu powiązany z kierunkiem ruchu. Ta wartość służy do określenia strony drogi, z której ma nastąpić odbiór i zwrot. Wartości kierunku mogą się wahać od 0 do 360, gdzie 0 to kierunek na północ, 90 to kierunek na wschód itd.

TimeWindow

Okna czasowe ograniczają czas trwania zdarzenia, np. czas przybycia w ramach wizyty lub czas rozpoczęcia i zakończenia korzystania z pojazdu.

Wartości graniczne sztywnego przedziału czasu, czyli 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 łagodnego okresu czasu (softEndTime) określa preferencję, aby zdarzenie miało miejsce softEndTime lub wcześniej przez naliczanie kosztów proporcjonalnie do czasu, jaki upłynął od zdarzenia softEndTime. Wartości startTime, endTime, softStartTimesoftEndTime powinny mieścić się w globalnych limitach czasowych (patrz ShipmentModel.global_start_timeShipmentModel.global_end_time) oraz spełniać te wymagania:

  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 czasowego. Jeśli nie określono inaczej, wartość zostanie ustawiona na ShipmentModel.global_start_time.

Sygnatura czasowa w formacie UTC „Zulu” zdefiniowanym w dokumencie RFC 3339, z dokładnością do nanosekund i maksymalnie 9 miejsc po przecinku. Przykłady: "2014-10-02T15:01:23Z" i "2014-10-02T15:01:23.045123456Z".

endTime

string (Timestamp format)

Czas zakończenia sztywnego przedziału czasu. Jeśli nie określono inaczej, wartość zostanie ustawiona na ShipmentModel.global_end_time.

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

softStartTime

string (Timestamp format)

Godzina łagodnego rozpoczęcia przedziału czasu.

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

softEndTime

string (Timestamp format)

Czas zakończenia przedziału czasu (miękki).

Sygnatura czasowa w formacie RFC3339 UTC „Zulu” z rozdzielczością nanosekundy 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 wystą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

Model 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),
  "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 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.

routeModifiers

object (RouteModifiers)

Zestaw warunków, które wpływają na sposób obliczania tras dla danego pojazdu.

startLocation

object (LatLng)

Geograficzna lokalizacja, w której pojazd rozpoczyna przejazd przed odbiorem przesyłek. Jeśli nie zostanie określony, pojazd rozpoczyna kurs od pierwszego odbioru. Jeśli model dostawy zawiera macierze czasu i odległości, nie można określić parametru startLocation.

startWaypoint

object (Waypoint)

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

endLocation

object (LatLng)

Lokalizacja geograficzna, w której kończy się pojazd (VisitRequest). Jeśli nie zostanie określony, ShipmentRoute pojazdu kończy się natychmiast po zakończeniu ostatniego VisitRequest. Jeśli model dostawy zawiera macierze czasu i odległości, nie można określić parametru 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 ani endWaypoint, ani endLocation, ShipmentRoute pojazdu kończy się natychmiast po zakończeniu ostatniego VisitRequest. Jeśli model dostawy zawiera macierze czasu i odległości, nie można określić parametru 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.

Pustych lub powtarzających się ciągów znaków nie można używać.

startTimeWindows[]

object (TimeWindow)

Okna czasowe, w których pojazd może opuścić lokalizację początkową. 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 costPerHourAfterSoftEndTimesoftEndTime można ustawić tylko wtedy, gdy istnieje jedno okno czasowe.

unloadingPolicy

enum (UnloadingPolicy)

Zasady rozładunku obowiązujące w pojazdach.

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 dany klucz nie jest obecny na tej mapie, odpowiadająca mu pojemność jest uważana za nieograniczoną.

costPerHour

number

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

Koszt za godzinę trasy pojazdu. Koszt ten jest naliczany za cały czas trwania trasy, w tym czas podróży, oczekiwania i wizyty. Użycie usługi costPerHour zamiast tylko costPerTraveledHour może spowodować dodatkowe opóźnienia.

costPerTraveledHour

number

Koszt godziny przejazdu pojazdu. Ten koszt jest stosowany tylko do czasu przejazdu po trasie (czyli podanego w ShipmentRoute.transitions) i nie obejmuje czasu oczekiwania ani czasu wizyty.

costPerKilometer

number

Koszt przejechania 1 km trasy przez pojazd. Ten koszt jest stosowany do odległości podanej w ShipmentRoute.transitions i nie dotyczy odległości przebytej przez arrivalLocation do departureLocation w ramach jednego VisitRequest.

fixedCost

number

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

usedIfRouteIsEmpty

boolean

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

Jeśli to ustawienie ma wartość true, pojazd jedzie z miejsca początkowego do miejsca docelowego, nawet jeśli nie obsługuje żadnych przesyłek. Uwzględniane są koszty czasu i odległości wynikające z przejazdu od początku do końca.

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 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)

Ograniczenie czasu trwania przejazdu na trasie pojazdu. W danym OptimizeToursResponse czas przejazdu trasy jest sumą wszystkich transitions.travel_duration.

routeDistanceLimit

object (DistanceLimit)

Ograniczenie stosowane do całkowitej odległości przebytej przez pojazd. 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 mapę od ciągów znaków visitTypes do długości. Czas trwania jest uzupełnieniem VisitRequest.duration, które mają być wykonywane w przypadku wizyt z określoną wartością visitTypes. Ten dodatkowy czas wizyty zwiększa koszty, jeśli ustawisz parametr costPerHour. Klucze (np. visitTypes) nie mogą być pustymi ciągami znaków.

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

breakRule

object (BreakRule)

Opisuje harmonogram przerw, który ma być stosowany 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 wartość usedIfRouteIsEmpty ma być ustawiona na prawda, wartość usedIfRouteIsEmpty musi być ustawiona na fałsz, a samochód 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 przesyłka ma niepuste pole allowedVehicleIndices, a wszystkie dozwolone pojazdy są ignorowane, jest ona pomijana w odpowiedzi.

travelDurationMultiple

number

Określa współczynnik mnożenia, który może być używany do zwiększania lub zmniejszania czasu przejazdu 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 koszt, jeśli określono costPerHour lub costPerTraveledHour. Musi mieścić się w zakresie od 0,001 do 1000,0. Jeśli nie zostanie ustawiony, pojazd jest standardowy, a ten współczynnik jest uważany 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, czyli DRIVING.
DRIVING Tryb podróży odpowiadający wskazówkom dojazdu (samochód, ...).
WALKING Tryb podróży odpowiadający wskazówkom dojazdu pieszo.

RouteModifiers

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

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

boolean

Określa, czy w uzasadnionych przypadkach należy unikać dróg płatnych. Preferowane będą trasy nieobejmujące dróg płatnych. Dotyczy to tylko pojazdów mechanicznych.

avoidHighways

boolean

Określa, czy w uzasadnionych przypadkach unikać autostrad. Priorytet będą miały trasy niezawierające autostrad. Dotyczy tylko pojazdów z silnikiem.

avoidFerries

boolean

Określa, czy w uzasadnionych przypadkach ma być unikana przeprawa promowa. Preferowane będą trasy nieobejmujące przejazdów promem. Dotyczy tylko pojazdów z silnikiem.

avoidIndoor

boolean

Opcjonalnie: Określa, czy w uzasadnionych przypadkach unikać przechodzenia do wnętrz. Preferowane będą trasy nieobejmujące nawigacji w pomieszczeniach. Dotyczy tylko środka transportu WALKING.

UnloadingPolicy

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

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

Wartości w polu enum
UNLOADING_POLICY_UNSPECIFIED Nieokreślona polityka rozładunku; dostawy muszą odbywać się po odpowiednich odbiorach.
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 ładunku dla pojazdu, np. „ten samochód może przewozić maksymalnie 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)

Ograniczony limit obciążenia. Zobacz costPerUnitAboveSoftMax.

costPerUnitAboveSoftMax

number

Jeśli ładunek przekroczy wartość softMaxLoad na trasie tego pojazdu, zostanie zastosowana kara za koszty (tylko raz na pojazd): (load - softMaxLoad) * costPerUnitAboveSoftMax. Wszystkie koszty są sumowane i muszą być wyrażone w tej samej jednostce co Shipment.penalty_cost.

startLoadInterval

object (Interval)

Dopuszczalny przedział ładowania 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.

costPerKilometer

object (LoadCost)

Koszt przeniesienia jednej jednostki ładunku na ponad kilometr w przypadku tego pojazdu. Można go użyć jako zastępnika zużycia paliwa: jeśli ładunek to waga (w niutonach), to ładunek*kilometr ma wymiar energii.

costPerTraveledHour

object (LoadCost)

Koszt przejazdu tym pojazdem z jednostką ładunku w ciągu godziny.

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ć większa lub równa 0. Jeśli obie są określone, min musi mieć wartość ≤ max.

max

string (int64 format)

Maksymalne dopuszczalne obciążenie. Wartość musi być większa lub równa 0. Jeśli nie określisz maksymalnego obciążenia, wiadomość nie będzie nakładać żadnych ograniczeń. Jeśli obie są określone, min musi mieć wartość ≤ max.

LoadCost

Koszt przeniesienia jednej jednostki obciążenia w okresie Transition. Koszt danego obciążenia to suma dwóch części:

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

W przypadku tego kosztu rozwiązania preferują najpierw realizację wysokich zapotrzebowań lub równolegle wysokich zapotrzebowań. Jeśli na przykład pojazd ma

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

a jego trasa to start, odbiór, odbiór, dostawa, dostawa, koniec z przechodzeniem:

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 to (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

LoadCost na trasie to 120,0.

Jeśli jednak trasa ma przebiegać w kolejności start, odbiór, dostawa, odbiór, dostawa, koniec z przejściami:

transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }

koszty ponoszone przez to LoadCost wynoszą

  • przejście 0: 0,0
  • przejście 1: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0
  • Zmiana 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 całej trasie wynosi 40,0.

LoadCost powoduje, że rozwiązania z intensywnym wykorzystaniem przejść są droższe.

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

string (int64 format)

Ilość ładunku, powyżej której koszt przeniesienia jednostki ładunku zmienia się z costPerUnitBelowThreshold na costPerUnitAboveThreshold. Musi być >= 0.

costPerUnitBelowThreshold

number

Koszt zmiany jednostki obciążenia, wyrażony dla każdej jednostki z zakresu od 0 do progu. Musi być skończoną wartością i musi być równa 0.

costPerUnitAboveThreshold

number

Koszt przeniesienia jednostki obciążenia dla każdej jednostki powyżej progu. W przypadku progu przypadków specjalnych = 0 oznacza to stały koszt jednostki. Musi być skończoną wartością i musi być równa 0.

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)

Sztywne ograniczenie, które ogranicza czas trwania do maxDuration.

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

softMaxDuration

string (Duration format)

miękki limit, który nie narzuca maksymalnego czasu trwania, ale w przypadku jego naruszenia powoduje, że trasa powoduje powstanie kosztu. Ten koszt jest sumowany z innymi kosztami zdefiniowanymi w modelu, przy użyciu tej samej jednostki.

Jeśli jest zdefiniowana, wartość softMaxDuration musi być nieujemna. Jeśli zdefiniowano również parametr maxDuration, wartość softMaxDuration musi być mniejsza niż parametr maxDuration.

Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „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 jest zdefiniowana, wartość quadraticSoftMaxDuration musi być nieujemna. Jeśli zdefiniowana jest też wartość maxDuration, wartość quadraticSoftMaxDuration musi być mniejsza od wartości maxDuration, a różnica nie może być większa niż jeden dzień:

maxDuration - quadraticSoftMaxDuration <= 86400 seconds

Czas w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „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,
  "costPerKilometerBelowSoftMax": number,
  "costPerKilometerAboveSoftMax": number
}
Pola
maxMeters

string (int64 format)

sztywny limit ograniczający odległość do maksymalnej wartości 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ą.

Jeśli jest zdefiniowana, wartość softMaxMeters musi być mniejsza niż maxMeters i nieujemna.

costPerKilometerBelowSoftMax

number

Poniesiony koszt za kilometr, rosnący do softMaxMeters, według wzoru:

  min(distanceMeters, softMaxMeters) / 1000.0 *
  costPerKilometerBelowSoftMax.

Te koszty nie są obsługiwane w routeDistanceLimit.

costPerKilometerAboveSoftMax

number

Koszt za kilometr naliczany, 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 czasowych dla pojazdu (np. przerwa na lunch). Przerwa to ciągły okres czasu, w którym pojazd pozostaje nieczynny w swojej bieżącej pozycji i nie może wykonywać żadnych wizyt. Przerwa może wystąpić:

  • w trakcie podróży między dwiema wizytami (obejmuje to czas bezpośrednio przed wizytą lub zaraz 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 (samochód nie może się uruchomić w trakcie przerwy), w którym to przypadku nie wpływa 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ć. Okna czasowe (earliestStartTime / latestStartTime) mogą się na siebie nakładać, ale muszą być zgodne z kolejnością (jest to sprawdzane).

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 formacie RFC3339 UTC „Zulu” z rozdzielczością nanosekundy 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 formacie RFC3339 UTC „Zulu” z rozdzielczością nanosekundy 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 dziewięciu cyfr po przecinku i kończący się „s”. Przykład: "3.5s".

FrequencyConstraint

Można też dodatkowo ograniczyć częstotliwość i czas trwania przerw określonych powyżej, narzucając minimalną częstotliwość przerwy, np. „Co 12 godzin musi być przerwa trwająca co najmniej 1 godzinę”. Zakładając, że można to interpretować jako „W dowolnym przesuwającym się oknie czasowym o długości 12 godzin musi być co najmniej 1 przerwa trwająca co najmniej 1 godzinę”, przykład ten przetłumaczylibyśmy w ten sposób: 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 dotyczyć przerw nieciągłych. Na przykład ten harmonogram uwzględnia przykład „1 godz. co 12 godz.”:

  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 w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „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ć dodatni.

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

DurationDistanceMatrix

Określa czas trwania i matrycę odległości od miejsca wizyty i rozpoczęcia pojazdu do odwiedzenia oraz lokalizacji zakończenia 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 określający, do których pojazdów ma zastosowanie ta tablica czasu trwania i odległości. Jeśli jest pusty, ma zastosowanie do wszystkich pojazdów i może być tylko jedna matryca.

Każdy początek pojazdu musi odpowiadać dokładnie jednej macierzy, czyli dokładnie jedno z pol startTags musi odpowiadać 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)

Wartości czasu trwania w danym wierszu. Musi się składać z tylu elementów: ShipmentModel.duration_distance_matrix_dst_tags.

Czas trwania w sekundach składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „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, możesz zostawić to pole puste. W przeciwnym razie model musi zawierać tyle elementów, ile durations.

TransitionAttributes

Określa atrybuty przejść między 2 kolejnymi wizytami na trasie. Do tego samego przejścia może mieć zastosowanie kilka TransitionAttributes: w takim przypadku wszystkie dodatkowe koszty są sumowane, a następnie stosowany jest najbardziej restrykcyjny ogranicznik lub limit (zgodnie z naturalną semantyką „AND”).

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 zbiór przejść (src->dst), do których mają zastosowanie te atrybuty.

Wizyta w źródle lub uruchomienie pojazdu powoduje dopasowanie, jeśli pole VisitRequest.tags lub Vehicle.start_tags zawiera wartość srcTag lub nie zawiera wartości excludedSrcTag (w zależności od tego, które z tych pól jest niepuste).

excludedSrcTag

string

Zobacz srcTag. Dokładnie jeden z pól srcTag i excludedSrcTag musi być niepusty.

dstTag

string

Odpowiednia wizyta w miejscu docelowym lub koniec korzystania z pojazdu jest zgodna, jeśli pole VisitRequest.tags lub Vehicle.end_tags zawiera wartość dstTag lub nie zawiera wartości excludedDstTag (w zależności od tego, które z tych pól jest niepuste).

excludedDstTag

string

Zobacz dstTag. Dokładnie jeden z pól dstTag i excludedDstTag musi być niepusty.

cost

number

Określa koszt wykonania tego przejścia. Jest on podawany w tych samych jednostkach co wszystkie inne koszty w modelu i nie może być ujemny. 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. Dodaje się do wszystkich Vehicle.cost_per_kilometer określonych w pojazdach.

distanceLimit

object (DistanceLimit)

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

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

delay

string (Duration format)

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

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

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

ShipmentTypeIncompatibility

Określa niezgodności między dostawami w zależności od parametru deliveryType. Występowanie niezgodnych przesyłek na tej samej trasie jest ograniczone na podstawie trybu niezgodności.

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

string

Lista niezgodnych typów. 2 przesyłki z różnymi wartościami shipment_types spośród wymienionych są „niezgodne”.

incompatibilityMode

enum (IncompatibilityMode)

Tryb został zastosowany do niezgodności.

IncompatibilityMode

Tryby określające, jak ograniczać pojawianie się 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 dwóch przesyłek z niezgodnymi typami w trybie niezgodnoś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 przesyłek na podstawie ich typu przesyłki. 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ń, w których shipmentType zależy od siebie samego, są niedozwolone.

requirementMode

enum (RequirementMode)

Tryb zastosowany do wymagań.

RequirementMode

Tryby definiujące sposób wyświetlania przesyłek zależnych na trasie.

Wartości w polu enum
REQUIREMENT_MODE_UNSPECIFIED Nieokreślony tryb wymagań. Tej wartości nie należy 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 przesyłka „wymagana”.
IN_SAME_VEHICLE_AT_PICKUP_TIME

W trybie IN_SAME_VEHICLE_AT_PICKUP_TIME wszystkie „zależne” przesyłki muszą mieć w momencie odbioru co najmniej jedną „wymagającą” przesyłkę w pojazdzie.

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

  • „Wymagana” przesyłka tylko z dostawą dostarczona na trasie po:
  • „Wymagany” przewóz, który został odebrany na trasie przed „zależnym” przewozem. Jeśli „wymagany” przewóz ma być dostarczony, dostawa musi zostać zrealizowana po odbiorze „zależnego” przewozu.
IN_SAME_VEHICLE_AT_DELIVERY_TIME Tak jak wcześniej, z wyjątkiem przesyłek zależnych, które muszą być „wymagane” 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 rozpoczęciu „pierwszego”.

Kilka pierwszeństwa może odnosić się do tych samych (lub powiązanych) wydarzeń, np. „Odbiór B następuje po dostawie A” i „Odbiór C następuje po odbiorze 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 „pierwsze” zdarzenie to dostawa.

secondIsDelivery

boolean

Wskazuje, czy „drugie” zdarzenie to dostawa.

offsetDuration

string (Duration format)

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

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

firstIndex

integer

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

secondIndex

integer

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