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łowe ż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 czasu UTC (czyli sekundy: 0, nanosekund: 0).

Używa standardu RFC 3339, w którym wygenerowany wynik jest zawsze znormalizowany według normy Z i zawiera 0, 3, 6 lub 9 cyfr ułamkowych. Akceptowane są też przesunięcia inne niż „Z”. Przykłady: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" lub "2014-10-02T15:01:23+05:30".

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

Używa standardu RFC 3339, w którym wygenerowany wynik jest zawsze znormalizowany według normy Z i zawiera 0, 3, 6 lub 9 cyfr ułamkowych. Akceptowane są też przesunięcia inne niż „Z”. Przykłady: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" lub "2014-10-02T15:01:23+05:30".

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 odległości geodezyjne, w zależności od wartości pola useGeodesicDistances. Jeśli pole nie jest puste, wartość useGeodesicDistances nie może być Prawda, a pole durationDistanceMatrixSrcTags ani durationDistanceMatrixDstTags nie może być puste.

Przykłady użycia:

  • Istnieją 2 lokalizacje: locA i locB.
  • 1 pojazd zaczynający trasę w miejscu locA i kończący ją 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 trasę w miejscu locB i kończący ją w miejscu 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 macierz „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ą wartościom 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 wizyt z tagiem durationDistanceMatrixSrcTags(j) do wizyt z tagiem durationDistanceMatrixDstTags(k) w macierz i.

Tagi odpowiadają wartościom 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 atrybuty przejścia do modelu.

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.

WAŻNE: stosowanie reguł pierwszeństwa ogranicza rozmiar problemu, który można optymalizować. Żądania korzystające z reguł pierwszeństwa, które obejmują wiele przesyłek, mogą zostać odrzucone.

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ć liczbę wolnych miejsc), a następnie odwiedzić jedną z lokalizacji dostawy (i odpowiednio zwiększyć liczbę 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żna w nim używać znaków 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, najlepiej z uwzględnieniem jednostek. 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 danym 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, nie może być ujemny, a przesyłka musi zawierać co najmniej odbiór i dostawę.

Niech na przykład t będzie najkrótszym czasem potrzebnym na przejazd z wybranego miejsca odbioru 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 pojazdu.

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, nie może być ujemny, 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 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 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ż 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ślono tej kary, jest ona uważana za nieskończoną, co oznacza, że dostawa musi zostać zrealizowana.

pickupToDeliveryRelativeDetourLimit

number

Określa maksymalny czas dojazdu do miejsca docelowego w porównaniu z najkrótszą ścieżką od miejsca odbioru do miejsca docelowego. Jeśli jest podany, nie może być ujemny, a przesyłka musi zawierać co najmniej odbiór i dostawę.

Niech na przykład t będzie najkrótszym czasem potrzebnym na przejazd z wybranego miejsca odbioru 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 pojazdu.

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 czasowej, nie można podać 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 można podać parametru arrivalWaypoint.

departureLocation

object (LatLng)

Miejsce docelowe, w którym pojazd ma się zatrzymać 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 można podać 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 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 TimeWindow oznacza, że pojazd może wykonać tę wizytę w dowolnym momencie.

Okresy czasu muszą być niepokrywające się, czyli żaden z nich nie może się pokrywać z innym ani być sąsiadować z innym. Muszą być uporządkowane w kolejności rosnącej.

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żesz go użyć, aby zapłacić różne koszty 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. Jest to pole podobne do pola Shipment.load_demands, z tym że ma zastosowanie tylko do tego elementu VisitRequest, a nie 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 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, która reprezentuje 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 [-180,0, +180,0].

Punkt pośredni

Zawiera punkt orientacyjny. 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 drogowego ma być preferowaną lokalizacją dla zatrzymania pojazdu po określonej stronie drogi. Po ustawieniu tej wartości trasa będzie przebiegać przez lokalizację, aby pojazd mógł się zatrzymać po stronie drogi, w której znajduje się lokalizacja, z dala od środka drogi. 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.

Jeśli używasz identyfikatora miejsca, aby określić miejsce przyjazdu lub wyjazdu w ramach żądania wizyty, użyj identyfikatora miejsca, który jest wystarczająco szczegółowy, aby określić współrzędne LatLng na potrzeby nawigacji do tego miejsca. Na przykład identyfikator miejsca reprezentujący budynek jest odpowiedni, ale identyfikator miejsca reprezentujący drogę nie jest zalecany.

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ą się wahać od 0 do 360, gdzie 0 to kierunek na północ, 90 to kierunek na wschód itd.

TimeWindow

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

Sztywne granice przedziału czasowego startTimeendTime narzucają najwcześniejszy i najpóźniejszy czas zdarzenia, tak aby startTime <= event_time <= endTime. Dolna granica okna czasu softStartTime wyraża preferencję, aby zdarzenie miało miejsce w czasie lub po czasie softStartTime, przy czym koszt jest proporcjonalny do czasu, jaki upływa od softStartTime do wystąpienia zdarzenia. 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. Jeśli nie podasz żadnej wartości, zostanie użyta wartość ShipmentModel.global_start_time.

Używa standardu RFC 3339, w którym wygenerowany wynik jest zawsze znormalizowany według normy Z i zawiera 0, 3, 6 lub 9 cyfr ułamkowych. Akceptowane są też przesunięcia inne niż „Z”. Przykłady: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" lub "2014-10-02T15:01:23+05:30".

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.

Używa standardu RFC 3339, w którym wygenerowany wynik jest zawsze znormalizowany według normy Z i zawiera 0, 3, 6 lub 9 cyfr ułamkowych. Akceptowane są też przesunięcia inne niż „Z”. Przykłady: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" lub "2014-10-02T15:01:23+05:30".

softStartTime

string (Timestamp format)

Czas rozpoczęcia przedziału czasu (miękki).

Używa standardu RFC 3339, w którym wygenerowany wynik jest zawsze znormalizowany według normy Z i zawiera 0, 3, 6 lub 9 cyfr ułamkowych. Akceptowane są też przesunięcia inne niż „Z”. Przykłady: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" lub "2014-10-02T15:01:23+05:30".

softEndTime

string (Timestamp format)

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

Używa standardu RFC 3339, w którym wygenerowany wynik jest zawsze znormalizowany według normy Z i zawiera 0, 3, 6 lub 9 cyfr ułamkowych. Akceptowane są też przesunięcia inne niż „Z”. Przykłady: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" lub "2014-10-02T15:01:23+05:30".

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 problemie 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żna w nim używać znaków 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 kontrolny reprezentujący lokalizację geograficzną, w której pojazd rozpoczyna odbiór 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 używać.

endTags[]

string

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

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

startTimeWindows[]

object (TimeWindow)

Okna czasowe, w których pojazd może opuścić lokalizację początkową. Muszą mieścić się w globalnych limitach czasowych (patrz pola ShipmentModel.global_*). Jeśli nie określisz tu żadnej wartości, nie będzie limitów poza tymi globalnymi limitami czasowymi.

Przedziały czasu należące do tego samego powtarzającego się pola muszą być rozłączne, 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 występuje 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 z miejsca początkowego do miejsca docelowego.

W przeciwnym razie pojazd nie przemieszcza się z punktu początkowego do końcowego i nie ma dla niego zaplanowanego breakRule ani opóźnienia (od TransitionAttributes). W takim przypadku ShipmentRoute pojazdu nie zawiera żadnych informacji oprócz indeksu i etykiety 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 trwania. 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, wartość usedIfRouteIsEmpty musi być ustawiona na fałsz, a pojazd pozostanie nieużywany.

Jeśli przesyłka jest realizowana przez pojazd ignorowany w 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 równa 1,0.

OSTRZEŻENIE: czasy przelotu 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 trybów podróży interfejsu API Route na platformie Google Maps (patrz: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteTravelMode).

Uwaga: WALKINGtrasy są w wersji beta i czasami mogą nie uwzględniać chodników czy ścieżek dla pieszych. Musisz wyświetlać to ostrzeżenie użytkownikowi w przypadku wszystkich tras pieszych wyświetlanych w aplikacji.

Wartości w polu enum
TRAVEL_MODE_UNSPECIFIED Nieokreślony środek transportu, czyli DRIVING.
DRIVING Tryb podróży odpowiadający wskazówkom dojazdu (samochód, ...).
WALKING Tryb podróży odpowiadający wskazówkom dojazdu pieszo.

RouteModifiers

Zawiera zestaw opcjonalnych warunków, które należy spełnić podczas obliczania tras pojazdów. Jest to podobne do RouteModifiers w interfejsie API Preferowane trasy platformy Mapy Google. Zapoznaj się z tą stroną: 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 w pomieszczeniach. 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 kara za koszty (tylko raz na pojazd): (load - softMaxLoad) * costPerUnitAboveSoftMax. Wszystkie koszty są sumowane i muszą być wyrażone w tych samych jednostkach 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)

