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ą być wykonane w ramach modelu.

vehicles[]

object (Vehicle)

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

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.

Jeśli używasz pól cost_per_*hour, możesz ustawić mniejszy przedział czasowy, aby zwiększyć wydajność (np. jeśli modelujesz 1 dzień, ustaw globalne limity czasowe na ten dzień). Jeśli nie zostanie ona określona, domyślnie używana jest data 1 stycznia 1970 r., godzina 00:00:00 UTC (czyli sekundy: 0, nanosekundy: 0).

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

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

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:

  • 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 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 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 określające źródła macierzy czasu trwania i odległości; durationDistanceMatrices(i).rows(j) określa czas trwania i odległości od wizyt z tagiem durationDistanceMatrixSrcTags(j) do innych wizyt w macierzy i.

Znaczniki odpowiadają wartości VisitRequest.tags lub Vehicle.start_tags. Podany parametr VisitRequest lub Vehicle musi pasować dokładnie do 1 tagu 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 i odległości; durationDistanceMatrices(i).rows(j).durations(k) (odpowiednio 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.

Tagi odpowiadają elementom VisitRequest.tags lub Vehicle.start_tags. Podany parametr VisitRequest lub Vehicle musi pasować dokładnie do 1 tagu 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. Następnie 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 nie określono inaczej, pojazd musi tylko odwiedzić lokalizację odpowiadającą dostawom.

deliveries[]

object (VisitRequest)

Zestaw alternatywnych sposobów dostawy powiązanych z dostawą. Jeśli nie wskażesz lokalizacji, pojazd musi tylko odwiedzić lokalizację odpowiadającą odbiorowi.

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ą wykonać tę dostawę. Jeśli pole jest puste, wszystkie pojazdy mogą je wykonać. Pojazdy są identyfikowane przez ich numer na liście ShipmentModel vehicles.

costsPerVehicle[]

number

Określa koszt, jaki jest naliczany w momencie dostarczenia tej przesyłki przez każdy pojazd. Jeśli jest podany, musi zawierać 1 z tych elementów:

  • zawierać taką samą liczbę elementów jak costsPerVehicleIndices. costsPerVehicle[i] odpowiada pojazdowi costsPerVehicleIndices[i] w przypadku modelu.
  • taką samą liczbę elementów, jak pojazdów 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. Indeksu pojazdu nie można określić więcej niż raz. Jeśli pojazd jest wykluczony z 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 podany, musi być dodatni, a przesyłka musi zawierać co najmniej odbiór i dostawę.

Niech na przykład t będzie najkrótszym czasem potrzebnym na dotarcie z wybranego miejsca odbioru bezpośrednio do wybranego miejsca 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 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 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 dziewięciu cyfr po przecinku i kończący się „s”. Przykład: "3.5s".

shipmentType

string

Niepusty ciąg znaków określający „typ” tej przesyłki. Za pomocą tej funkcji można definiować niezgodności lub wymagania dotyczące shipment_types (patrz shipmentTypeIncompatibilities i shipmentTypeRequirements w 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 znajduje się w odpowiedzi w shipmentLabel odpowiedniego elementu ShipmentRoute.Visit.

ignore

boolean

Jeśli wartość to prawda, pomiń tę dostawę, ale nie stosuj penaltyCost.

Zignorowanie dostawy powoduje błąd weryfikacji, gdy w modelu występują 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ż będą ignorowane.

penaltyCost

number

Jeśli przesyłka nie zostanie dostarczona, ta kara zostanie dodana do łącznego kosztu tras. Wysyłka jest uznawana za zrealizowaną, jeśli zostanie odwiedzona 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 nie określisz tej kary, zostanie ona uznana za nieskończoną, co oznacza, że przesyłka 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 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. 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 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,
  "avoidUTurns": boolean
}
Pola
arrivalLocation

object (LatLng)

Geolokalizacja miejsca, do którego dociera pojazd podczas wykonywania tej 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)

Geolokalizacja miejsca, z którego pojazd wyrusza po zakończeniu tego 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, gdy ukończysz ten kurs (VisitRequest). Tę wartość można pominąć, jeśli jest taka sama jak arrivalWaypoint. Jeśli model dostawy zawiera macierze odległości czasowej, nie można podać parametru departureWaypoint.

tags[]

string

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

timeWindows[]

