java - OptaPlanner - 从另一个规则调用时全局变量为空

标签 java optaplanner

我是 Drools 新手。我已将对象列表作为 drl 文件中的全局变量,并在规则 1 中的列表中添加记录。每次执行规则 1 时,都会在列表中添加更新的记录。我想在规则 2 中使用该列表。 但是当执行规则 2 时,列表变空。

基本上我计划实现的目标如下:

  1. 我将有一份学生列表 [计划变量](比如 10)
  2. 我将列出学生需要参加的 Activity (例如 60 个)。每个 Activity 都有 field 、开始和结束时间,并且全天在不同地点举行。
  3. 我想将最近的学生分配到 Activity 地点 [解决方案],以便将 Activity 分发给所有学生,并在上一 Activity 完成后为他们分配距离他们当时所在位置最近的 Activity 。

为了将最近的学生分配到 Activity 地点,我需要根据学生当时的预计位置(地点)维护学生的有序列表。这样分配规则将挑选事件列表中最靠前的学生。

因此,每次作业后,学生列表中的顺序都会发生变化。我希望这个不断变化的学生列表在约束规则中可用。

我的 Pojo 类(class)是:

public class student {

    private long id;
    private String name;
    private double position;

...

//getter
//setter
}

public class Events {
    private long id;
    private String venueName;
    private double position; // venue location
    private Date startTime;
    private Date endTime;
}

我的规划实体类:

@PlanningEntity
public class EventEntity{

private student stud;
private Events events;

    @PlanningVariable
    public student getStud() {
        return stud;
    }

//getter
//setter
}

我的规划解决方案类(class):

@PlanningSolution
public class EventSolution {
    private long id;
    private List<student> student;
    private List<Events> events; // venue location
...
    //getter
    //setter
}

另一个类是:

public class studentRoster {

public List<student> fetchData(List<student> studList){

  List<student> studList = new ArrayList<student>();
      if(studList == null){
          //add records in studList from excel
      }else{
          // calculate the students position from event venue position and sort the list to assign nearest students 
       }

   return studList;
   }

}

我的 drl 文件:

//imports

global List<student> studentList;

rule  "rule1"
salience 6
    when
       EventEntity(events != null, $event : events)
       studList : List() from collect (EventSolution (student == null))
    then
       studentRoster sr = new studentRoster();
       studentList = sr.fetchData($event,studList); 
end

rule "rule2"
  salience 5
    when
      $stud: student() from studentList //here studentList is getting empty
    then
      System.out.println($stud);
end

还尝试使用扩展关键字,但列表仍然为空

rule "rule2" extends "rule1"
    when
      $stud: student() from studentList
    then
      System.out.println($stud);
end

最佳答案

global 字段与 optaplanner 不兼容(当然 scoreHolder 除外),尤其是在稍后激活多线程求解、分区搜索等时(因为它们会创建多个 kie session )。

sr.fetchData(); 代码应该在调用 solver.solve(problem) 来填充问题之前发生。

顺便说一句,当您使用 Excel 时,请查看返回问题的 ConferenceSchedulingXlsxFileIO.read(File)

关于java - OptaPlanner - 从另一个规则调用时全局变量为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57570483/

相关文章:

java - GWT RPC 进行时更新/刷新 View

java - 反序列化子类对象时忽略 Jsonserializer

java - 如何在 OptaPlanner 中为每组的最小和最大计数添加 HardConstraint?

java - 在 Maven 生成的 war 中包含外部 Eclipse 项目作为 jar

java - struts2 在操作类中获取值(value)

java - PlanningEntities 分布在多个集合中

drools - Optaplanner 7.13.0 无法从 jar 文件执行

java - 在 Optaplanner 中建模 Activity 调度

java - 将图像存储在数据库与文件系统中

java - (Java) 在 JPanel 的二维数组上使用 GridLayout(可能是 GridBagLayout)