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ę.
  • koszt globalnego czasu trwania przesyłek;
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 odwiedzin.

globalStartTime

string (Timestamp format)

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

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

Gdy używasz pól cost_per_*hour, możesz ustawić krótszy przedział czasu, aby zwiększyć skuteczność (np. jeśli modelujesz jeden dzień, ustaw globalne limity czasu na ten dzień). Jeśli nie 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 zostanie ustawiona, domyślnie używana jest data 1 stycznia 1971 r., godzina 00:00:00 czasu UTC (czyli 31536000 sekund, 0 nanosekund).

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

„Całkowity czas trwania” ogólnego planu to różnica między najwcześniejszym skutecznym czasem rozpoczęcia a najpóźniejszym skutecznym czasem zakończenia wszystkich pojazdów. Użytkownicy mogą przypisać koszt za godzinę do tej ilości, aby na przykład zoptymalizować zadanie pod kątem jak najszybszego ukończenia. Te koszty muszą być wyrażone w tych samych jednostkach 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 rozpoczynający swoją trasę w locB, a kończący w lokalizacji locB, z wykorzystaniem 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 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.

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 matriksu Vehicle mogą być takie same. Podobnie tagi źródła i miejsca docelowego 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)

Dodano atrybuty przejścia do modelu.

shipmentTypeIncompatibilities[]

object (ShipmentTypeIncompatibility)

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

shipmentTypeRequirements[]

object (ShipmentTypeRequirement)

zestawy wymagań shipmentType (patrz ShipmentTypeRequirement).

precedenceRules[]

object (PrecedenceRule)

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

maxActiveVehicles

integer

Ogranicza maksymalną liczbę aktywnych pojazdów. Pojazd jest aktywny, jeśli na jego trasie jest realizowana co najmniej 1 dostawa. Można go użyć do ograniczenia liczby tras w przypadku, gdy kierowców jest mniej niż pojazdów, a flota pojazdów jest zróżnicowana. 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 wykonaną, unikalny pojazd musi odwiedzić jedno z miejsc odbioru (i odpowiednio zmniejszyć ilość zapasowego), a następnie odwiedzić jedno z miejsc dostawy (i w związku z tym odpowiednio zwiększyć pojemność zapasową).

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

string

Zdefiniowana przez użytkownika 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 alternatyw dostawy powiązanych z przesyłką. Jeśli go nie podasz, pojazd musi udać się tylko do lokalizacji odpowiadającej punktom odbioru.

loadDemands

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

wymagania dotyczące ładunku (np. waga, objętość, liczba palet itp.); 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 pojawia się na mapie, odpowiadający mu ładunek jest uważany za null.

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

allowedVehicleIndices[]

integer

Zestaw pojazdów, które mogą zrealizować tę przesyłkę. Jeśli pole jest puste, mogą go wykonywać wszystkie pojazdy. Pojazdy są identyfikowane przez ich numer na liście ShipmentModel vehicles.

costsPerVehicle[]

number

Określa koszt poniesiony podczas dostawy przesyłki przez dany pojazd. Jeśli jest podany, musi zawierać 1 z tych elementów:

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

Koszty muszą być podane w tej samej jednostce co penaltyCost i nie mogą być ujemne. 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. 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 określona, nie może być ujemna, a przesyłka musi zawierać co najmniej informacje o odbiorze i dostawie.

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

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

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

pickupToDeliveryTimeLimit

string (Duration format)

Określa maksymalny czas od rozpoczęcia odbioru do rozpoczęcia dostawy przesyłki. Jeśli jest podany, musi być dodatni, a przesyłka musi zawierać co najmniej odbiór i dostawę. Nie zależy to od tego, które opcje odbioru i dostawy są wybrane ani od prędkości pojazdu. Można je określić razem z ograniczeniami maksymalnego objazdu: 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óżnica w porównaniu z visitTypes, który jest określony dla pojedynczej wizyty: wszystkie odbiory i dostawy należące do tego samego zamówienia mają ten sam 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 wartość to prawda, pomiń tę dostawę, ale nie stosuj penaltyCost.

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

Ignorowanie dostawy realizowanej w ramach injectedFirstSolutionRoutes lub injectedSolutionConstraint jest dozwolone; Solver usuwa powiązane wizyty odbioru/dostawy z trasy. precedenceRules, które odwołują się do ignorowanych przesyłek, również będą ignorowane.

penaltyCost

