10.4. 在规划解决方案中收集域对象
TimeTable
实例嵌套了单个 dataset 的所有 Timeslot
、Room
和 Lesson
实例。另外,由于它包含了 allon,每个都具有特定规划变量状态,所以它是一个 规划解决方案,并有分数:
-
如果课程仍然没有被签名,那么它是一个 未初始化 的解决方案,例如分数为
-4init/0hard/0soft
的解决方案。 -
如果损坏硬限制,那么它是一种 不可预见的 解决方案,例如分数为
-2hard/-3soft
的解决方案。 -
如果遵循所有硬约束,那么它是一个可行的解决方案,例如,分数为
0hard/-7soft
的解决方案。
TimeTable
类有一个 @PlanningSolution
注释,因此红帽构建的 OptaPlanner 知道该类包含所有输入和输出数据。
具体来说,这个类是问题的输入:
带有所有时间窗的
timeslotList
字段- 这是问题事实列表,因为它们在解决过程中不会改变。
包含所有房间有一个
roomList
字段- 这是问题事实列表,因为它们在解决过程中不会改变。
带有所有节节的
lessonList
字段- 这是计划实体列表,因为他们在解决过程中发生了变化。
在每个课
中
:-
timeslot
和room
字段的值通常为null
,因此取消分配。它们是规划变量。 -
其他字段(如
主题、S
quill
r 和studentGroup
)已被填写。这些字段是问题属性。
-
但是,这个类也是解决方案的输出:
-
每个
lessonList
字段在解决后都有非 nulltime
lot 和room
字段 -
代表输出解决方案质量
的分数
字段,如0hard/-5soft
流程
创建 src/main/java/com/example/domain/TimeTable.java
类:
package com.example.domain; import java.util.List; import org.optaplanner.core.api.domain.solution.PlanningEntityCollectionProperty; import org.optaplanner.core.api.domain.solution.PlanningScore; import org.optaplanner.core.api.domain.solution.PlanningSolution; import org.optaplanner.core.api.domain.solution.ProblemFactCollectionProperty; import org.optaplanner.core.api.domain.valuerange.ValueRangeProvider; import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore; @PlanningSolution public class TimeTable { @ValueRangeProvider(id = "timeslotRange") @ProblemFactCollectionProperty private List<Timeslot> timeslotList; @ValueRangeProvider(id = "roomRange") @ProblemFactCollectionProperty private List<Room> roomList; @PlanningEntityCollectionProperty private List<Lesson> lessonList; @PlanningScore private HardSoftScore score; private TimeTable() { } public TimeTable(List<Timeslot> timeslotList, List<Room> roomList, List<Lesson> lessonList) { this.timeslotList = timeslotList; this.roomList = roomList; this.lessonList = lessonList; } // ******************************** // Getters and setters // ******************************** public List<Timeslot> getTimeslotList() { return timeslotList; } public List<Room> getRoomList() { return roomList; } public List<Lesson> getLessonList() { return lessonList; } public HardSoftScore getScore() { return score; } }
值范围供应商
timeslotList
字段是一个值范围 provider。它拥有 OptaPlanner 可以从中选择的 Timeslot
实例,分配给 lesson 实例的 timeslot
字段。time
lotList
字段具有 @ValueRangeProvider
注释,可通过在 Lesson
中将 id
与 @PlanningVariable
的 valueRangeProviderRefs
匹配。
遵循相同的逻辑,roomList
字段也有 @ValueRangeProvider
注释。
问题事实和规划实体属性
另外,OptaPlanner 需要知道它可能会更改哪些较小的实例,以及如何检索由 TimeTableConstraintProvider
计算的 Timeslot
和 Room
实例。
time lotList
和 roomList
字段具有 @ProblemFactCollectionProperty
注释,因此您的 TimeTableConstraintProvider
可以从这些实例中进行选择。
lessonList
有一个 @PlanningEntityCollectionProperty
注解,因此 OptaPlanner 可在解决过程中更改它们,并且您的 TimeTableConstraintProvider
也可从那些中选择。