Моделирование бизнес-логики с помощью атрибутов перехода

В этом руководстве показаны возможные варианты использования атрибутов перехода. Вы узнаете, как моделировать реальные сценарии на двух примерах: включение времени на парковку транспортного средства в оптимизированные маршруты и обеспечение того, чтобы каждый маршрут заканчивался посещением определенного места.

Подготовка

Атрибуты перехода позволяют добавлять в оптимизированные маршруты расходы и задержки, связанные с определенными переходами. Эти расходы и задержки добавляются к длительности и стоимости переходов, рассчитанным на основе данных карты и параметров используемого транспортного средства.

Переход – это сегмент маршрута, соединяющий одно местоположение со следующим.

Местоположение – это любая из следующих точек на маршруте транспортного средства:

  • Начальная точка маршрута.
  • Остановка, на которой забирают или доставляют груз.
  • Конечная точка маршрута.

Все атрибуты перехода для модели определяются путем их добавления в список ShipmentModel.transition_attributes. Каждый элемент списка определяет один набор атрибутов перехода и сопоставляется с переходами в маршрутах с помощью тегов в начальном и конечном местоположении перехода. Дополнительную информацию об атрибутах перехода можно найти в справочной документации по TransitionAttributes.

Моделирование реальных сценариев

В этом разделе приведены два небольших примера того, как реализовать реальный бизнес. ограничения с использованием атрибутов перехода.

Зарезервируйте время для парковки

В этом сценарии водителю нужно припарковать автомобиль, прежде чем он сможет посетить местоположение А. Местоположение B находится поблизости, и водитель может использовать одно и то же парковочное место для обоих посещений. Если водитель посетит пункт Б сразу после пункта А, он сэкономит время, потому что ему не придется выезжать с парковки и снова парковать автомобиль. В Route Optimization API можно использовать атрибуты перехода, чтобы добавить дополнительное время на парковку автомобиля, только когда водитель переезжает с одного парковочного места на другое.

Если вы моделируете время парковки отдельно от продолжительности посещений, вы можете сократить время маршрутов, в которых посещения с одной и той же парковкой сгруппированы. Вы делаете модель более точной, а также заставляете оптимизатор предпочитать маршруты, на которых посещения сгруппированы.

Чтобы сделать это в запросе Route Optimization API, выполните следующие действия:

  1. Используйте VisitRequest.duration только на время посещения. Например, передать посылку и получить подпись клиента.

  2. Для каждого парковочного места, используемого в модели, используйте новый тег, который не используется ни для чего другого в модели, например PARKING_123.

  3. Добавьте этот тег в следующие элементы:

    1. VisitRequest.tags во всех запросах на посещение, в которых используется это парковочное место.

    2. Vehicle.start_tags, если транспортное средство начинает маршрут с этого парковочного места.

    3. Vehicle.end_tags, если маршрут транспортного средства начинается или заканчивается на этой парковке.

  4. Для каждого нового тега парковки добавьте запись в ShipmentModel.transition_attributes, которая увеличивает время парковки при переходе с другого парковочного места. Для этого выполните следующие действия:

    1. Присвойте свойствам TransitionAttributes.excluded_src_tag и TransitionAttributes.dst_tag значение PARKING_123.

    2. Задайте для параметра TransitionAttributes.delay время, необходимое для парковки автомобиля.

    Например, если тег местоположения – PARKING_123, а парковка занимает 150 секунд, добавьте в ShipmentModel.transition_attributes следующую запись:

    {
      "excluded_src_tag": "PARKING_123",
      "dst_tag": "PARKING_123",
      "delay": "150s"
    }
    

Обязательная уборка в конце маршрута

В этом сценарии транспортное средство необходимо очистить в конце маршрута со следующими дополнительными ограничениями:

  • Уборка проводится в специализированном помещении, после чего автомобиль возвращается в депо. Оптимизированный маршрут использует лучшую мойку на основе ее местоположения и местоположений пунктов погрузки и доставки, сделанных транспортным средством.
  • После уборки транспортное средство не должно выполнять никаких дополнительных погрузок или доставок.
  • Время, необходимое на поездку и мойку, учитывается в рабочих часах водителя и должно укладываться в максимальную продолжительность маршрута.