object (TimeWindow)

Przedziały 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ć wydłużenie czasu oczekiwania, jeśli pojazd dotrze do TimeWindow.start_time.

Brak 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 obsługi tej prośby o wizytę w przypadku trasy 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 żądania z tego żądania 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 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.

avoidUTurns

boolean

Określa, czy na trasach w tej lokalizacji należy unikać zawracania. Najlepiej unikać zawracania. To funkcja eksperymentalna, której działanie może ulec zmianie.

LatLng

Obiekt reprezentujący parę szerokości i długości geograficznej. Jest to para liczb podwójnie po przecinku, która reprezentuje 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 normalizowanych 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 [-180,0, +180,0].

Punkt pośredni

Zawiera punkt na trasie. Punkty pośrednie oznaczają miejsca przyjazdu i odjazdu dotyczące żądań wizyty oraz miejsca początkowe i końcowe dotyczące 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 lokalizacja tego punktu drogowego ma być preferowaną lokalizacją dla zatrzymania pojazdu po określonej stronie drogi. Po ustawieniu tej wartości trasa będzie przebiegać przez lokalizację, aby pojazd mógł się zatrzymać po tej stronie drogi, która jest zwrócona w stronę tej lokalizacji. Ta opcja nie działa w przypadku trybu „Chodzenie”.

Pole sumy location_type. różne sposoby przedstawiania lokalizacji; location_type może być tylko jednym z tych elementów:
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

Zawiera lokalizację (punkt geograficzny i opcjonalnie nagłówek).

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

object (LatLng)

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

heading

integer

Kierunek kompasu zwią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.

Sztywne granice przedziału czasowego startTimeendTime narzucają najwcześniejszy i najpóźniejszy czas zdarzenia, tak aby startTime <= event_time <= endTime. Dolna granica okna czasu softStartTime wyraża preferencję, aby zdarzenie nastąpiło w czasie lub po czasie softStartTime, powodując powstanie kosztu proporcjonalnego do czasu, jaki pozostał do softStartTime. Górna granica okna czasowego, softEndTime, wyraża preferencję, aby zdarzenie miało miejsce w czasie lub przed czasem softEndTime, przynosząc koszt proporcjonalny do czasu, jaki upłynie od tego momentu. 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)

Trudny czas rozpoczęcia okna czasowego. Jeśli nie podasz żadnej wartości, zostanie użyta wartość ShipmentModel.global_start_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".

endTime

string (Timestamp format)

Trudny czas zakończenia przedziału czasowego. Jeśli nie podasz żadnej wartości, zostanie użyta wartość 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 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".

softEndTime

string (Timestamp format)

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

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""2014-10-02T15:01:23.045123456Z".

costPerHourBeforeSoftStartTime

number

Koszt na godzinę dodany do innych kosztów w modelu, jeśli zdarzenie wystąpiło przed softStartTime, obliczany jako:

   max(0, softStartTime - t.seconds)
                          * costPerHourBeforeSoftStartTime / 3600,
t being the time of the event.

Ten koszt musi być dodatni, a pole może być ustawione tylko wtedy, gdy ustawiono wartość 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 przesyłką spowoduje utworzenie trasy dla tego pojazdu, która rozpoczyna się w miejscu startLocation, a kończy w miejscu endLocation. Trasa to sekwencja 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 on zawierać maksymalnie 63 znaki i 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 go nie podasz, 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 określono ani startWaypoint, ani startLocation, pojazd rozpoczyna działanie 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 i odległości, nie można określić parametru endLocation.

endWaypoint

object (Waypoint)

Punkt drogi reprezentujący lokalizację geograficzną, w której pojazd kończy ostatnią 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 i odległości, nie można określić parametru endWaypoint.

startTags[]

string

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

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

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ślisz tu żadnej wartości, nie będzie limitów poza tymi globalnymi limitami czasowymi.

Przedziały czasu należące do tego samego powtarzającego się pola muszą być rozłączne, co oznacza, że żaden z nich nie może się pokrywać z innym ani być sąsiadować z innym. Muszą być ułożone w porządku chronologicznym.

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

endTimeWindows[]

object (TimeWindow)

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

