我正在学习OptaPlanner库。 我非常简单的测试看起来效果很好。 如我在XML配置中指定的那样,计划运行在20秒后终止。
然后我添加
<constructionHeuristic>
<constructionHeuristicType>FIRST_FIT_DECREASING</constructionHeuristicType>
</constructionHeuristic>
并且计划几乎立即终止,结果非常糟糕,甚至打破了严格的限制。
在manual我看到:
构造启发式自动终止,因此通常没有 需要在构造启发阶段配置终止 具体
这与整个计划运行有关吗?如果是,那为什么需要终止?我认为建构的目的是建立良好的初始起始位置然后开始计划。但事实并非如此。
我错过了什么吗?提前终止可能是什么原因?
答案 0 :(得分:1)
优化算法配置是可选的。这意味着如果你没有<constructionHeuristic>
而没有<localSearch>
,OptaPlanner将使用合理的默认配置(恰好包含一个构造启发阶段和一个本地搜索阶段。这就是规划运行并给出结果的原因在没有配置算法(阶段)的简单测试中。
当您自己添加<constructionHeuristic>
时,OptaPlanner不再使用默认配置。此时,您已配置单个构造启发式阶段,该阶段运行First Fit Decreasing算法。当它终止计划结束时,因为没有其他阶段可以继续。
自动构造启发式终止意味着一旦所有实体的计划变量被初始化,该阶段就会终止。因此,您不必为此阶段配置<termination>
。
您现在需要做的是在<localSearch>
阶段之后添加<constructionHeuristic>
阶段,并从一个本地搜索算法的一些基本配置开始,例如Hill Climbing。有关配置示例,请参阅本地搜索章节。
例如:
<?xml version="1.0" encoding="UTF-8"?>
<solver>
<!-- Define the model -->
<scanAnnotatedClasses/>
<!-- Define the score function -->
<scoreDirectorFactory>
...
</scoreDirectorFactory>
<!-- Configure solver (global) termination -->
<termination>
<secondsSpentLimit>20</secondsSpentLimit>
</termination>
<!-- Configure the optimization algorithms (optional) -->
<constructionHeuristic>
<constructionHeuristicType>FIRST_FIT_DECREASING</constructionHeuristicType>
</constructionHeuristic>
<localSearch>
<localSearchType>HILL_CLIMBING</localSearchType>
<acceptor>
<acceptorType>HILL_CLIMBING</acceptorType>
</acceptor>
<forager>
<acceptedCountLimit>1</acceptedCountLimit>
</forager>
<!-- You can also configure phase termination -->
<termination>
<stepCountLimit>100</stepCountLimit>
</termination>
</localSearch>
</solver>