我没有很多编程经验,更不用说Drools了,但我正在做一个类似于车辆路线的项目。几乎所有的东西都工作得很好,除了一些移动,这取决于随机种子。
问题是,一旦启发式阶段完成,有时局部搜索阶段会做出一些奇怪的举动,比如下一步:
启发式阶段解决方案:
第一天: place 1 -> place 2 -> place 3 -> place 4 -> place 5 -> place 6天2: place 7 -> place 8 -> place 9 -> place 10
本地搜索移动:位置5移动到第2天解决方案:
第1天: place 1 -> place 2 -> place 3 -> place 4第2天: place 5 -> place 6
剩下的地方没有一天(在本例中是车辆),它们作为一个未锚定的链:
place 7 -> place 8 -> place 9 -> place 10 -> place 7 ->等
因此,当程序查找其中任何一天时,它会进入无限循环。显然,问题不是如何走出这个循环(我不是那个菜鸟),而是如何避免这些动作。
我使用与示例相同的求解器配置(更改求解器类等)。所以我不明白它为什么要做这些动作。我认为我应该编写自己的Move类,但我找不到如何编写它的示例,也找不到MoveFactory。我将solver.xml放在代码块中。
帮助我学习编写移动代码和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>发布于 2013-03-27 22:20:09
首先升级到5.5.0,这样你就可以只使用<changeMoveSelector/>而不是那些通用的工厂。遵循升级配方txt。
如果问题仍然存在,那么启用DEBUG来检测分数损坏(通常是由clone方法或hacky分数规则引起的)。OptaPlanner (= Drools Planner) 6.0将使编写分数规则变得更容易,并使您面临分数损坏的可能性大大降低。
https://stackoverflow.com/questions/15659089
复制相似问题