Przedziały czasu należące do tego samego powtarzającego się pola muszą być rozłączne, co oznacza, że żaden z nich nie może się pokrywać z innym ani być sąsiadować z innym. Muszą być ułożone w porządku chronologicznym.

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

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 wczytania zgodne z kluczami pola Shipment.load_demands. Jeśli dany klucz nie jest obecny na tej mapie, odpowiadająca mu pojemność jest uważana 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 naliczany za cały czas trwania trasy, w tym czas podróży, oczekiwania i wizyty. Używanie operatora costPerHour zamiast samego costPerTraveledHour może spowodować wydłużenie czasu oczekiwania.

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 za kilometr trasy pojazdu. 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łe koszty stosowane, jeśli pojazd jest używany 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 wartość to prawda, pojazd przemieszcza się z początku do miejsca docelowego nawet wtedy, gdy nie obsługuje żadnych przesyłek, a koszty czasu i odległości wynikające z początku podróży są brane pod uwagę.

W przeciwnym razie pojazd nie przemieszcza się z miejsca początkowego do miejsca docelowego i nie ma dla niego zaplanowanych breakRule ani opóźnień (z wyjątkiem 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 OptimizeToursResponse czas trwania trasy pojazdu to różnica między jego vehicleEndTimevehicleStartTime.

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)

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

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ć stosowany w tym pojeździe. Jeśli pole jest puste, dla tego pojazdu nie będą planowane żadne przerwy.

label

string

Określa etykietę tego pojazdu. Ta etykieta jest raportowana w odpowiedzi jako vehicleLabel odpowiadającego 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 dostawa jest realizowana przez pojazd ignorowany w injectedSolutionConstraint, a wszelkie powiązane odbiory/dostawy są ograniczone do pozostania w pojeździe (czyli nie są rozluźnione do poziomu RELAX_ALL_AFTER_THRESHOLD), są one pomijane 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. Ustawienie tej wartości na 2,0 oznacza, że pojazd jest wolniejszy i czas podróży jest dwukrotnie dłuższy niż w przypadku standardowych pojazdów. Ten współczynnik nie wpływa na czas trwania wizyty. Wpływa na koszty, jeśli określono costPerHour lub costPerTraveledHour. Musi mieścić się w zakresie [0,001, 1000,0]. Jeśli nie zostanie ustawiony, pojazd jest standardowy, a ten współczynnik jest uważany za 1,0.

OSTRZEŻENIE: czasy przejazdu zostaną zaokrąglone do najbliższej sekundy po zastosowaniu tego wielokrotnego, ale przed wykonaniem jakichkolwiek operacji numerycznych, dlatego małe wielokrotne może spowodować utratę dokładności.

Zobacz też extraVisitDurationForVisitType poniżej.

TravelMode

Tryby podróży, z których mogą korzystać pojazdy.

Powinny to być podzbiór preferowanych trybów podróży interfejsu API Routes na platformie Google Maps. Więcej informacji znajdziesz na stronie 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 kierunkom jazdy (samochód, ...).
WALKING Tryb podróży odpowiadający wskazówkom dojazdu pieszo.

UnloadingPolicy

Zasady dotyczące sposobu rozładunku pojazdu. Dotyczy tylko przesyłek z odbiorem 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 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ą odbywać się w tej samej kolejności co odbiory

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
}
Pola
softMaxLoad

string (int64 format)

Miękki 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 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 przedział ładowania pojazdu na końcu trasy.

maxLoad

string (int64 format)

Maksymalny dopuszczalny ładunek.

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ć większa lub równa 0. Jeśli nie określono inaczej, ten komunikat nie będzie ograniczać maksymalnego obciążenia. Jeśli oba parametry są określone, wartość min musi być mniejsza lub równa wartości max.

DurationLimit

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

Gdy zdefiniujesz pole z miękkim limitem, musisz zdefiniować zarówno miękki maksymalny próg, jak i powiązany z nim koszt.

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

miękki limit, który nie narzuca maksymalnego czasu trwania, ale w przypadku jego przekroczenia powoduje, że trasa powoduje koszt proporcjonalny do kwadratu czasu; 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 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 na godzinę, jeśli przekroczysz próg 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 za godzinę kwadratową, który jest naliczany, gdy przekroczony zostanie próg 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 musi być nieujemny.

DistanceLimit

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

