Drools Planner Move

时间:2013-03-27 12:43:11

标签: move drools drools-planner optaplanner

我没有很多编程经验,更不用说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 个答案:

答案 0 :(得分:0)

首先升级到5.5.0.Final,这样您就可以使用<changeMoveSelector/>而不是那些通用工厂。按照升级配方txt。

如果您仍然遇到问题,请启用DEBUG以检测分数损坏(通常由克隆方法或hacky分数规则引起)。 OptaPlanner(= Drools Planner)6.0可以更容易地编写得分规则,使得你面对得分损坏的可能性大大降低。