在Drools规划器中设置工作内存中的全局变量

时间:2011-07-28 07:05:21

标签: drools drools-planner

如何在drools planner的求解器中将全局变量添加到工作记忆中,以便能够在得分流口水中使用。这与https://issues.jboss.org/browse/JBRULES-2700类似,但无法找到解决方案。

4 个答案:

答案 0 :(得分:2)

您可能正在寻找的是@ProblemFactProperty。 引用documentation

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

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

答案 1 :(得分:1)

首先讲一些:使用服务(设置为全局)来计算得分的一部分将打破基于delta的得分计算(阅读该主题的手册部分),导致得分低得多每秒计算(比如大数据集上每秒50次而不是5000次)。

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

然后是一个真实的,长期的解决方案:你能激励你为什么需要这样做吗?我们可以考虑使用可选的WorkingMemoryPreperator添加对此的支持。

答案 2 :(得分:1)

设置planningProblem之后:

solver.setPlanningProblem(planningProblem);

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

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

干杯!

答案 3 :(得分:0)

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

  1. 创建一个包含帮助方法的实用程序类。
  2. 在规则文件中导入实用程序类,例如在java类中导入它。
  3. 使用规则中的帮助方法。如果要在条件中使用辅助方法,请使用eval()进行换行。如果你想在then部分中使用helper方法,只需将它用作普通的java方法调用。
  4. 例如,假设您有一个名为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