В этом руководстве показаны возможные варианты использования атрибутов перехода. Оно научит вас моделировать реальные сценарии на двух примерах: включение времени на парковку автомобиля в оптимизированные маршруты и обеспечение того, чтобы каждый маршрут заканчивался посещением определенного места.
Прежде чем начать
Атрибуты перехода используются для добавления затрат и задержек, специфичных для модели, к определенным переходам в оптимизированных маршрутах. Эти затраты и задержки добавляются поверх продолжительности и затрат перехода, рассчитанных на основе данных карты на основе параметров используемого транспортного средства.
Переход — это участок маршрута, соединяющий одно место с другим.
Местоположение относится к любой из следующих точек на маршруте транспортного средства:
- Начальная точка маршрута.
- Остановка, где осуществляется забор или доставка товара.
- Конечная точка маршрута.
Вы определяете все атрибуты перехода для модели, добавляя их в список 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
на тег, который не используется нигде в модели. Это сопоставит все местоположения, у которых нет этого тега, но поскольку вы намеренно выбрали тег, который не используется ни одним местоположением, эти атрибуты перехода будут соответствовать всем местоположениям.