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

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

Прежде чем начать

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

Переход — это участок маршрута, соединяющий одно место с другим.

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

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

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

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

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

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

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

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

Для этого выполните следующие шаги в запросе API оптимизации маршрута:

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

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

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

    1. VisitRequest.tags in all visit requests that use this parking spot.

    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 на время, необходимое для парковки автомобиля.

    For example, when the tag of a location is PARKING_123 and it takes 150 seconds to park the vehicle, you add the following entry to ShipmentModel.transition_attributes :

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

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

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

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

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

  1. Выберите два новых тега, которые не используются нигде в модели, например, CLEANED и ROUTE_END . Первый тег обозначает места, где транспортное средство очищается или становится чистым, а второй — конец маршрута.
  2. For each vehicle, add a new delivery-only shipment that represents the visit to a cleaning facility with the following attributes:
    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 часа (86400 секунд), чтобы запретить переход к концу маршрута из любого места, кроме объекта очистки и начала маршрута:

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

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

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

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

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

How to add a transition attribute that matches all visit requests

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

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

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

Дальнейшее чтение