Setting global variables in working memory in Drools planner

孤人 提交于 2019-12-25 01:39:31

问题


How do I add a global variable to working memory in drools planner's solver to be able to use in scores drool. This is similar to https://issues.jboss.org/browse/JBRULES-2700 but couldn't find a solution though.


回答1:


First some preaching: Using a service (set as a global) to calculate part of the score will break delta based score calculation (read the manual section on that topic), resulting in much less score calculations per second (say 50 instead of 5000 per second on big data sets).

Then a HACK solution: In the StartingSolutionInitializer (soon known as CustomSolverPhaseCommand) do solverScope.getWorkingMemory().setGlobal("key", value).

Then a real, long-term solution: Could you motivate why you need to be able to do this? We can think about adding support for this with something like an optional WorkingMemoryPreperator.




回答2:


After set the planningProblem:

solver.setPlanningProblem(planningProblem);

You can get access the workingMemory via solutionDirector(HACK) :

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

Cheers!




回答3:


If you need to use some helper methods in the planner rules, try the following approach which I used in my project:

  1. Create a utility class which includes the helper methods.
  2. Import the utility class in the rule file like importing it in a java class.
  3. Use the helper method in the rule. If you want to use a helper method in the condition, wrap using eval(). If you want to use a helper method in the then part, just use it as normal java method call.

For example, say you have a utility class named PlanningUtil like below:

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

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

Then import the utility class in the rule file,

import PlanningUtil;

Use the utility method in the rule

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


来源:https://stackoverflow.com/questions/6855209/setting-global-variables-in-working-memory-in-drools-planner

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!