使用具有多个计划变量的Optaplanner 7.3.0,因此有多个(2)构造启发式阶段。以下是我的CH阶段2的样子:
<constructionHeuristic>
<queuedEntityPlacer>
<entitySelector id="taskChainEntitySelector">
<entityClass>....Task</entityClass>
</entitySelector>
<changeMoveSelector>
<entitySelector mimicSelectorRef="taskChainEntitySelector"/>
<valueSelector>
<variableName>previousTaskOrEmployee</variableName>
</valueSelector>
</changeMoveSelector>
</queuedEntityPlacer>
</constructionHeuristic>
我有814个任务,previousTaskOrEmployee是一个链式计划变量。但如果我不使用其中任何一个,这个CH阶段需要大约7-8分钟或更长时间:
1.在valueSelector中缓存(缓存:PHASE,selectionOrder:SORTED)
2. selectedCountLimit = 100
selectedCountLimit工作的原因是这个CH阶段会随着步骤创建大量移动,这是一个没有缓存/限制/过滤的简单数据:
-814init = selectedMovesCOunt:1
..
-621init = selectedMovesCOunt:300
..
-421init = selectedMovesCOunt:500
..
-221init = selectedMovesCOunt:800// increases downwards
In same cases, I've seen moves per step to be more than 50k which is crazy
我的问题:
A.在CH正常情况下通过changeMove产生如此多的步骤?
B.由于变量未初始化,因此过滤在CH中没有多大意义。那么,理想情况下应该使用selectedCountLimit吗?
C.我的第一个CH阶段不需要花费4-5秒的任何时间,因为它的实体相对较少且没有链。对于具有814个链式实体的CH阶段2,理想的时间应该是什么?
答案 0 :(得分:0)
请参阅文档部分“缩放构造启发式”。有一个m ulti-vars非笛卡尔替代,速度要快得多。如果这没有用,那就是分区搜索(仅限CH)。两者都有权衡。
同时检查您的分数计算速度是否过低(至少应高于1000 /秒)。