Jeśli zdefiniowany jest miękki limit, wartości softMaxMeters i costPerKilometerAboveSoftMax muszą być zdefiniowane i nieujemne.

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

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, 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 czasowych dla pojazdu (np. przerwa 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ć:

  • podczas przemieszczania się między 2 wizytami (co obejmuje czas bezpośrednio przed wizytą lub bezpośrednio po niej, ale nie w jej trakcie), w którym przypadku wydłuża się czas przemieszczania się między 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 korzystania z pojazdu (w tym przypadku również podaj godzinę zakończenia korzystania z pojazdu).
Zapis JSON
{
  "breakRequests": [
    {
      object (BreakRequest)
    }
  ],
  "frequencyConstraints": [
    {
      object (FrequencyConstraint)
    }
  ]
}
Pola
breakRequests[]

object (BreakRequest)

Sekwencja przerw. Zobacz wiadomość: BreakRequest.

frequencyConstraints[]

object (FrequencyConstraint)

Mogą obowiązywać różne FrequencyConstraint. Wszystkie te warunki muszą być spełnione w ciągu BreakRequest tego BreakRule. Zobacz FrequencyConstraint.

BreakRequest

Sekwencja przerw (tj. ich liczba i kolejność) musi być wcześniej znana. Powtarzające się 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 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".

latestStartTime

string (Timestamp format)

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

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

minDuration

string (Duration format)

Wymagane. Minimalny czas trwania przerwy. Musi być 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 mieć zastosowanie do przerw, które nie następują po sobie. 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 trwania w sekundach składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „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 trwania w sekundach składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „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 zawierać taką samą liczbę elementów jak 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 pole jest puste, dotyczy to wszystkich pojazdów i może zawierać tylko jedną macierz.

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ć inną wartość 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 w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „s”. Przykład: "3.5s".

meters[]

number

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

TransitionAttributes

Określa atrybuty przejść 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 zbiór 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 zawiera excludedSrcTag (zależnie od tego, które z tych 2 pól nie jest puste).

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 przeprowadzenia tej zmiany. Jest on podawany w tych samych jednostkach co wszystkie inne koszty w modelu i nie może być ujemny. Jest ona naliczana dodatkowo do wszystkich innych kosztów.

costPerKilometer

number

Określa koszt na kilometr zastosowany do przebytej odległości podczas wykonywania tego przejścia. Dodaje się do wszystkich Vehicle.cost_per_kilometer określonych w pojazdach.

distanceLimit

object (DistanceLimit)

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

Od czerwca 2021 r. obsługiwane są tylko limity miękkie.

delay

string (Duration format)

Określa opóźnienie powstałe podczas wykonywania tego przejścia.

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

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

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 z niekompatybilnymi typami nigdy nie mogą korzystać z tego samego pojazdu.
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 poszczególnych przesyłek na podstawie ich dostawy. Szczegóły wymagań są definiowane przez tryb wymagań.

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

string

Lista alternatywnych typów dostawy wymaganych przez dependentShipmentTypes.

dependentShipmentTypes[]

string

Wszystkie przesyłki z typem w polu dependentShipmentTypes wymagają co najmniej 1 przesyłki typu requiredShipmentTypeAlternatives, która ma być odwiedzona na tym samym szlaku.

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

requirementMode

enum (RequirementMode)

Tryb zastosowany do wymagań.

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 przesyłki „zależne” muszą być z tym samym pojazdem co co najmniej jedna z „wymaganych” przesyłek.
IN_SAME_VEHICLE_AT_PICKUP_TIME

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

Odbiór „zależnej” przesyłki musi więc mieć:

  • „wymagana” przesyłka tylko z dostawą, dostarczona w późniejszym terminie;
  • „Wymagana” przesyłka odebrana na trasie przed nią, a jeśli „wymagana” przesyłka obejmuje dostawę, musi ona zostać zrealizowana po odbiorze przesyłki zależnej.
IN_SAME_VEHICLE_AT_DELIVERY_TIME To samo co wcześniej, z tą różnicą, że w momencie dostawy przesyłki „zależne” muszą mieć w pojeździe przesyłkę „wymaganą”.

PrecedenceRule

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

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

Ponadto priorytety mają zastosowanie tylko wtedy, gdy obie przesyłki są realizowane, a 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 wyświetlenie.

offsetDuration

string (Duration format)

Odstęp między zdarzeniami „first” i „second”. Może być ujemna.

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