number

Jeśli dostawa nie zostanie ukończona, kara zostanie dodana do całkowitego kosztu tras. 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 tych samych jednostkach co wszystkie inne pola związane z kosztami 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.

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 pickupToDeliveryRelativeDetourLimit wymusza:

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)

Geolokalizacja miejsca, do którego dociera pojazd podczas wykonywania tej VisitRequest. Jeśli model dostawy zawiera macierze odległości między czasem trwania, nie można podawać wartości arrivalLocation.

arrivalWaypoint

object (Waypoint)

Punkt orientacyjny, w którym pojazd dociera podczas wykonywania tego 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 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). Można go pominąć, jeśli jest taki sam 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. Pustych lub powtarzających się ciągów znaków nie można używać.

timeWindows[]

object (TimeWindow)

Okna czasowe, które ograniczają czas 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.

Okna czasowe muszą być odseparowane, co oznacza, że żadne z nich nie może się pokrywać z innym ani być sąsiadować z innym. Okna czasowe muszą być uporządkowane w rosnącej kolejności.

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 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. Wymagania wymienione tutaj są dodawane do wymagań wymienionych w 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żesz go wykorzystać, aby zarezerwować dodatkowy czas wymagany na dokonanie tej wizyty (patrz Vehicle.extra_visit_duration_for_visit_type).

Typ może się pojawić tylko raz.

label

string

Określa etykietę elementu VisitRequest. Ta etykieta jest 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 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 od -180,0 do +180,0].

Punkt pośredni

Obejmuje punkt pośredni. 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 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 być tylko jednym z tych elementów:
location

object (Location)

Punkt określony za pomocą współrzędnych geograficznych, w tym opcjonalny nagłówek.

placeId

string

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

Lokalizacja

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

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

object (LatLng)

Współrzędne geograficzne punktu kontrolnego.

heading

integer

Kierunek kompasu związany z kierunkiem ruchu. Ta wartość służy do określania strony drogi na potrzeby odbioru i zwrotu. Nagłówek może przyjmować wartości z zakresu od 0 do 360, gdzie 0 oznacza kierunek kierunku północnego, 90 określa kierunek kierunku północnego 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 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, softStartTime i softEndTime powinny mieścić się w globalnych limitach czasowych (patrz ShipmentModel.global_start_time i ShipmentModel.global_end_time) oraz spełniać te warunki:

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

string (Timestamp format)

Trudny czas rozpoczęcia okna czasowego. Jeśli nie 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 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" i "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""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""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ż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.

Koszt musi być dodatni, a pole można ustawić tylko wtedy, gdy ustawiono softEndTime.

Pojazd

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

