如何在drools planner的求解器中将全局变量添加到工作记忆中,以便能够在得分流口水中使用。这与https://issues.jboss.org/browse/JBRULES-2700类似,但无法找到解决方案。
答案 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)
如果您需要在规划器规则中使用一些辅助方法,请尝试我在项目中使用的以下方法:
例如,假设您有一个名为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