ShipmentModel

Model dostawy zawiera zestaw dostaw, które muszą być realizowane przez zestaw pojazdów, przy jednoczesnym minimalizowaniu łącznego kosztu, który jest sumą:

  • kosztu wyznaczania trasy pojazdów (suma kosztu na godzinę, kosztu na czas przejazdu i kosztów stałych wszystkich pojazdów);
  • kary za niewywiązanie się z obowiązku dostawy.
  • 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 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ł czasu, 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 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".

globalEndTime

string (Timestamp format)

Jeśli nie zostanie ustawiona, domyślnie używana jest data 1 stycznia 1971 r., godzina 00:00:00 UTC (czyli 31536000 sekund, 0 nanosekund).

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

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ć do tej ilości koszt za godzinę, 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 być prawdą, a pole durationDistanceMatrixSrcTags ani durationDistanceMatrixDstTags nie może 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
    }
  }
}
  • Istnieją 3 lokalizacje: locA, locB i 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 trasę w miejscu locB i kończący ją w miejscu locB, korzystając z macierzy „fast”.
  • 1 prośba o odbiór w miejscu: locC.
model {
  vehicles { startTags: "locA" endTags: "locB" startTags: "fast" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "slow" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "fast" }
  shipments { pickups { tags: "locC" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixSrcTags: "locC"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrixDstTags: "locC"
  durationDistanceMatrices {
    vehicleStartTag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  durationDistanceMatrices {
    vehicleStartTag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
durationDistanceMatrixSrcTags[]

string

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

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

Tagi odpowiadają VisitRequest.tags lub Vehicle.start_tags. Podany identyfikator VisitRequest lub Vehicle musi odpowiadać dokładnie 1 tagowi w tym polu. Pamiętaj, że tagi źródła, miejsca docelowego i 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.

transitionAttributes[]

object (TransitionAttributes)

Dodano do modelu atrybuty przejścia.

shipmentTypeIncompatibilities[]

object (ShipmentTypeIncompatibility)

Zestawy niezgodnych typów dostawy (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ę. 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. Następnie optymalizacja wybierze najlepszy podzbiór pojazdów do użycia. Musi być dodatni.

Wysyłka

Przesyłka pojedynczego produktu, od momentu jego odebrania do momentu dostarczenia. 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 może zawierać znaki UTF-8.

pickups[]

object (VisitRequest)

Zestaw alternatyw odbioru powiązanych z przesyłką. Jeśli nie określono inaczej, pojazd musi tylko odwiedzić lokalizację odpowiadającą dostawom.

deliveries[]

object (VisitRequest)

Zestaw alternatyw dostawy powiązanych z przesyłką. Jeśli nie wskażesz lokalizacji, pojazd musi tylko odwiedzić lokalizację odpowiadającą odbiorowi.

loadDemands

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

wymagania dotyczące ładunku (np. waga, objętość, liczba palet itp.); Klucze w mapie powinny być identyfikatorami, które opisują typ odpowiadającego im obciążenia. W idealnej sytuacji powinny też zawierać 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 pusty.

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 poniesiony podczas dostawy przesyłki przez dany 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-ty element odpowiada pojazdowi o numerze i w danym modelu.

Te koszty muszą być wyrażone w tych samych jednostkach 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 nie jest pusta, 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. Ustawienie pickupToDeliveryAbsoluteDetourLimit powoduje:

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

Jeśli w przypadku jednej przesyłki są określone zarówno względne, jak i bezwzględne limity, w przypadku każdej możliwej pary odbioru/dostawy stosuje się bardziej restrykcyjny limit. Od października 2017 r. objazdy są obsługiwane tylko wtedy, gdy czas podróży nie zależy od pojazdów.

Czas 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 uwzględniać obie specyfikacje.

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

shipmentType

string

Niepusty ciąg znaków określający „typ” przesyłki. 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 tej samej przesyłki 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ż zostaną zignorowane.

penaltyCost

number

Jeśli przesyłka nie zostanie dostarczona, ta kara zostanie dodana do łącznego 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 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. 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 października 2017 r. objazdy są obsługiwane tylko wtedy, gdy czas podróży nie zależy od pojazdów.

VisitRequest

Prośba o wizytę, którą można wykonać pojazdem: zawiera ona lokalizację geograficzną (lub dwie, patrz poniżej), godziny otwarcia i zamknięcia reprezentowane przez okna czasowe oraz czas trwania usługi (czas spędzony przez pojazd po przybyciu do miejsca 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 czasowej, nie należy podawać parametru 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 należy podawać parametru arrivalWaypoint.

departureLocation

object (LatLng)

Miejsce docelowe, do którego pojazd ma dojechać po zakończeniu tego VisitRequest. Można go pominąć, jeśli jest taki sam jak arrivalLocation. Jeśli model dostawy zawiera macierze odległości czasowej, nie należy podawać parametru departureLocation.

departureWaypoint

object (Waypoint)

Punkt orientacyjny, w którym pojazd wyrusza po zakończeniu tego VisitRequest. Można go pominąć, jeśli jest taki sam jak arrivalWaypoint. Jeśli model dostawy zawiera macierze odległości czasowej, nie należy podawać 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 stosować.

timeWindows[]

object (TimeWindow)

Okna czasowe, które ograniczają czas przybycia podczas wizyty. Pamiętaj, że pojazd może wyjechać poza oknem czasowym przyjazdu, czyli czas przyjazdu + czas trwania nie musi mieścić się w oknie czasowym. Może to spowodować oczekiwanie, jeśli pojazd dotrze przed TimeWindow.start_time.

Brak 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 według 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 realizacji tego żądania wizyty na trasie pojazdu. Można go używać do płacenia różnych kosztów za odbiór lub dostawę przesyłki. Koszt musi być wyrażony w tych samych jednostkach co Shipment.penalty_cost i nie może być ujemny.

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.

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ę dla tego 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 to para liczb podwójnie po przecinku reprezentująca stopnie szerokości i długości geograficznej. O ile 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 [-180,0, +180,0].

Punkt pośredni

Zawiera punkt na trasie. Punkty kontrolne 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 kontrolnego ma być preferowaną lokalizacją dla pojazdu, aby zatrzymał się on po konkretnej stronie drogi. Gdy ustawisz tę wartość, trasa będzie przebiegać przez lokalizację, aby pojazd mógł się zatrzymać po tej stronie drogi, po której znajduje się ta lokalizacja, z dala od środka jezdni. Ta opcja nie działa w przypadku trybu „Chodzenie”.

Pole unii 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 docelowego powiązany z punktem drogi.

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

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ą wynosić 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. Dolny limit 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.softEndTime Wartości startTime, endTime, softStartTimesoftEndTime powinny mieścić się w globalnych limitach czasowych (patrz ShipmentModel.global_start_timeShipmentModel.global_end_time) oraz spełniać te wymagania:

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

string (Timestamp format)

Czas rozpoczęcia okna czasowego. Jeśli nie podasz żadnej wartości, zostanie użyta wartość ShipmentModel.global_start_time.

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

endTime

string (Timestamp format)

Czas zakończenia sztywnego przedziału czasu. Jeśli nie podasz żadnej wartości, zostanie użyta wartość ShipmentModel.global_end_time.

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

softStartTime

string (Timestamp format)

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

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 na godzinę dodany do innych kosztów w modelu, jeśli zdarzenie wystąpiło po softEndTime, obliczany jako:

   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

Model pojazdu w przypadku problemu z dostawą. Rozwiązanie problemu z dostawą 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),
  "routeModifiers": {
    object (RouteModifiers)
  },
  "startLocation": {
    object (LatLng)
  },
  "startWaypoint": {
    object (Waypoint)
  },
  "endLocation": {
    object (LatLng)
  },
  "endWaypoint": {
    object (Waypoint)
  },
  "startTags": [
    string
  ],
  "endTags": [
    string
  ],
  "startTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "endTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "unloadingPolicy": enum (UnloadingPolicy),
  "loadLimits": {
    string: {
      object (LoadLimit)
    },
    ...
  },
  "costPerHour": number,
  "costPerTraveledHour": number,
  "costPerKilometer": number,
  "fixedCost": number,
  "usedIfRouteIsEmpty": boolean,
  "routeDurationLimit": {
    object (DurationLimit)
  },
  "travelDurationLimit": {
    object (DurationLimit)
  },
  "routeDistanceLimit": {
    object (DistanceLimit)
  },
  "extraVisitDurationForVisitType": {
    string: string,
    ...
  },
  "breakRule": {
    object (BreakRule)
  },
  "label": string,
  "ignore": boolean,
  "travelDurationMultiple": number
}
Pola
displayName

string

Zdefiniowana przez użytkownika nazwa wyświetlana pojazdu. Może on zawierać maksymalnie 63 znaki i może zawierać znaki UTF-8.

travelMode

enum (TravelMode)

Tryb podróży, który wpływa na drogi dostępne dla pojazdu 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)

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

startWaypoint

object (Waypoint)

Punkt drogi przedstawiający lokalizację geograficzną, w której pojazd rozpoczyna przejazd przed odbiorem przesyłek. Jeśli nie określono ani właściwości startWaypoint, ani startLocation, pojazd rozpoczyna działanie od pierwszego odbioru. Jeśli model dostawy zawiera macierze czasu i odległości, nie należy podawać parametru startWaypoint.

endLocation

object (LatLng)

Miejsce geograficzne, w którym pojazd kończy ostatnią 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 należy podawać parametru endLocation.

endWaypoint

object (Waypoint)

Punkt drogi reprezentujący lokalizację geograficzną, w której pojazd kończy ostatnią 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 należy podawać 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 stosować.

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

startTimeWindows[]

object (TimeWindow)

Okna czasowe, w których pojazd może opuścić miejsce początkowe. 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, czyli żaden z nich nie może się pokrywać z innym ani być sąsiadować z innym. Muszą być uporządkowane chronologicznie.

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

endTimeWindows[]

object (TimeWindow)

Okna czasowe, 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ś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, czyli żaden z nich nie może się pokrywać z innym ani być sąsiadować z innym. Muszą być uporządkowane chronologicznie.

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

unloadingPolicy

enum (UnloadingPolicy)

Zasady rozładunku stosowane 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ą.

costPerHour

number

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

Koszt godziny przejazdu 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 przejechania 1 km trasy przez pojazd. Ten koszt jest stosowany do odległości podanej w ShipmentRoute.transitions i nie dotyczy odległości przebytej z 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 to ustawienie ma wartość true, pojazd jedzie z miejsca początkowego do miejsca docelowego, nawet jeśli nie obsługuje żadnych przesyłek. Uwzględniane są koszty czasu i odległości wynikające z przejazdu od początku do końca.

W przeciwnym razie pojazd nie przemieszcza się z punktu początkowego do końcowego i nie ma dla niego zaplanowanego breakRule ani opóźnienia (z TransitionAttributes). W takim przypadku ShipmentRoute pojazdu nie zawiera żadnych informacji oprócz indeksu i oznaczenia pojazdu.

routeDurationLimit

object (DurationLimit)

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

travelDurationLimit

object (DurationLimit)

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

routeDistanceLimit

object (DistanceLimit)

Ograniczenie stosowane do całkowitej odległości przebytej przez pojazd. W danym OptimizeToursResponse odległość trasy jest sumą wszystkich transitions.travel_distance_meters.

extraVisitDurationForVisitType

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

Określa mapę od ciągów znaków visitTypes do długości. Czas trwania to czas dodatkowy do VisitRequest.duration, który należy uwzględnić w wizytach z określonym visitTypes. Ten dodatkowy czas wizyty zwiększa koszty, jeśli ustawiono parametr costPerHour. Klucze (np. visitTypes) nie mogą być pustymi ciągami znaków.

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

breakRule

object (BreakRule)

Opisuje harmonogram przerw, który ma być stosowany w tym pojeździe. Jeśli pole 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 wartość usedIfRouteIsEmpty ma być ustawiona na prawda, musisz ustawić wartość usedIfRouteIsEmpty na fałsz, a samochód pozostanie nieużywany.

Jeśli przesyłka jest realizowana przez pojazd ignorowany w sekcji 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 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 długość 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 zostanie ustawiony, pojazd jest standardowy, a wielokrotność jest uważana 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. Szczegóły: 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, równoważny z DRIVING.
DRIVING Tryb podróży odpowiadający wskazówkom dojazdu (samochód, ...).
WALKING Tryb podróży odpowiadający wskazówkom dojazdu pieszo.

RouteModifiers

Zawiera zestaw opcjonalnych warunków, które należy spełnić podczas obliczania tras pojazdów. Jest to podobne do RouteModifiers w interfejsie API Preferowane trasy na platformie Mapy Google (https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers).

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

boolean

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

avoidHighways

boolean

Określa, czy w uzasadnionych przypadkach ma być unikana jazda autostradami. Preferowane będą trasy nieobejmujące autostrad. Dotyczy to tylko pojazdów mechanicznych.

avoidFerries

boolean

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

avoidIndoor

boolean

Opcjonalnie: Określa, czy w uzasadnionych przypadkach ma być unikana nawigacja wewnątrz budynków. Preferowane będą trasy nieobejmujące nawigacji wewnątrz budynków. Dotyczy tylko trybu podróży WALKING.

UnloadingPolicy

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

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

Wartości w polu enum
UNLOADING_POLICY_UNSPECIFIED Nieokreślona polityka rozładunku; dostawy muszą odbywać się po odpowiednich odbiorach.
LAST_IN_FIRST_OUT Dostawy muszą odbywać się w odwrotnej kolejności 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 ładunek przekroczy wartość softMaxLoad na trasie tego pojazdu, zostanie zastosowana następująca kara za koszty (tylko raz na pojazd): (load - softMaxLoad) * costPerUnitAboveSoftMax. Wszystkie koszty są sumowane i muszą być wyrażone w tej samej jednostce co Shipment.penalty_cost.

startLoadInterval

object (Interval)

Dopuszczalny przedział ładowania pojazdu na początku trasy.

endLoadInterval

object (Interval)

Dopuszczalny przedział ładowania pojazdu na końcu trasy.

maxLoad

string (int64 format)

Maksymalny dopuszczalny ładunek.

Interwał

Przedział dopuszczalnych wartości obciążenia.

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

string (int64 format)

minimalny dopuszczalny ładunek; Wartość musi być większa lub równa 0. Jeśli oba parametry są określone, wartość min musi być mniejsza lub równa wartości max.

max

string (int64 format)

Maksymalny dopuszczalny ładunek. Wartość musi być większa lub równa 0. Jeśli nie podasz 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ć twardy lub miękki.

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)

Sztywne ograniczenie określające, że czas trwania nie może być dłuższy niż maxDuration.

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

softMaxDuration

string (Duration format)

miękki limit, który nie narzuca maksymalnego czasu trwania, ale w przypadku jego naruszenia powoduje powstanie kosztu trasy; 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 zdefiniowana jest też wartość maxDuration, softMaxDuration musi być mniejsza niż 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 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 w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „s”. Przykład: "3.5s".

costPerHourAfterSoftMax

number

Koszt na godzinę, jeśli zostanie przekroczony próg softMaxDuration. 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:

  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 musi być nieujemny.

DistanceLimit

Limit określający maksymalną odległość, jaką można pokonać. Może być twardy lub miękki.

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

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

string (int64 format)

sztywny limit ograniczający odległość do maksymalnej wartości maxMeters. Limit nie może być liczbą ujemną.

softMaxMeters

string (int64 format)

miękki limit, który nie narzuca maksymalnego limitu odległości, ale w przypadku jego naruszenia powoduje koszt, który jest dodawany do innych kosztów zdefiniowanych w modelu, z tą samą jednostką.

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

costPerKilometerBelowSoftMax

number

Koszty na kilometr, które mogą wzrosnąć do softMaxMeters, według formuły:

  min(distanceMeters, softMaxMeters) / 1000.0 *
  costPerKilometerBelowSoftMax.

Te koszty nie są obsługiwane w routeDistanceLimit.

costPerKilometerAboveSoftMax

number

Koszt za kilometr, jeśli odległość przekracza limit softMaxMeters. Jeśli odległość jest mniejsza od limitu, dodatkowy koszt wynosi 0. W przeciwnym razie koszt jest obliczany według tego wzoru:

  (distanceMeters - softMaxMeters) / 1000.0 *
  costPerKilometerAboveSoftMax.

Koszt musi być nieujemny.

BreakRule

Reguły generowania przerw czasowych dla pojazdu (np. przerwa na lunch). Przerwa to ciągły okres czasu, w którym pojazd pozostaje 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)

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 (czyli ich liczba i kolejność) obowiązująca w przypadku każdego pojazdu musi być znana z wyprzedzeniem. 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""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 w sekundach z maksymalnie 9 miejscami po przecinku, zakończony literą „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 trwania i częstotliwość przerw w rozwiązaniu będą uwzględniać wszystkie te ograniczenia, a także okna czasowe i minimalne czasy trwania określone w BreakRequest.

FrequencyConstraint może w praktyce dotyczyć przerw nieciągłych. Na przykład poniższy harmonogram uwzględnia przykład „1 godzina co 12 godzin”:

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

string (Duration format)

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

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

maxInterBreakDuration

string (Duration format)

Wymagane. Maksymalny dozwolony przedział czasu na trasie, który nie obejmuje co najmniej częściowej przerwy duration >= minBreakDuration. Musi być dodatni.

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

DurationDistanceMatrix

Określa czas trwania i 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 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 jest pusty, ma zastosowanie do wszystkich pojazdów i może być tylko jedna matryca.

Każdy początek pojazdu musi odpowiadać dokładnie jednej macierzy, czyli dokładnie jedno z pol startTags musi odpowiadać vehicleStartTag macierzy (i tylko tej macierzy).

Wszystkie macierze muszą mieć 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 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ść między 2 kolejnymi wizytami na trasie. Do tego samego przejścia może mieć zastosowanie kilka TransitionAttributes: w takim przypadku wszystkie dodatkowe koszty są sumowane, a następnie stosowany jest najbardziej restrykcyjny warunek lub limit (zgodnie z naturalną semantyką „AND”).

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

string

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

Odpowiednia wizyta w źródle lub uruchomienie pojazdu jest zgodne, 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

Odpowiednio wizyta w miejscu docelowym lub koniec podróży pasażera jest zgodny, jeśli pole VisitRequest.tags lub Vehicle.end_tags zawiera wartość dstTag lub nie zawiera wartości excludedDstTag (w zależności od tego, które z tych pól jest niepuste).

excludedDstTag

string

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

cost

number

Określa koszt wykonania tego przejścia. Jest on podawany w tych samych jednostkach co wszystkie inne koszty w modelu i nie może być ujemny. Jest 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 pokonywanej odległości podczas wykonywania tego przejścia.

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.

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

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

ShipmentTypeIncompatibility

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

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

string

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

incompatibilityMode

enum (IncompatibilityMode)

Tryb 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 dwóch przesyłek z niezgodnymi typami w trybie niezgodnoś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 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ń, w których shipmentType zależy od siebie samego, są niedozwolone.

requirementMode

enum (RequirementMode)

Tryb zastosowany do wymagań.

RequirementMode

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

Wartości w polu enum
REQUIREMENT_MODE_UNSPECIFIED Nieokreślony tryb wymagań. Ta wartość nigdy nie powinna być używana.
PERFORMED_BY_SAME_VEHICLE W tym trybie wszystkie przesyłki „zależne” muszą być przewożone tym samym pojazdem co co najmniej jedna przesyłka „wymagana”.
IN_SAME_VEHICLE_AT_PICKUP_TIME

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

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

  • „Wymagana” przesyłka tylko z dostawą dostarczona na trasie po:
  • „Wymagany” przesyłka odebrana na trasie przed „zależną” przesyłką. Jeśli „wymagany” przesyłka ma być dostarczona, dostawa musi zostać wykonana po odebraniu „zależnej” przesyłki.
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 priorytetów może dotyczyć tych samych (lub powiązanych) zdarzeń, np. „Odbiór B następuje po dostawie A” i „Odbiór C następuje po odbiorze B”.

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