Временные окна определяют время событий на маршруте. Это может быть начало и конец маршрута водителя, запланированное время посадки и высадки или продолжительность всего маршрута.
Временные окна могут поддерживать такие цели, как:
- Приоритет отдается получению и доставке заказов в указанные сроки.
- Планируйте маршруты с учетом часов работы.
- Убедитесь, что транспортные средства начинают и заканчивают маршруты в указанные временные рамки.
Структура
Как показано на диаграмме, временные окна структурированы следующим образом:
globalStartTimeиglobalEndTime– свойства типаShipmentModel.timeWindows– это свойства:pickupsвнутриShipment.deliveriesвнутриShipment.
startTimeWindowsиendTimeWindows– свойства типаVehicle.
Контрольный список Essentials
В контрольном списке ниже описаны основные сведения, которые помогут избежать возможных ошибок, связанных с временными окнами. Этот список поможет вам проверить запрос и устранить неполадки с ответом.
Свойства
В таблице ниже описаны свойства глобального временного окна.
| Свойство | Формат | Описание |
|---|---|---|
globalStartTime |
Timestamp |
Самое раннее время для любого события. |
globalEndTime |
Timestamp |
Самое позднее время для любого события. |
В следующей таблице описаны свойства временных окон в отправлениях и транспортных средствах.
| Родитель | Свойство | Формат | Описание |
|---|---|---|---|
Shipment.pickups |
timeWindows |
Массив типов сообщений TimeWindow. |
Указывает временные интервалы для самовывоза. |
Shipment.deliveries |
timeWindows |
Указывает временные интервалы для доставки отправления. | |
Vehicle |
startTimeWindows |
Указывает время начала работы транспортного средства. | |
endTimeWindows |
Указывает время окончания работы транспортного средства. |
В таблице ниже описаны свойства типа сообщения TimeWindow.
| Свойство | Формат | Описание |
|---|---|---|
startTime |
Строка (формат RFC3339 UTC "Zulu"). | Начало временного интервала. |
endTime |
Строка (формат RFC3339 UTC "Zulu"). | Конец временного окна. |
Примеры
В этом разделе рассматриваются три типа примеров:
- Примеры кода, иллюстрирующие структуру временных окон.
- Пример сценария, показывающий, как использовать временные окна для достижения бизнес-цели.
- Пример запроса, содержащего значения, заданные в примере сценария.
Примеры кода
В следующих разделах приведены примеры кода для разных типов временных окон.
Глобальные временные интервалы
В приведенном ниже примере кода показана структура глобальных временных окон.
{ "model": { "globalStartTime": "YYYY-MM-DDTHH:MM:SSZ", "globalEndTime": "YYYY-MM-DDTHH:MM:SSZ", "shipments": [ ... ], "vehicles": [ ... ] } }
Временные интервалы для самовывоза и доставки
В примере кода ниже показана структура временных окон для забора и доставки отправления.
{ "model": { "shipments": [ { "pickups": [ { "timeWindows": [ { "startTime": "YYYY-MM-DDTHH:MM:SSZ", "endTime": "YYYY-MM-DDTHH:MM:SSZ" } ] } ], "deliveries": [ { "timeWindows": [ { "startTime": "YYYY-MM-DDTHH:MM:SSZ", "endTime": "YYYY-MM-DDTHH:MM:SSZ" } ] } ] } ], "vehicles": [ ... ] } }
Временные окна транспортных средств
В следующем примере кода показана структура временных окон транспортного средства:
{ "model": { "shipments": [ ... ], "vehicles": [ { "startTimeWindows": [ { "startTime": "YYYY-MM-DDTHH:MM:SSZ", "endTime": "YYYY-MM-DDTHH:MM:SSZ" } ], "endTimeWindows": [ { "startTime": "YYYY-MM-DDTHH:MM:SSZ", "endTime": "YYYY-MM-DDTHH:MM:SSZ" } ] } ] } }
Пример
В этом разделе в качестве примера используется компания, которая предлагает услуги по уходу за собаками. В примере оптимизируются маршруты для того, чтобы забрать и высадить собак из двух разных домов, а у владельцев одинаковые временные окна для посадки и высадки. Оптимизатор должен учитывать часы работы детского сада, конкретные окна посадки и высадки клиентов, а также рабочее время водителя.
В этом примере значения свойств в запросе следующие:
| Родитель | Свойство | Значение | Сценарий |
|---|---|---|---|
ShipmentModel |
globalStartTime |
2023-01-13T07:00:00Z |
Время открытия передержки для собак. Забирать и доставлять заказы до этого времени нельзя. |
ShipmentModel |
globalEndTime |
2023-01-13T19:00:00Z |
Время закрытия передержки для собак. К этому времени все заказы должны быть получены и доставлены. |
Shipment.pickups |
timeWindows |
startTime:2023-01-13T07:30:00Z |
Определяет приемлемое окно для того, чтобы забрать собаку из дома клиента. В этом примере вы сообщили обоим клиентам, что заберете их между 7:30 и 9:00. |
endTime:2023-01-13T09:00:00Z |
|||
Shipment.deliveries |
timeWindows |
startTime:2023-01-13T17:00:00Z |
Определяет приемлемое окно для высадки собаки у клиента дома. В этом примере вы сказали обоим клиентам, что их собаки будут высажены между 17:00 и 18:30. |
endTime:2023-01-13T18:30:00Z |
|||
Vehicle |
startTimeWindows |
startTime:2023-01-13T07:00:00ZendTime:2023-01-13T07:15:00Z |
Определяет допустимое окно для начала (с 7:00 до 7:15) и окончания (с 17:00 до 17:15) работы транспортного средства. |
endTimeWindows |
startTime:2023-01-13T18:45:00ZendTime:2023-01-13T19:00:00Z |
На следующей диаграмме показаны временные окна, влияющие на этот маршрут.
В этом сценарии, как показано на диаграмме, временные окна работают следующим образом:
- Глобальное временное окно представляет собой часы работы передержки, и все остальные временные окна должны находиться внутри этого временного окна.
- У забора и доставки есть свои
timeWindowsв начале и конце дня соответственно. startTimeWindowsуказывают временные рамки, в которые оператор должен начать работу, аendTimeWindows– временные рамки, в которые он должен закончить работу.- Время начала первого
startTimeWindowи время окончания последнегоendTimeWindowопределяют часы работы транспортного средства, которые в данном случае совпадают с глобальным временным окном.
Пример запроса
В примере ниже показана структура запроса optimizeTours, в котором используются значения временных окон из примера сценария.
{ "model": { "globalStartTime": "2023-01-13T07:00:00Z", "globalEndTime": "2023-01-13T19:00:00Z", "shipments": [ { "pickups": [ { "arrivalLocation": { "latitude": 37.8024, "longitude": -122.4058 }, "timeWindows": [ { "startTime": "2023-01-13T07:30:00Z", "endTime": "2023-01-13T09:00:00Z" } ] } ], "deliveries": [ { "arrivalLocation": { "latitude": 37.759773, "longitude": -122.427063 }, "timeWindows": [ { "startTime": "2023-01-13T17:00:00Z", "endTime": "2023-01-13T18:30:00Z" } ] } ] }, { "pickups": [ { "arrivalLocation": { "latitude": 37.7359, "longitude": -122.5011 }, "timeWindows": [ { "startTime": "2023-01-13T07:30:00Z", "endTime": "2023-01-13T09:00:00Z" } ] } ], "deliveries": [ { "arrivalLocation": { "latitude": 37.759773, "longitude": -122.427063 }, "timeWindows": [ { "startTime": "2023-01-13T17:00:00Z", "endTime": "2023-01-13T18:30:00Z" } ] } ] } ], "vehicles": [ { "startLocation": { "latitude": 37.759773, "longitude": -122.427063 }, "endLocation": { "latitude": 37.759773, "longitude": -122.427063 }, "costPerHour": 27, "startTimeWindows": [ { "startTime": "2023-01-13T07:00:00Z", "endTime": "2023-01-13T07:15:00Z" } ], "endTimeWindows": [ { "startTime": "2023-01-13T18:45:00Z", "endTime": "2023-01-13T19:00:00Z" } ] } ] } }
Мягкие временные интервалы
Временные окна можно использовать в качестве мягких ограничений, определив softStartTime и softEndTime в типе сообщения TimeWindow. Это позволяет оптимизатору отклоняться от указанного временного окна за определенную стоимость, отдавая приоритет общей оптимизации, а не строгому соблюдению временных рамок, когда это выгодно.
Для мягких временных окон действуют следующие ограничения:
- Они не могут быть применены к
globalStartTimeиglobalEndTime, поскольку в них не используется тип сообщенияTimeWindow. - Они применяются, только если в списке есть один элемент
TimeWindow.
Свойства
В таблице ниже описаны свойства мягких ограничений для временных окон.
| Название свойства | Формат | Описание ресурса |
|---|---|---|
softStartTime |
Временная метка | Указывает начало мягкого временного окна. Если событие происходит до этого времени, взимается плата. |
softEndTime |
Временная метка | Указывает конец мягкого временного окна. Если событие происходит после этого времени, взимается плата. |
costPerHourBeforeSoftStartTime |
число | Стоимость часа, если мероприятие начинается до softStartTime. Это свойство обязательно при использовании softStartTime. Подробнее о том, как реализовать расходы, читайте в статье Модель расходов. |
costPerHourAfterSoftEndTime |
число | Цена за час, которая взимается, если мероприятие заканчивается после softEndTime. Это свойство обязательно, если используется тип softEndTime. Подробнее о том, как реализовать расходы, читайте в статье Модель расходов. |
Пример кода
В примере ниже показана структура свойств мягкого ограничения для типа сообщения TimeWindow.
{ "softStartTime": "SOFT_START_TIME", "softEndTime": "SOFT_END_TIME", "costPerHourBeforeSoftStartTime": COST_BEFORE_START_TIME, "costPerHourAfterSoftEndTime": COST_AFTER_END_TIME }