java - 停用 optaplanner 规则

标签 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 提供了比将权重设置为零更好的解决方案。

回答

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

最佳答案

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

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

关于java - 停用 optaplanner 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43492946/

相关文章:

java - Optaplanner 项目的非法参数异常,解算器配置在类加载器中不作为类路径资源存在

java - 对称 AES 加密和解密在任何 Java 版本上返回相同的值并支持 Java 6,且无需使用任何外部库

java - 使用 Java 和 XMLType 将 XML 数据作为关系数据存储到 Oracle 表中

java - 如何生成包含涵盖代码中每个方法的测试用例列表的报告?

java - Solaris 上的 OptaPlanner 比 Linux 操作系统上慢 5 倍

java - PlanningEntities 分布在多个集合中

java - ArrayList重复

使用 lambdas/方法引用的 java 8 事件监听器/调度程序 - 如何实现某些事情?

java - Optaplanner CVRP - 容量可行(过约束优化)

optaplanner - 如何开始使用 Optaplanner