繁体   English   中英

在 Drools planner 的工作内存中设置全局变量

[英]Setting global variables in working memory in Drools planner

如何在 drools planner 的求解器中向工作内存添加全局变量,以便能够在分数流口水中使用。 这类似于https://issues.jboss.org/browse/JBRULES-2700但找不到解决方案。

您可能正在寻找的是@ProblemFactProperty 文档中引用:

这些[注释]方法返回的所有对象都将插入到 ConstraintStreams 或 Drools 会话中,因此约束流或评分规则可以访问它们。

用我自己的话来说:您可以在@PlanningSolution类中保存对全局对象的引用。 如果你用@ProblemFactProperty注释它的getter ,你可以从你的 drools 文件中访问它。

首先是一些说教:使用服务(设置为全局)来计算分数的一部分将破坏基于增量的分数计算(阅读有关该主题的手册部分),导致每秒的分数计算要少得多(比如 50 而不是 5000第二大数据集)。

然后是 HACK 解决方案:在 StartingSolutionInitializer(很快称为 CustomSolverPhaseCommand)中执行solverScope.getWorkingMemory().setGlobal("key", value)

然后是一个真正的、长期的解决方案:你能说明为什么你需要能够做到这一点吗? 我们可以考虑使用诸如可选的WorkingMemoryPreperator类的东西来添加对此的支持。

设置规划问题后:

solver.setPlanningProblem(planningProblem);

您可以通过 solutionDirector(HACK) 访问workingMemory:

DefaultSolutionDirector solutionDirector = ((DefaultSolver)solver).getSolverScope().getSolutionDirector();
solutionDirector.getWorkingMemory().setGlobal("list", new ArrayList<String>());

干杯!

如果你需要在规划器规则中使用一些辅助方法,请尝试我在我的项目中使用的以下方法:

  1. 创建一个包含辅助方法的实用程序类。
  2. 在规则文件中导入实用程序类,就像在 java 类中导入它一样。
  3. 在规则中使用辅助方法。 如果要在条件中使用辅助方法,请使用 eval() 进行包装。 如果要在 then 部分使用辅助方法,只需将其用作普通的 java 方法调用即可。

例如,假设您有一个名为 PlanningUtil 的实用程序类,如下所示:

public class PlanningUtil {
  public boolean isGood() {return true;}

  public void doSomething() {//...}
}

然后在规则文件中导入实用程序类,

import PlanningUtil;

使用规则中的效用方法

rule "MyRule"
  when
    eval(PlanningUtil.isGood())
  then
    PlanningUtil.doSomething(); // note the ';' is a must. 
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM