[英]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>());
干杯!
如果你需要在规划器规则中使用一些辅助方法,请尝试我在我的项目中使用的以下方法:
例如,假设您有一个名为 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.