Маршрут транспортного средства можно разложить по оси времени следующим образом (мы предполагаем, что имеется n посещений):
| | | | | T[2], | | |
| Transition | Visit #0 | | | V[2], | | |
| #0 | aka | T[1] | V[1] | ... | V[n-1] | T[n] |
| aka T[0] | V[0] | | | V[n-2],| | |
| | | | | T[n-1] | | |
^ ^ ^ ^ ^ ^ ^ ^
vehicle V[0].start V[0].end V[1]. V[1]. V[n]. V[n]. vehicle
start (arrival) (departure) start end start end end
Обратите внимание, что мы делаем разницу между:
- «пунктуальные события», такие как начало и конец движения транспортного средства, а также начало и конец каждого посещения (также известные как прибытие и отъезд). Они происходят в данную секунду.
- «временные интервалы», такие как сами посещения и переход между посещениями. Хотя временные интервалы иногда могут иметь нулевую длительность, т.е. начинаться и заканчиваться в одну и ту же секунду, они часто имеют положительную длительность.
Инварианты:
- Если имеется n посещений, существует n+1 переходов.
- Посещение всегда окружено переходом перед ним (тот же индекс) и переходом после него (индекс + 1).
- За запуском автомобиля всегда следует переход №0.
- Концу транспортного средства всегда предшествует переход #n.
При увеличении масштаба можно увидеть, что происходит во время Transition
и Visit
:
---+-------------------------------------+-----------------------------+-->
| TRANSITION[i] | VISIT[i] |
| | |
| * TRAVEL: the vehicle moves from | PERFORM the visit: |
| VISIT[i-1].departure_location to | |
| VISIT[i].arrival_location, which | * Spend some time: |
| takes a given travel duration | the "visit duration". |
| and distance | |
| | * Load or unload |
| * BREAKS: the driver may have | some quantities from the |
| breaks (e.g. lunch break). | vehicle: the "demand". |
| | |
| * WAIT: the driver/vehicle does | |
| nothing. This can happen for | |
| many reasons, for example when | |
| the vehicle reaches the next | |
| event's destination before the | |
| start of its time window | |
| | |
| * DELAY: *right before* the next | |
| arrival. E.g. the vehicle and/or | |
| driver spends time unloading. | |
| | |
---+-------------------------------------+-----------------------------+-->
^ ^ ^
V[i-1].end V[i].start V[i].end
Наконец, вот как можно организовать ПУТЕШЕСТВИЕ, ПЕРЕРЫВ, ЗАДЕРЖКУ и ОЖИДАНИЕ во время перехода.
- Они не пересекаются.
- ЗАДЕРЖКА уникальна и должна представлять собой непрерывный период времени непосредственно перед следующим посещением (или окончанием работы транспортного средства). Таким образом, достаточно знать длительность задержки, чтобы знать время ее начала и окончания.
- ПЕРЕРЫВЫ — это непрерывные, непересекающиеся периоды времени. В ответе указывается время начала и продолжительность каждого перерыва.
- TRAVEL и WAIT являются «вытесняемыми»: во время этого перехода их можно прерывать несколько раз. Клиенты могут предполагать, что путешествие произойдет «как можно скорее» и что оставшееся время будет заполнено «ожиданием».
(Сложный) пример:
TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
|| | | | | | | ||
|| T | B | T | | B | | D ||
|| r | r | r | W | r | W | e ||
|| a | e | a | a | e | a | l ||
|| v | a | v | i | a | i | a ||
|| e | k | e | t | k | t | y ||
|| l | | l | | | | ||
|| | | | | | | ||
--++-----------------------------------------------------------------++-->
JSON-представление |
---|
{ "vehicleIndex": integer, "vehicleLabel": string, "vehicleStartTime": string, "vehicleEndTime": string, "visits": [ { object ( |
Поля | |
---|---|
vehicleIndex | Транспортное средство, выполняющее маршрут, идентифицированное его индексом в исходном |
vehicleLabel | Метка транспортного средства, выполняющего этот маршрут, равная |
vehicleStartTime | Время, в которое транспортное средство начинает свой маршрут. Временная метка в формате RFC3339 UTC «Зулу» с наносекундным разрешением и до девяти дробных цифр. Примеры: |
vehicleEndTime | Время, в которое транспортное средство заканчивает свой маршрут. Временная метка в формате RFC3339 UTC «Зулу» с наносекундным разрешением и до девяти дробных цифр. Примеры: |
visits[] | Упорядоченная последовательность посещений, представляющая маршрут. visits[i] — i-е посещение маршрута. Если это поле пустое, автомобиль считается неиспользованным. |
transitions[] | Упорядоченный список переходов по маршруту. |
hasTrafficInfeasibilities | Если для
Прибытие в next_visit, скорее всего, произойдет позже текущего временного окна из-за увеличенной оценки времени в пути |
routePolyline | Закодированное полилинейное представление маршрута. Это поле заполняется только в том случае, если для |
breaks[] | Для транспортного средства, следующего по данному маршруту, запланированы перерывы. Последовательность |
metrics | Показатели продолжительности, расстояния и загрузки для этого маршрута. Поля |
routeCosts | Стоимость маршрута с разбивкой по полям запроса, связанным со стоимостью. Ключи — это пути прототипов относительно входных данных OptimizeToursRequest, например «model.shipments.pickups.cost», а значения — это общая стоимость, сгенерированная соответствующим полем стоимости, агрегированная по всему маршруту. Другими словами, Costs["model.shipments.pickups.cost"] — это сумма всех затрат на самовывоз по маршруту. Здесь подробно представлены все затраты, определенные в модели, за исключением затрат, связанных с TransitionAttributes, которые по состоянию на 2022/01 г. сообщаются только в агрегированном виде. |
routeTotalCost | Общая стоимость маршрута. Сумма всех затрат на карте затрат. |
Посещать
Посещение во время маршрута. Это посещение соответствует получению или доставке Shipment
.
JSON-представление |
---|
{
"shipmentIndex": integer,
"isPickup": boolean,
"visitRequestIndex": integer,
"startTime": string,
"loadDemands": {
string: {
object ( |
Поля | |
---|---|
shipmentIndex | Индекс поля |
isPickup | Если это правда, посещение соответствует получению |
visitRequestIndex | Индекс |
startTime | Время начала визита. Обратите внимание, что транспортное средство может прибыть к месту посещения раньше этого времени. Время соответствует Временная метка в формате RFC3339 UTC «Зулу» с наносекундным разрешением и до девяти дробных цифр. Примеры: |
loadDemands | Общая потребность в загрузке посещения как сумма отгрузки и запроса на посещение |
detour | Дополнительное время объезда из-за грузов, которые были посещены по маршруту до посещения, а также из-за потенциального времени ожидания, вызванного временными окнами. Если посещение является доставкой, обход рассчитывается на основе соответствующего посещения самовывоза и равен:
В противном случае оно вычисляется на основе
Продолжительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « |
shipmentLabel | Копия соответствующей |
visitLabel | Копия соответствующей метки |
Переход
Переход между двумя событиями на маршруте. См. описание ShipmentRoute
.
Если у транспортного средства нет startLocation
и/или endLocation
, соответствующие метрики путешествия равны 0.
JSON-представление |
---|
{ "travelDuration": string, "travelDistanceMeters": number, "trafficInfoUnavailable": boolean, "delayDuration": string, "breakDuration": string, "waitDuration": string, "totalDuration": string, "startTime": string, "routePolyline": { object ( |
Поля | |
---|---|
travelDuration | Продолжительность путешествия во время этого перехода. Продолжительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « |
travelDistanceMeters | Расстояние, пройденное во время перехода. |
trafficInfoUnavailable | Когда трафик запрашивается через |
delayDuration | Сумма длительности задержки, примененной к этому переходу. Если таковые имеются, задержка начинается ровно в секундах Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « |
breakDuration | Сумма длительности перерывов, происходящих во время этого перехода, если таковые имеются. Подробности о времени начала и продолжительности каждого перерыва хранятся в Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « |
waitDuration | Время, потраченное на ожидание во время этого перехода. Продолжительность ожидания соответствует времени простоя и не включает время перерыва. Также обратите внимание, что это время ожидания может быть разделено на несколько несмежных интервалов. Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « |
totalDuration | Общая продолжительность перехода указана для удобства. Оно равно:
Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « |
startTime | Время начала этого перехода. Временная метка в формате RFC3339 UTC «Зулу» с наносекундным разрешением и до девяти дробных цифр. Примеры: |
routePolyline | Закодированное полилинейное представление маршрута, пройденного во время перехода. Это поле заполняется только в том случае, если для |
routeToken | Только вывод. Непрозрачный токен, который можно передать в Navigation SDK для восстановления маршрута во время навигации и в случае изменения маршрута соблюдать исходное намерение при создании маршрута. Рассматривайте этот токен как непрозрачный объект. Не сравнивайте его значение в разных запросах, поскольку оно может измениться, даже если служба возвращает тот же маршрут. Это поле заполняется только в том случае, если для |
vehicleLoads | Транспортное средство загружается во время этого перехода для каждого типа, который либо появляется в Нагрузки при первом переходе являются стартовыми нагрузками маршрута транспортного средства. Затем после каждого посещения |
Закодированнаяполилиния
Закодированное представление ломаной линии. Дополнительную информацию о кодировании полилиний можно найти здесь: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding .
JSON-представление |
---|
{ "points": string } |
Поля | |
---|---|
points | Строка, представляющая закодированные точки полилинии. |
Перерыв
Данные, представляющие выполнение перерыва.
JSON-представление |
---|
{ "startTime": string, "duration": string } |
Поля | |
---|---|
startTime | Время начала перерыва. Временная метка в формате RFC3339 UTC «Зулу» с наносекундным разрешением и до девяти дробных цифр. Примеры: |
duration | Продолжительность перерыва. Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « |