当前位置: 首页 > 知识库问答 >
问题:

OptaPlanner-从其他规则调用时,全局变量为空

强承望
2023-03-14

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

基本上,我计划实现以下目标:

  1. 我会有一个学生名单[规划变量](比如10)
  2. 我会列出学生需要参加的活动(比如60项)。每项活动都有一个地点、开始和结束时间,并在全天的不同地点进行
  3. 我希望将最近的学生分配到活动地点[解决方案],以便在所有学生之间分配活动,并在前一个活动完成后及时将最接近其位置的活动分配给他们

为了将最近的学生分配到活动场地,我需要根据他们当时预计的位置(场地)维护学生的有序名单。这样分配规则就会为活动挑选列表中最靠前的学生。

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

我的Pojo课程是:

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
}

我的规划解决方案课程:

@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

共有1个答案

华衡
2023-03-14

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

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

顺便说一句,当您使用excell时,请查看返回问题的会议计划XlsxFileIO. read(File)

 类似资料:
  • 问题内容: 我从很多地方都听说过,全局变量本来就是讨厌和邪恶的,但是当使用一些非面向对象的Javascript时,我看不到如何避免它们。说我有一个函数,它使用复杂的算法使用随机数和填充物来生成数字,但是我需要在其他函数(回调或其他函数)中继续使用该特定数,因此不能成为同一函数的一部分。 如果最初生成的数字是局部变量,则无法从那里访问它。如果函数是对象方法,我可以将数字设为属性,但是它们不是属性,并

  • 问题内容: 因此,我有两个不同的文件,如下所示: file1.py file2.py 但是我似乎无法让file2识别来自file1的变量,即使它已经导入到file1中也是如此。如果可以某种方式实现,那将非常有帮助。 问题答案: 导入在使得全球(即,模块级)的约束名字提供给下面的代码-唯一的此类名称是。它并 没有 做反向:在定义的名称并不提供给代码的时候进口。即使您以正确的方式(如@nate正确建议

  • 各位opatplanner用户, 我的规划问题是:获取遥感卫星星座的有效时间表。 @PlanningEntity: @PlanningVariable: 我的问题数据主要是这样的: Image_Strip: D1 Sat2 22-12-2015 11:02:24.051 D1 Sat1 22-12-2015 11:04:24.122 A2 Sat3 22-12-2015 11:06:24.172

  • 在为我的项目实现了一些规则之后,我做了一个“ScoreConsistencyCheck”,以确保规则得到了正确的实现。 表示实现我自己的方法,该方法将在我提前终止求解或通过配置终止后调用,输出预期分数。该方法的参数是一个实例,基于解决方案的状态计算预期分数,然后将其与来自解决方案实例的“分数”变量的分数进行比较。 当我使用时,它不会抛出异常,但是当我这样尝试时,我有时会在构建启发式或本地搜索的特定

  • 变量规则 系统默认的变量规则设置是\w+,只会匹配字母、数字和下划线字符,并不会匹配特殊符号和中文,需要定义变量规则或者调整默认变量规则。 V5.1.14+版本开始,可以在app.php配置文件中自定义默认的变量规则: 'default_route_pattern' => '[\w\-]+', 支持在规则路由中为变量用正则的方式指定变量规则,弥补了动态变量无法限制具体的类型问题,并且支持全局规则

  • 我用增量java解决了optaPlanner的一个问题,其中有一个规划变量和一个规划实体,但是现在在我们的项目中有很多规划变量的需求,比如我们要找到最好的房间(容量,isAC等),汽车(totalSeatsLeft,isAC等),我们不知道有多少资源,因为我们每天都需要根据用户的需求增加更多的资源,比如会议室设施等,所以给我一些想法,这样我们就可以为optaPlanner做一个域。多谢了。