13.4. 在规划解决方案中收集域对象
TimeTable 实例将单个数据集的所有 Timeslot、Room 和 Lesson 实例包装。此外,由于它包含所有经验,因此每个均具有特定的计划变量状态,因此它是一个 规划解决方案,它分数如下:
-
如果尚未取消分配课程,则它是一个 未初始化的 解决方案,例如,分数为
-4init/0hard/0soft的解决方案。 -
如果它破坏了硬约束,则它是一个不可分的解决方案,例如,分数为
-2hard/-3soft的解决方案。 -
如果它遵循所有硬约束,则它是一个可行的解决方案,例如,分数为
0hard/-7soft的解决方案。
TimeTable 类具有 @PlanningSolution 注释,因此红帽构建的 OptaPlanner 知道此类包含所有输入和输出数据。
具体来说,这个类是问题的输入:
一个
timeslotList字段以及所有时间插槽- 这是问题事实的列表,因为它们在解决过程中不会改变。
带有所有空间的
roomList字段- 这是问题事实的列表,因为它们在解决过程中不会改变。
包含所有课程的
lessonList字段- 这是计划实体列表,因为它们在解决过程中发生了变化。
在每个课
中:-
timeslot和room字段的值通常仍为null,因此未分配。它们正在规划变量。 -
其他字段(如
主题、教师和)填写完毕。这些字段是问题属性。学员组
-
但是,这个类也是解决方案的输出:
-
一个
lessonList字段,每个Lesson实例在解决后都带有非空次数和房间字段 -
代表输出解决方案的质量的
score字段,如0hard/-5soft
流程
创建 src/main/java/com/example/domain/TimeTable.java 类:
值范围供应商
timeslotList 字段是一个值范围 provider。它包含 OptaPlanner 可以从中选择的 Timeslot 实例,以分配给 Lesson 实例的 timeslot 字段。timeslotList 字段具有一个 @ValueRangeProvider 注释,用于连接这两者,方法是将 id 与 Lesson 中的 @PlanningVariable 的 valueRangeProviderRefs 匹配。
遵循同一逻辑时,roomList 字段也具有 @ValueRangeProvider 注释。
问题事实和规划实体属性
另外,OptaPlanner 需要知道哪个 Lesson 实例可以更改,以及如何检索由 TimeTableConstraintProvider 分数计算使用的 Timeslot 和 Room 实例。
timeslotList 和 roomList 字段具有 @ProblemFactCollectionProperty 注释,因此您的 TimeTableConstraintProvider 可以从这些实例中进行选择。
lessonList 具有 @PlanningEntityCollectionProperty 注释,因此 OptaPlanner 可以在解决问题期间更改它们,并且您的 TimeTableConstraintProvider 也可以从这些注释中选择。