В этом руководстве показаны возможные варианты использования атрибутов перехода. Он научит вас моделировать реальные сценарии на двух примерах: включать время на парковку автомобиля в оптимизированные маршруты и обеспечивать, чтобы каждый маршрут заканчивался посещением определенного места.
Прежде чем начать
Атрибуты перехода используются для добавления специфичных для модели затрат и задержек к определенным переходам на оптимизированных маршрутах. Эти затраты и задержки добавляются к продолжительности перехода и затратам , рассчитанным на основе картографических данных на основе параметров используемого транспортного средства.
Переход — это участок маршрута, соединяющий одно место с другим.
Под местоположением понимается любая из следующих точек на маршруте транспортного средства:
- Начальная точка маршрута.
- Остановка, где осуществляется самовывоз или доставка.
- Конечная точка маршрута.
Вы определяете все атрибуты перехода для модели, добавляя их в список ShipmentModel.transition_attributes
. Каждый элемент списка определяет один набор атрибутов перехода, и он сопоставляется с переходами в маршрутах с помощью тегов начального и конечного местоположения перехода. Дополнительные сведения об атрибутах перехода см. в справочной документации по TransitionAttributes
.
Моделируйте реальные сценарии
В этом разделе показаны два небольших примера того, как реализовать реальные бизнес-ограничения с использованием атрибутов перехода.
Зарезервировать время для парковки
В этом сценарии водителю необходимо припарковать автомобиль, прежде чем он сможет посетить точку A. Местоположение B находится неподалеку, и водитель может использовать одно и то же место для парковки для обоих посещений. Если водитель посещает B сразу после A, он экономит время, поскольку ему не нужно покидать парковочное место и снова парковать автомобиль. В API оптимизации маршрута вы можете использовать атрибуты перехода, чтобы добавить дополнительное время для парковки автомобиля только тогда, когда водитель перемещается с одного места парковки на другое.
Когда вы моделируете время парковки отдельно от продолжительности посещения, вы создаете маршруты, в которых посещения, использующие одну и ту же парковку, группируются, занимают меньше времени. Вы делаете модель более точной, а также заставляете оптимизатор отдавать предпочтение маршрутам, где посещения сгруппированы.
Чтобы сделать это в запросе API оптимизации маршрута, выполните следующие действия:
Используйте
VisitRequest.duration
только в течение времени, необходимого для совершения посещения. Например, сдать посылку и собрать подпись у заказчика.Для каждого отдельного парковочного места, используемого в модели, используйте новый тег, который больше ни для чего не используется в модели, например
PARKING_123
.Добавьте этот тег к следующему:
VisitRequest.tags
во всех запросах на посещение, использующих это парковочное место.Vehicle.start_tags
, если транспортное средство начинает свой маршрут на этом месте парковки.Vehicle.end_tags
, если транспортное средство начинает движение, заканчивает свой маршрут на этом месте парковки.
Для каждого нового тега парковки добавьте запись в
ShipmentModel.transition_attributes
, которая добавляет задержку для парковки при прибытии с другого места парковки, выполнив следующие действия:Установите для
TransitionAttributes.excluded_src_tag
иTransitionAttributes.dst_tag
значениеPARKING_123
.Установите для
TransitionAttributes.delay
время, необходимое для парковки автомобиля.
Например, если тег местоположения —
PARKING_123
и парковка автомобиля занимает 150 секунд, вы добавляете следующую запись вShipmentModel.transition_attributes
:{ "excluded_src_tag": "
PARKING_123 ", "dst_tag": "PARKING_123 ", "delay": "150s" }
Обязательная уборка в конце маршрута
В этом сценарии транспортное средство необходимо очистить в конце маршрута со следующими дополнительными ограничениями:
- Очистка производится на специализированной мойке перед возвратом в автопарк. Оптимизированный маршрут использует лучшую очистительную установку в зависимости от ее местоположения, а также мест погрузки и доставки, осуществляемых транспортным средством.
- После очистки автомобиль не должен производить никаких дополнительных заборов или доставок.
- Время доезда и мойки автомобиля засчитывается в рабочее время водителя и должно укладываться в максимальную продолжительность маршрута.
Вы моделируете это требование, разрешая только маршруты, которые либо пусты, либо маршруты, последнее посещение которых связано с очистным предприятием. В API оптимизации маршрута вы делаете это, запрещая переходы к конечной точке маршрута из любого места, кроме объекта очистки или начальной точки маршрута:
- Выберите два новых тега, которые нигде в модели не используются, например
CLEANED
иROUTE_END
. Первый предназначен для мест, где транспортное средство очищается или становится чистым, а второй — для конца маршрута. - Для каждого транспортного средства добавьте новую поставку, предназначенную только для доставки, которая представляет собой посещение предприятия по уборке со следующими атрибутами:
- Каждое местонахождение очистного сооружения должно быть представлено в виде запроса на посещение доставки этой партии.
- Добавьте
CLEANED
вVisitRequest.tags
каждого запроса на посещение поставки очистительного оборудования. Он сигнализирует о том, что транспортное средство, выезжающее из этого места, чистое. Другие запросы на посещение в модели не должны использовать этот тег, чтобы при выходе из них автомобиль считался «нечистым». - Разрешите оптимизатору пропускать эту отправку, если транспортное средство не используется, установив для его
penalty_cost
небольшое число.
Для каждого автомобиля добавьте
CLEANED
вVehicle.start_tags
. Это используется для того, чтобы пометить транспортное средство как чистое перед тем, как оно выполнит какие-либо заборы или поставки, при условии, что оно было очищено в конце предыдущего рабочего дня, и позволить ему пройти от начальной точки маршрута непосредственно к конечной точке маршрута. Даже если такие маршруты на практике не встречаются, разрешение этого сценария помогает оптимизатору более эффективно искать оптимизированные маршруты.Для каждого транспортного средства добавьте
ROUTE_END
вVehicle.end_tags
.Добавьте новую запись в
ShipmentModel.transition_attributes
, которая запрещает транспортным средствам прибывать в конечную точку маршрута, если они не чистые, со следующими свойствами:Установите для
TransitionAttributes.excluded_src_tag
значениеCLEANED
.Установите для
TransitionAttributes.dst_tag
значениеROUTE_END
.Установите для
TransitionAttributes.delay
большое значение. Когда вы делаете задержку дольше максимальной продолжительности маршрута, вы фактически запрещаете оптимизатору использовать этот переход в маршруте.
Например, когда временной масштаб модели составляет один рабочий день, можно использовать задержку в 24 часа (86400 секунд), чтобы запретить переход к концу маршрута откуда угодно, кроме очистного сооружения и начала маршрута:
{ "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
тег, который не используется нигде в модели. Это будет соответствовать всем местоположениям, у которых нет этого тега, но поскольку вы намеренно выбрали тег, который не используется ни одним местоположением, эти атрибуты перехода будут соответствовать всем местоположениям.