我没有很多编程经验,更不用说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 :(得分:0)
首先升级到5.5.0.Final,这样您就可以使用<changeMoveSelector/>
而不是那些通用工厂。按照升级配方txt。
如果您仍然遇到问题,请启用DEBUG以检测分数损坏(通常由克隆方法或hacky分数规则引起)。 OptaPlanner(= Drools Planner)6.0可以更容易地编写得分规则,使得你面对得分损坏的可能性大大降低。