У меня нет большого опыта программирования, не говоря уже о 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>
0
unugarte 27 Мар 2013 в 16:43

1 ответ

Лучший ответ

Сначала обновитесь до 5.5.0.Final, чтобы вы могли просто использовать <changeMoveSelector/> вместо этих общих фабрик. Следуйте рецепту обновления txt.

Если проблема не исчезла, включите DEBUG для обнаружения повреждения оценки (обычно вызванного методом клонирования или хакерскими правилами оценки). OptaPlanner (= Drools Planner) 6.0 упростит написание правил оценки и значительно снизит вероятность того, что вы столкнетесь с искажением результатов.

0
Geoffrey De Smet 27 Мар 2013 в 18:20
Большое спасибо, я обновлюсь до 5.5.0.Final (в настоящее время использую 5.4.0Final), использую changeMoveSelector и сообщу вам, сработало ли это.
 – 
unugarte
27 Мар 2013 в 21:32