У меня нет большого опыта программирования, не говоря уже о Drools, но я делаю проект, похожий на маршрут маршрутизации. Почти все работает нормально, за исключением некоторых ходов, в зависимости от случайного семени.Drools Planner Move
Проблема заключается в том, что после того, как эвристическая фаза делается, иногда локальная фаза поиска делает какие-то странные движения, как следующий:
Эвристические фазы раствор:
день 1: 1 место -> место 2 -> место 3 -> место 4 -> место 5 -> место 6 день 2: место 7 -> место 8 -> место 9 -> место 10
Местный поиск: место 5 перенесено на второй день Решение:
день 1: место 1 -> место 2 -> место 3 -> место 4 день 2: место 5 -> место 6
Остальные места остались без дня (в примере это будет транспортное средство) , и они остаются как unanchored цепи:
место 7 -> место 8 -> место 9 -> место 10 -> место 7 -> и т.д.
Таким образом, когда программа ищет день любого из них он входит в бесконечный цикл. Очевидно, проблема заключается не в том, как выйти из этого цикла (я не тот noob), это как избежать этих движений.
Я использую ту же конфигурацию решателя, что и пример (изменение класса решателя и т. Д.), Поэтому я не понимаю, почему он делает эти перемещения. Я думаю, что я должен закодировать свой собственный класс Move, но я не могу найти примеры того, как его кодировать, и MoveFactory. Я оставляю файл solver.xml в блоке кода.
Полезные ссылки или советы, которые помогут мне научиться кодировать класс Move и MoveFactory, а также советы по настройке, чтобы избежать этого (если они есть).
В любом случае, спасибо вам всем за ваше время и силы.
<?xml version="1.0" encoding="UTF-8"?>
<solver>
<!--<environmentMode>DEBUG</environmentMode>-->
<environmentMode>PRODUCTION</environmentMode>
<solutionClass>org.tourgune.planificador.bean.Turista</solutionClass>
<planningEntityClass>org.tourgune.planificador.bean.PuntoInteres</planningEntityClass>
<scoreDirectorFactory>
<scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType>
<scoreDrl>/org/tourgune/planificador/core/planificadorScoreRules.drl</scoreDrl>
</scoreDirectorFactory>
<termination>
<maximumMinutesSpend>4</maximumMinutesSpend>
</termination>
<constructionHeuristic>
<constructionHeuristicType>FIRST_FIT</constructionHeuristicType>
</constructionHeuristic>
<localSearch>
<selector>
<selector>
<moveFactoryClass>org.drools.planner.core.move.generic.GenericChainedChangeMoveFactory</moveFactoryClass>
</selector>
<selector>
<moveFactoryClass>org.drools.planner.core.move.generic.GenericChainedChangePartMoveFactory</moveFactoryClass>
</selector>
<!-- TODO needs a GenericChainedSwapMoveFactory and probably even a GenericChainedSwapPartMoveFactory -->
</selector>
<acceptor>
<planningEntityTabuSize>10</planningEntityTabuSize>
</acceptor>
<forager>
<minimalAcceptedSelection>0</minimalAcceptedSelection>
</forager>
</localSearch>
<!--<localSearch>-->
<!--<selector>-->
<!--<selector>-->
<!--<moveFactoryClass>org.drools.planner.core.move.generic.GenericChainedChangeMoveFactory</moveFactoryClass>-->
<!--</selector>-->
<!--<selector>-->
<!--<moveFactoryClass>org.drools.planner.core.move.generic.GenericChainedChangePartMoveFactory</moveFactoryClass>-->
<!--</selector>-->
<!--</selector>-->
<!--<acceptor>-->
<!--<simulatedAnnealingStartingTemperature>10</simulatedAnnealingStartingTemperature>-->
<!--</acceptor>-->
<!--<forager>-->
<!--<minimalAcceptedSelection>4</minimalAcceptedSelection>-->
<!--</forager>-->
<!--</localSearch>-->
</solver>
Большое спасибо, я буду обновлять до 5.5.0.Final (в настоящее время использую 5.4.0Final) и использовать changeMoveSelector и сообщать вам, если это сработало. – unugarte