我是 Drools 新手。我已将对象列表作为 drl 文件中的全局变量,并在规则 1 中的列表中添加记录。每次执行规则 1 时,都会在列表中添加更新的记录。我想在规则 2 中使用该列表。 但是当执行规则 2 时,列表变空。
基本上我计划实现的目标如下:
- 我将有一份学生列表 [计划变量](比如 10)
- 我将列出学生需要参加的 Activity (例如 60 个)。每个 Activity 都有 field 、开始和结束时间,并且全天在不同地点举行。
- 我想将最近的学生分配到 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/