0

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

1 回答 1

0

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

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

于 2013-03-27T14:20:09.313 回答