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