9.3. 在计划解决方案中收集域对象


TimeTable 实例将单个数据集的所有 TimeslotRoom 和 Appleon 实例嵌套。另外,由于它包含所有 lessons,每个都具有特定的计划变量状态,所以它是一个 规划解决方案,它具有分数:

  • 如果仅未被分配,则它是一个 未初始化的 解决方案,例如,分数为 -4init/0hard/0soft 的解决方案。
  • 如果它破坏硬限制,则是一个不可行的解决方案,例如,分数为 -2hard/-3soft 的解决方案。
  • 如果它遵循所有硬限制,那么它是一种可行的解决方案,例如,分数为 0hard/-7soft 的解决方案。

TimeTable 类有一个 @PlanningSolution 注释,因此 OptaPlanner 知道这个类包含所有输入和输出数据。

具体来说,这个类是问题的输入:

  • 带有所有时间插槽的 timeslotList 字段

    • 这是问题事实列表,因为它们在竞争过程中不会改变。
  • 包含所有空间的 roomList 字段

    • 这是问题事实列表,因为它们在竞争过程中不会改变。
  • 带有所有 lessons 的 lessonList 字段

    • 这是规划实体的列表,因为它们在竞争期间发生了变化。
    • 每个 周一

      • timeslotroom 字段的值通常仍然为空,因此未分配。它们正在规划变量。
      • 其他字段(如 subject、MrrslirpGroup )已填写。这些字段是问题属性。

但是,此类也是解决方案的输出:

  • 一个 lessonList 字段,其中每个 每天 实例在周五后都有非空 timeslotroom 字段
  • 代表输出解决方案的质量的 score 字段,例如 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;
    }

}
Copy to Clipboard Toggle word wrap

值范围供应商

timeslotList 字段是一个值范围供应商。它包含 OptaPlanner 可以从中分配 to to the timeslot 字段的 Timeslot 实例。timeslotList 字段有一个 @ValueRangeProvider 注释来连接这两个注解,方法是将 id 与大括号中的 @PlanningVariablevalueRangeProviderRefs 匹配。

遵循同样的逻辑,roomList 字段也具有 @ValueRangeProvider 注释。

问题事实和规划实体属性

此外,OptaPlanner 需要知道它可以更改哪些附件,以及如何检索用于 TimeTableConstraintProviderTimeslotRoom 实例。

timeslotListroomList 字段有一个 @ProblemFactCollectionProperty 注解,因此您的 TimeTableConstraintProvider 可以从这些实例中选择。

lessonList 有一个 @PlanningEntityCollectionProperty 注解,因此 OptaPlanner 可以在将来更改它们,而您的 TimeTableConstraintProvider 也可以从这些中选择。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat