13.4. 在计划解决方案中收集域对象
TimeTable
实例将单个数据集的所有 Timeslot
、
和 Appleon 实例嵌套。另外,由于它包含所有 lessons,每个都具有特定的计划变量状态,所以它是一个 规划解决方案,它具有分数:
Room
-
如果仅未被分配,则它是一个 未初始化的 解决方案,例如,分数为
-4init/0hard/0soft
的解决方案。 -
如果它破坏硬限制,则是一个不可行的解决方案,例如,分数为
-2hard/-3soft
的解决方案。 -
如果它遵循所有硬限制,那么它是一种可行的解决方案,例如,分数为
0hard/-7soft
的解决方案。
TimeTable
类有一个 @PlanningSolution
注释,因此 OptaPlanner 知道这个类包含所有输入和输出数据。
具体来说,这个类是问题的输入:
带有所有时间插槽的
timeslotList
字段- 这是问题事实列表,因为它们在竞争过程中不会改变。
包含所有空间的
roomList
字段- 这是问题事实列表,因为它们在竞争过程中不会改变。
带有所有 lessons 的
lessonList
字段- 这是规划实体的列表,因为它们在竞争期间发生了变化。
每个
周一
:-
timeslot
和room
字段的值通常仍然为空,因此未分配。它们正在规划变量。
-
其他字段(如
subject
、Mrr
和slirpGroup
)已填写。这些字段是问题属性。
-
但是,此类也是解决方案的输出:
-
一个
lessonList
字段,其中每个每天
实例在周五后都有非空timeslot
和room
字段 -
代表输出解决方案的质量的
score
字段,例如0hard/-5soft
流程
创建 src/main/java/com/example/domain/TimeTable.java
类:
值范围供应商
timeslotList
字段是一个值范围供应商。它包含 OptaPlanner 可以从中分配 to to the timeslot
字段的 Timeslot
实例。timeslotList
字段有一个 @ValueRangeProvider
注释来连接这两个注解,方法是将 id
与大括号中的 @PlanningVariable
的 valueRangeProviderRefs
匹配。
遵循同样的逻辑,roomList
字段也具有 @ValueRangeProvider
注释。
问题事实和规划实体属性
此外,OptaPlanner 需要知道它可以更改哪些附件,以及如何检索用于 TimeTableConstraintProvider
的 Timeslot
和 Room
实例。
timeslotList
和 roomList
字段有一个 @ProblemFactCollectionProperty
注解,因此您的 TimeTableConstraintProvider
可以从这些实例中选择。
lessonList
有一个 @PlanningEntityCollectionProperty
注解,因此 OptaPlanner 可以在将来更改它们,而您的 TimeTableConstraintProvider
也可以从这些中选择。