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

Временные окна присутствуют в `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
    }