OptaPlanner求解器输入数据组织方法咨询——9.44.0版本示例困惑
OptaPlanner 9.44.0课程表调度示例输入数据结构解析
核心数据文件对应关系
该示例的输入数据采用CSV格式,每个文件直接映射到示例中的Java业务实体,对应关系如下:
curriculum.csv:存储课程组数据,每行对应一个课程组,字段包含课程组ID、名称等,用于关联同组的课程与学生。course.csv:存储课程核心数据,字段包含课程ID、名称、所属课程组ID、所需课时数、授课教师ID等,是调度的核心对象。room.csv:存储教室数据,字段包含教室ID、名称、容量,用于约束课程的容纳人数。teacher.csv:存储教师数据,字段包含教师ID、名称,关联课程的授课主体。student_group.csv:存储学生组数据,字段包含学生组ID、名称、人数、所属课程组ID,决定课程的受众群体。
约束的实现逻辑
示例中的约束并非直接写在输入数据文件中,而是通过数据关联+规则代码共同定义:
- 硬约束(必须满足):比如"同一教师不能同时授课",是通过
course.csv中课程与教师的关联,结合规则文件curriculumCourseConstraints.drl中的规则实现的。 - 软约束(优先满足):比如"课程尽量安排在学生偏好时段",若涉及偏好数据,会通过额外的CSV文件(如
student_preference.csv)存储偏好关系,再由规则调用这些数据进行约束计算。
快速理解的验证方法
- 查看示例的Java实体类(如
src/main/java/org/optaplanner/examples/curriculumcourse/domain/Course.java),类上的@PlanningEntity、@PlanningVariable注解,以及字段的CSV映射注解,可直接对应到CSV文件的列。 - 打开规则文件
src/main/resources/org/optaplanner/examples/curriculumcourse/solver/curriculumCourseConstraints.drl,规则中会直接引用输入数据的字段(如$course : Course(teacher != null)),以此关联到CSV中的对应字段。
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