Zapis JSON
{
  "displayName": string,
  "travelMode": enum (TravelMode),
  "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 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.

routeModifiers

object (RouteModifiers)

Zbiór warunków, które należy spełnić, a które wpływają na sposób obliczania tras dla danego pojazdu.

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 i odległości, nie można określić parametru 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 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.

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.

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

startTimeWindows[]

object (TimeWindow)

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

Przedziały czasu należące do tego samego 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.

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

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

costPerHour

number

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

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

costPerTraveledHour

number

Koszt 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 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 takim przypadku ShipmentRoute pojazdu nie zawiera żadnych informacji oprócz indeksu i oznaczenia 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 OptimizeToursResponse odległość trasy jest sumą wszystkich 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ć puste.

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 będzie puste, w przypadku tego pojazdu nie zostaną zaplanowane żadne przerwy.

label

string

Określa etykietę tego pojazdu. Ta etykieta jest raportowana w odpowiedzi jako vehicleLabel odpowiadającego 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 przesyłka jest realizowana przez pojazd ignorowany w definicji injectedFirstSolutionRoutes, jest pomijana w pierwszym rozwiązaniu, ale może być realizowana 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 pole allowedVehicleIndices w dostawie nie jest puste, a wszystkie dozwolone pojazdy są ignorowane, zostaną one pominięte 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 [0,001, 1000,0]. Jeśli nie jest skonfigurowana, pojazd jest standardowy, a mnożnik przyjmuje wartość 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

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

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

Wartości w polu enum
TRAVEL_MODE_UNSPECIFIED Nieokreślony środek transportu, odpowiednik: DRIVING.
DRIVING Tryb podróży odpowiadający wskazówkom dojazdu (samochód, ...).
WALKING Tryb podróży odpowiadający trasom pieszym.
TRUCK Podróż ciężarówką. Ten tryb wiąże się z ograniczeniami fizycznymi i prawnymi.

RouteModifiers

Obejmuje zestaw opcjonalnych warunków, które muszą zostać spełnione przy obliczaniu tras pojazdów. Jest to podobne do RouteModifiers w interfejsie API Preferowane trasy w Google Maps Platform. Więcej informacji znajdziesz na stronie https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteModifiers.

Zapis JSON
{
  "vehicleInfo": {
    object (VehicleInfo)
  }
}
Pola
vehicleInfo

object (VehicleInfo)

Określa informacje o pojeździe.

VehicleInfo

Zawiera informacje o pojeździe, np. informacje o ciężarówce.

Zapis JSON
{
  "totalAxleCount": integer,
  "totalHeightMm": string,
  "totalLengthMm": string,
  "totalWidthMm": string,
  "totalWeightKg": string,
  "trailerInfo": [
    {
      object (TrailerInfo)
    }
  ],
  "hazardousGoodsTypes": [
    enum (HazardousGoodsType)
  ]
}
Pola
totalAxleCount

integer

Łączna liczba osi. Musi wynosić ≥ 2. Musi być ustawiony na przewóz drogą lądową lub naczepą. Dotyczy tylko środka transportu TRUCK.

totalHeightMm

string (int64 format)

Wysokość pojazdu, w tym wysokość przyczepy. Musi być ustawione dla ciężarówek lub przyczep. Dotyczy tylko środka transportu TRUCK.

totalLengthMm

string (int64 format)

Długość pojazdu uwzględniająca długość przyczep przyczepnych. Musi być ustawiony na przewóz drogą lądową lub naczepą. Dotyczy tylko środka transportu TRUCK.

totalWidthMm

string (int64 format)

Szerokość pojazdu, w tym szerokość przyczep. Musi być ustawione dla ciężarówek lub przyczep. Dotyczy tylko środka transportu TRUCK.

totalWeightKg

string (int64 format)

Ciężar pojazdu uwzględniający ciężar wszystkich przyczep. W tym kontekście waga oznacza rzeczywistą wagę, a nie klasę wagową. Musi być ustawione dla ciężarówek lub przyczep. Dotyczy tylko środka transportu TRUCK.

trailerInfo[]

object (TrailerInfo)

Dotyczy tylko trybu podróży TRUCK.

hazardousGoodsTypes[]

enum (HazardousGoodsType)

Lista materiałów niebezpiecznych przewożonych w pojeździe (jeśli takie są).

TrailerInfo

Informacje o poszczególnych przyczepach zamontowanych w pojeździe. W przypadku transportu drogowego należy podać długości przyczep. Łączna liczba atrybutów musi obejmować atrybuty wszystkich przyczep. Na przykład totalHeightMm musi zawsze mieć wartość trailerInfo.height_mm lub większą.

Zapis JSON
{
  "lengthMm": string
}
Pola
lengthMm

string (int64 format)

Długość zwiastuna.

HazardousGoodsType

Rodzaje różnych niebezpiecznych materiałów.

Wartości w polu enum
HAZARDOUS_GOODS_TYPE_UNSPECIFIED Nie określono typu towarów niebezpiecznych.
EXPLOSIVES materiały wybuchowe.
GASES Gazy.
FLAMMABLE Towary łatwopalne.
COMBUSTIBLE Towary łatwopalne.
ORGANIC produkty ekologiczne;
POISON towary trujące;
RADIOACTIVE Towary radioaktywne.
CORROSIVE Produkty żrące.
ASPIRATION_HAZARD Produkty niebezpieczne w przypadku aspiracji.
ENVIRONMENTAL_HAZARD Towary niebezpieczne dla środowiska.
OTHER Inne typy towarów.

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 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
}
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 czas obciążenia pojazdu na końcu trasy.

maxLoad

string (int64 format)

Maksymalna akceptowalna ilość obciążenia.

Interwał

Przedział dopuszczalnych wartości obciążenia.

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

string (int64 format)

minimalny dopuszczalny ładunek; Wartość musi być ≥ 0. Jeśli obie są określone, min musi mieć wartość ≤ max.

max

string (int64 format)

Maksymalne dopuszczalne obciążenie. Wartość musi być ≥ 0. Jeśli nie określisz maksymalnego obciążenia, wiadomość nie będzie nakładać żadnych ograniczeń. 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 zdefiniowano pole opcjonalnego limitu, muszą być one określone razem.

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

