停用optaplanner规则

时间:2017-04-19 10:23:13

标签: java optaplanner

我有一个优化问题,我试图用optaplanner解决。解算法使用一组规则。引擎使用捕获每个规则权重的对象。规则的最终得分是规则的中间得分乘以权重。分数设置在每个规则的右侧。每条规则的左侧评估其权重是否为零,然后才执行右侧。将规则的权重设置为零是一种停用规则的机制。我已经运行了一些检查并且有效。

此机制的替代方法是通过从optaplanner解算器配置文件中完全删除规则来永久地“停用”规则。

我希望将权重置于零并删除规则会导致相同的结果,但事实并非如此。从配置文件中删除规则产生的解决方案比将权重设置为零更好。

为什么会这样? 如何在运行时停用规则?

以下是规则myrule.drl的示例:

rule "myrule"
    when
        MyWeights($weight: myRuleWeight != 0)
    then
        scoreHolder.addHardConstraintMatch(context, $weight)
end

这里是解算器配置:

<solver>
    <scoreDirectorFactory>
        <scoreDrl>myrule.drl</scoreDrl>
    </scoreDirectorFactory>
</solver>

从解算器配置中注释掉myrule.drl提供了比将权重设置为零更好的解决方案。

ANSWER

config xml中的secondsSpentLimit不够大,使得权重设置为0的优化在给定时间段内仅完成了111个本地搜索(LS)步骤,而没有规则的优化已完成301个LS步骤。增加secondsSpentLimit解决了问题

1 个答案:

答案 0 :(得分:1)

这是不可能的如果它们都运行相同数量的步骤。 打开DEBUG org.optaplanner日志记录,查看他们的竞历步数,以及分数速度。

在任何步骤中,两次跑步必须具有完全相同的步数和完全相同的最佳得分。如果没有,你有一个错误,在文档中寻找可重现的以寻找潜在的原因。