【问题标题】:Deactivating optaplanner rule停用 optaplanner 规则
【发布时间】:2017-04-19 10:23:12
【问题描述】:

我有一个优化问题,我正在尝试用 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 提供了比将权重设置为零更好的解决方案。

回答

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

【问题讨论】:

    标签: java optaplanner


    【解决方案1】:

    这是不可能的,如果他们都跑了相同的步数。 org.optaplanner开启DEBUG记录,看看他们跑了多少步,以及他们的得分速度。

    在任何步骤中,两次运行都必须具有完全相同的步骤得分和完全相同的最佳得分。如果没有,您遇到了错误,请在文档中查找 reproducible 的潜在原因。

    【讨论】:

    • 我已经更新了我的问题并将答案放在那里,尽管步数不一样。两种优化都运行 10 分钟,零权重的优化执行 120k LS 步骤,而没有规则的优化 122k LS 步骤。我想这是有道理的,因为两种优化都由于时间限制而中止,而不是因为他们找到了最佳解决方案
    • 步骤 119k 的步数是否相同?
    • 是的,119k步的分数是一样的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    相关资源
    最近更新 更多