Маршрутизация транспортных средств OptaPlanner и отношения между визитами клиентов

Я использую OptaPlanner для оптимизации задачи маршрутизации транспортных средств, очень похожей на приведенный пример.

Я столкнулся со следующей проблемой и буду признателен за некоторые идеи.

Некоторые посещения клиентов связаны с другими посещениями, например:

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

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

Каждое посещение может быть на другой панели (назначено разному транспортному средству), поэтому все предоставленные селекторы ходов, скорее всего, будут предоставлять ходы, которые изменяют только одно посещение. Такие ходы, скорее всего, приведут к снижению очков из-за зависимости и никогда не будут выбраны.

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

В настоящее время я использую Tabu Search с удовлетворительными результатами. Позднее принятие может быть ответом.

Спасибо.


person Shatz    schedule 21.10.2013    source источник
comment
Привет. Как вам это удалось в итоге? У меня аналогичная проблема, когда нам требуются два ресурса для предоставления услуги. Несмотря на наличие других ресурсов, решение преодолевает жесткие ограничения.   -  person Pinakin Shah    schedule 18.07.2019


Ответы (1)


Вы описываете форму ловушка для очков. Хотя позднее принятие, вероятно, даст лучшие результаты, чем поиск табу, когда присутствует ловушка для оценки (и она просто меняет 2 строки, чтобы переключиться на нее), это все равно сильно повлияет на результаты.

Эти документы описывают 2 ответа, чтобы получить избавиться от ловушки очков:

1) Улучшение детализации функции оценки в этом случае не сработает.

2) В этом случае будут работать шаги с дискретным курсом. Например, вы можете добавить настраиваемую фабрику перемещений (но также сохранить исходные moveSelectors - или, что еще лучше, провести тест с исходными moveSelectors и без них). Позвольте фабрике настраиваемых перемещений генерировать перемещения, которые с меньшей вероятностью нарушат эти ограничения. Например: если для посещения A и B требуется одно и то же транспортное средство, переместите A внутри цепи другого транспортного средства и одновременно переместите B в другое место в цепи того же транспортного средства (повторно используйте CompositeMove).

И есть третий способ, который я скоро задокументирую (но я не думаю, что он легко применим к этому случаю):

3) В некоторых случаях можно встроить такие жесткие ограничения в диаграмму классов модели (что делает их встроенными жесткими ограничениями). Например, при планировании экзаменов, если 2 или более экзаменов должны проходить в одном временном интервале, только 1 экзамен является «ведущим» и имеет переменную временного интервала. Другие экзамены являются «стадными», что означает, что их временные интервалы корректируются теневой переменной при смене лидера.

person Geoffrey De Smet    schedule 22.10.2013
comment
Как раз того, чего я боялся, это увеличит сложность реализации и приведет к раздуванию ходов. Как вы думаете, будет ли работать декартовоProductMoveSelector селектора перемещения всех посещений с селектором перемещений зависимых посещений? - person Shatz; 22.10.2013
comment
@Shatz Технически я думаю, что вы сейчас столкнетесь с несколькими стенами, чтобы сделать это за вас cartesianProductMoveSelector, потому что вы хотите, чтобы 2 объекта были связаны (одна мимика не сработает для этого) и значения тоже. Мы думаем о поддержке этого в будущем, см. эту jira.. Между тем, проще написать свой собственный MoveListFactory (см. Документацию). - person Geoffrey De Smet; 23.10.2013
comment
Создание ходов с MoveListFactory может работать для той же зависимости от транспортного средства. Но когда дело доходит до временных зависимостей, таких как одно и то же начало или начало после финиша, когда любой переход к любому посещению до ведущего посещения или до зависимого посещения приведет к ловушке очков. Я буду тестировать с cartesianProductMoveSelector и обновлюсь снова. - person Shatz; 23.10.2013
comment
Прочтите также о мимике в документации, чтобы лучше понять cartesianProductMoveSelector. Зависимости от времени безопасные шаги с определенным курсом могут быть выполнены с помощью отдельных MoveListFactory. Затем просто смешайте все эти фабрики и changeMoveSelector. - person Geoffrey De Smet; 23.10.2013