建设启发式需要很长时间

时间:2017-10-05 14:08:30

标签: java drools optaplanner drools-planner

使用具有多个计划变量的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,理想的时间应该是什么?

1 个答案:

答案 0 :(得分:0)

请参阅文档部分“缩放构造启发式”。有一个m ulti-vars非笛卡尔替代,速度要快得多。如果这没有用,那就是分区搜索(仅限CH)。两者都有权衡。

同时检查您的分数计算速度是否过低(至少应高于1000 /秒)。