У меня нет большого опыта программирования, не говоря уже о Drools, но я делаю проект, похожий на проект маршрутизации транспортных средств. Почти все работает нормально, за исключением некоторых ходов, зависящих от случайного числа.
Проблема в том, что после завершения эвристической фазы иногда фаза локального поиска делает некоторые странные ходы, такие как следующий:
Решение эвристической фазы:
День 1: место 1 -> место 2 -> место 3 -> место 4 -> место 5 -> место 6 день 2: место 7 -> место 8 -> место 9 -> место 10
Перемещение местного поиска: место 5 перемещено на день 2 Решение:
День 1: место 1 -> место 2 -> место 3 -> место 4 день 2: место 5 -> место 6
Остальные места остаются без дня (в примере это транспортное средство), и они остаются незакрепленной цепочкой:
Место 7 -> место 8 -> место 9 -> место 10 -> место 7 -> и т. д.
Итак, когда программа ищет день любого из них, она входит в бесконечный цикл. Очевидно, проблема не в том, как выйти из этого цикла (я не такой нуб), а в том, как избежать этих движений.
Я использую ту же конфигурацию решателя, что и в примере (изменение класса решателя и т. Д.), Поэтому я не понимаю, почему он выполняет эти действия. Я думаю, что мне следует написать свой собственный класс 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>
1 ответ
Сначала обновитесь до 5.5.0.Final, чтобы вы могли просто использовать <changeMoveSelector/>
вместо этих общих фабрик. Следуйте рецепту обновления txt.
Если проблема не исчезла, включите DEBUG для обнаружения повреждения оценки (обычно вызванного методом клонирования или хакерскими правилами оценки). OptaPlanner (= Drools Planner) 6.0 упростит написание правил оценки и значительно снизит вероятность того, что вы столкнетесь с искажением результатов.
Похожие вопросы
Новые вопросы
move
Обычно относится к семантике перемещения; рассмотрите использование этого тега вместо этого. Семантика перемещения - это функция языка программирования, которая позволяет заменить операцию копирования более эффективным «перемещением», когда исходный объект является временным или иным устаревшим объектом.