Вы моделируете это требование, разрешая только те маршруты, которые либо пусты, либо последнее посещение которых приходится на клининговую компанию. В Route Optimization API это можно сделать, запретив переходы к конечной путевой точке маршрута из любого места, кроме пункта очистки или начальной точки маршрута:

  1. Выберите два новых тега, которые не используются в модели, например CLEANED и ROUTE_END. Первый – для мест, где транспортное средство чистое или становится чистым, а второй – для конца маршрута.
  2. Для каждого транспортного средства добавьте новую доставку, которая представляет собой посещение мойки, со следующими атрибутами:
    1. Каждое местоположение клининговой компании должно быть представлено как запрос на посещение для доставки этой перевозки.
    2. Добавьте CLEANED в VisitRequest.tags каждого запроса на посещение для доставки на мойку. Это означает, что транспортное средство, покидающее это место, чистое. Другие запросы на посещение в модели не должны использовать этот тег, чтобы транспортное средство считалось "не чистым" при выезде из них.
    3. Разрешите оптимизатору пропускать эту доставку, если транспортное средство не используется, установив для него небольшое значение penalty_cost.
  3. Для каждого автомобиля добавьте CLEANED в Vehicle.start_tags. Это используется для того, чтобы пометить транспортное средство как чистое до того, как оно выполнит какие-либо погрузки или доставки, при условии, что оно было очищено в конце предыдущего рабочего дня, и позволить ему двигаться от начальной путевой точки непосредственно к конечной путевой точке. Даже если такие маршруты не используются на практике, разрешение этого сценария помогает оптимизатору более эффективно искать оптимизированные маршруты.

  4. Для каждого автомобиля добавьте ROUTE_END в Vehicle.end_tags.

  5. Добавьте в ShipmentModel.transition_attributes новую запись, которая запрещает автомобилям прибывать в конечную путевую точку, если они не чистые. Укажите следующие свойства:

    1. Присвойте свойству TransitionAttributes.excluded_src_tag значение CLEANED.

    2. Присвойте свойству TransitionAttributes.dst_tag значение ROUTE_END.

    3. Задайте для параметра TransitionAttributes.delay большое значение. Если вы установите задержку, превышающую максимальную продолжительность маршрута, то оптимизатор не сможет использовать этот переход в маршруте.

    Например, если временной масштаб модели составляет один рабочий день, вы можете использовать задержку в 24 часа (86 400 секунд), чтобы запретить переход к концу маршрута из любого места, кроме пункта очистки и начала маршрута:

    {
      "excluded_src_tag": "CLEANED",
      "dst_tag": "ROUTE_END",
      "delay": "86400s"
    }
    

Как выбрать между задержками и расходами

Выбор между задержками и затратами зависит от характера реализованной бизнес-логики и ограничений. Настройка TransitionAttributes.delay лучше всего подходит для реализации жестких ограничений или для выражения компромисса с точки зрения затраченного времени. TransitionAttributes.cost лучше подходит для реализации мягких предпочтений или компромиссов, выраженных в виде дополнительных затрат. Вы можете произвольно комбинировать задержки и расходы, когда учитываются и время, и стоимость.

В примере с мойкой автомобиля используется очень большая задержка, поскольку мойка автомобиля в конце маршрута является жестким требованием, а большая задержка не позволяет оптимизатору игнорировать это требование. Если вы зададите только стоимость, оптимизатор может пропустить очистку, если найдет способ компенсировать стоимость в другом месте, например, доставив больше грузов за время, "сэкономленное" за счет отказа от очистки автомобиля.

В примере с парковкой используется небольшая задержка, которая соответствует дополнительному времени, необходимому для парковки автомобиля. Вы также можете использовать расходы в сочетании с задержками, если водитель останавливается на платной парковке.

Как добавить атрибут перехода, который соответствует всем запросам посещений

В приведенных выше примерах используются атрибуты перехода, которые соответствуют местоположениям с заданным тегом или местоположениям, у которых нет тега. Но что, если вам нужно добавить атрибуты перехода, которые применяются ко всем переходам?

Просто удалить теги нельзя, поскольку каждое сообщение TransitionAttributes должно содержать один из тегов TransitionAttributes.src_tag и TransitionAttributes.excluded_src_tag, а также один из тегов TransitionAttributes.dst_tag и TransitionAttributes.excluded_dst_tag.

Однако вы можете сопоставить все теги, задав для TransitionAttributes.excluded_src_tag или TransitionAttributes.excluded_dst_tag тег, который не используется в модели. В результате будут выбраны все местоположения, у которых нет этого тега. Поскольку вы намеренно выбрали тег, который не используется ни в одном местоположении, эти атрибуты перехода будут соответствовать всем местоположениям.

Дополнительные сведения