Optaplanner 是否支持 "combinatorial" 规划变量?

Does Optaplanner support "combinatorial" planning variables?

示例:

学生想注册不同课程组(数学、英语、西班牙语、历史)的多门课程,并已发布每个课程组的偏好(ENG-1 > ENG-2 表示课程 ENG-1 优于课程 ENG- 2).

Student A:
MATH-2 > MATH-4 > MATH-1 > ... > MATH-9
ENG-3 > ENG-4 > ENG-1 > ... > ENG-2

Student B:
ENG-1 > ENG-2 > ENG-4 > ... > ENG-3
SPA-4 > SPA-6 > SPA-3 > ... > SPA-2
HIST-1 > HIST-3 > HIST-2 ... > HIST-5

Student C:
...

每个学生(规划实体)的规划变量是否可以是他们各自偏好的组合? IE。如果条件允许,学生 A 将被分配到 MATH-2 和 ENG-3,学生 B 将被分配到 ENG-1、SPA-4 和 HIST-1。

是(也不是)。 技术上不能,因为 @PlanningVariable 只能保存一个值。

但是,OptaPlanner 可以处理您的用例。您只需要选择正确的方式将您的域映射到 Java classes。您需要在 StudentCourse 之间建立 N:M 关系模型:

  • 学生A需要报读2门课程(一门来自MATH组,一门来自ENG组)。
  • 学生 B 需要注册 3 门课程(ENG、SPA、HIST)。
  • 等等

您可以与 CourseAssignment class 建立这种关系模型,也就是您的 @PlanningEntity。它可能看起来像这样:

@PlanningEntity
class CourseAssignment {
  final Student student; // e.g. Ann
  final CourseGroup courseGroup; // e.g. MATH

  @PlanningVariable(valueRangeProviderRefs = { "courseRange" })
  Course course; // changed by Solver - could be MATH-1, MATH-2, ENG-1, HIST-...
}

由于每个学生的课程作业数量是已知的并且是固定的,因此您只需为学生 A 创建 2 个 CourseAssignment 个实例,为学生 B 创建 3 个实例,等等。

接下来,设计您的约束以对每个 courseAssignment 进行硬分惩罚,如果 courseAssignment.course.group != courseAssignment.courseGroup 和基于 courseAssignment.student.getPreference(courseAssignment.course).

的软分惩罚