string (Duration format)

Stały limit ogranicza czas trwania do maksymalnie maxDuration.

Czas 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 została określona, softMaxDuration nie może być ujemna. Jeśli zdefiniowano również parametr maxDuration, wartość softMaxDuration musi być mniejsza niż parametr maxDuration.

Czas trwania w sekundach składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „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 sumowany z innymi kosztami zdefiniowanymi w modelu, przy użyciu tej samej jednostki.

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 trwania w sekundach składający się z maksymalnie dziewięciu cyfr po przecinku i kończący się „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 musi być nieujemny.

costPerSquareHourAfterQuadraticSoftMax

number

Koszt za godzinę kwadratową, który jest naliczany, gdy przekroczony zostanie próg quadraticSoftMaxDuration.

Jeśli czas trwania jest poniżej progu, dodatkowy koszt wynosi 0. W innych przypadkach koszt zależy od czasu trwania w następujący sposób:

  costPerSquareHourAfterQuadraticSoftMax *
  (duration - quadraticSoftMaxDuration)^2

Koszt nie może być ujemny.

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

softMaxMeters

string (int64 format)

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

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

costPerKilometerAboveSoftMax

number

Koszt za kilometr, 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 musi być nieujemny.

BreakRule

Reguły generowania przerw na przejazd pojazdem (np. przerwy 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ć:

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

Kolejność 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ę elementy BreakRequest definiują tę sekwencję w kolejności, w jakiej muszą wystąpić. Przedziały czasu (earliestStartTime / latestStartTime) mogą się pokrywać, ale muszą być zgodne z zamówieniem (jest to zaznaczone).

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

string (Timestamp format)

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

Sygnatura czasowa w 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".

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""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 zinterpretować w ten sposób: „W każdym przesuwającym się przedziale czasu wynoszącym 12 godzin musi istnieć co najmniej jedna przerwa o długości co najmniej 1 godziny”, przykłada prezentuje się tak: FrequencyConstraint:

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

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

FrequencyConstraint może w praktyce mieć zastosowanie do przerw, które nie następują po sobie. Na przykład ten harmonogram uwzględnia 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 przedział czasu na trasie, który nie obejmuje co najmniej częściowej przerwy duration >= minBreakDuration. Musi być liczbą dodatnią.

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

DurationDistanceMatrix

Określa czas trwania i macierz odległości od miejsc początkowych wizyt i pojazdu do miejsc końcowych wizyt i 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 pasować do jednej macierzy, tzn. dokładnie jedno z jego pola startTags musi odpowiadać wartości vehicleStartTag macierzy (i tylko tej macierzy).

Wszystkie macierze muszą mieć inny element vehicleStartTag.

Wiersz

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

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

string (Duration format)

Wartości czasu trwania w danym wierszu. Musi zawierać taką samą liczbę elementów jak 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ścia między 2 kolejnymi wizytami na trasie. Do tego samego przejścia może być stosowanych kilka elementów TransitionAttributes: w takim przypadku wszystkie dodatkowe koszty sumują się i zastosowane jest najbardziej rygorystyczne ograniczenie lub limit (zgodnie z naturalną semantyką „ORAZ”).

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

string

Tagi definiujące 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

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

excludedDstTag

string

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

cost

number

Określa koszt przeprowadzenia tej zmiany. 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 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 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 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. Ta wartość nigdy nie powinna być używana.
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 2 przesyłek o niezgodnych typach z trybem zgodności NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY:

  • Jeśli obie usługi to tylko odbiór (bez dostawy) lub tylko dostawa (bez odbioru), nie mogą korzystać z tego samego pojazdu.
  • Jeśli jedna z przesyłek ma być dostarczona, a druga odebrana, mogą one być przewożone tym samym pojazdem, o ile pierwsza z nich zostanie dostarczona przed odebraniem drugiej.

ShipmentTypeRequirement

Określa wymagania dotyczące przesyłek na podstawie ich typu przesyłki. Szczegóły wymagań są definiowane przez tryb wymagań.

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

string

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

dependentShipmentTypes[]

string

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

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

requirementMode

enum (RequirementMode)

Tryb zastosowany do wymagań.

RequirementMode

Tryby definiujące sposób wyświetlania 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ć 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ć 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 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 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 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”.

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

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.