Временные отрезки

Временные окна присутствуют в `ShipmentModel`, в `Shipment` в объектах получения и доставки, а также в `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:00Z
endTime:
2023-01-13T07:15:00Z
Определяет допустимое окно для начала (с 7:00 до 7:15) и окончания (с 17:00 до 17:15) работы транспортного средства.
endTimeWindows startTime:
2023-01-13T18:45:00Z
endTime:
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
    }