Maksymalna dopuszczalna 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ć 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)

Maksymalne dopuszczalne obciążenie. 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)

Stały limit ograniczający czas trwania do maxDuration.

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

softMaxDuration

string (Duration format)

miękki limit, który nie narzuca maksymalnego czasu trwania, ale w przypadku jego przekroczenia 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 naruszenia 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 niż 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ę, który jest naliczany, jeśli przekroczysz 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 przebyć. 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 sumuje się z innymi kosztami zdefiniowanymi 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.

Ten koszt nie jest obsługiwany 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 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 (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)

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

Używa standardu RFC 3339, w którym wygenerowany wynik jest zawsze znormalizowany według normy Z i zawiera 0, 3, 6 lub 9 cyfr ułamkowych. Akceptowane są też przesunięcia inne niż „Z”. Przykłady: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" lub "2014-10-02T15:01:23+05:30".

latestStartTime

string (Timestamp format)

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

Używa standardu RFC 3339, w którym wygenerowany wynik jest zawsze znormalizowany według normy Z i zawiera 0, 3, 6 lub 9 cyfr ułamkowych. Akceptowane są też przesunięcia inne niż „Z”. Przykłady: "2014-10-02T15:01:23Z", "2014-10-02T15:01:23.045123456Z" lub "2014-10-02T15:01:23+05:30".

minDuration

string (Duration format)

Wymagany. 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 12 godzin musi być co najmniej 1 przerwa trwająca co najmniej 1 godzinę”, przykład ten przetłumaczylibyśmy w ten sposób: FrequencyConstraint:

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

Czas i długość przerw w rozwiązaniu będą uwzględniać wszystkie te ograniczenia, a także okna czasowe i minimalne długości przerw określone w BreakRequest.

FrequencyConstraint może w praktyce dotyczyć przerw nieciągłych. Na przykład w ramach harmonogramu „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)

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

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

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

excludedSrcTag

string

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

dstTag

string

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

excludedDstTag

string

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

cost

number

Określa koszt wykonania tego przejścia. Jest on podawany w tych samych jednostkach co wszystkie inne koszty w modelu i nie może być ujemny. Jest 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 przesyłki 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. 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ć co najmniej jedną „wymagającą” przesyłkę w pojeździe w momencie odbioru.

Odbiór „zależnej” przesyłki musi 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

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