Java 停用optaplanner规则

Java 停用optaplanner规则,java,optaplanner,Java,Optaplanner,我有一个优化问题,我正试图用optaplanner解决这个问题。求解算法使用一组规则。引擎使用一个对象来捕获每个规则的权重。规则的最终分数是规则的中间分数乘以权重。分数设置在每条规则的右侧。如果每个规则的权重不为零,则其左侧进行求值,然后才执行右侧。将规则的权重设置为零是停用规则的一种机制。我做了一些检查,效果很好 此机制的另一种替代方法是通过将规则从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
从解算器配置中注释掉myrule.drl比将权重设置为零提供了更好的解决方案

回答


配置xml中的SecondsPentLimit不够大,因此权重设置为0的优化在给定时间段内只执行了111个本地搜索(LS)步骤,而没有规则的优化只执行了301个LS步骤。增加SecondsPentLimit解决了这个问题

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


在任何一个步骤中,两次跑步都必须有完全相同的步骤分数和完全相同的最佳分数。如果没有,您就有一个bug,请在文档中查找可复制的潜在原因。

我已经更新了我的问题并将答案放在那里,尽管步骤分数不一样。两种优化运行10分钟,重量为零的优化执行120k LS步骤,没有规则的优化执行122k LS步骤。我想这是有道理的,因为这两个优化都是由于时间限制而中止的,而不是因为它们找到了最佳解决方案。步骤119k的分数相同吗?是的,步骤119k的分数相同