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。您需要在 Student
和 Course
之间建立 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)
.
的软分惩罚
示例:
学生想注册不同课程组(数学、英语、西班牙语、历史)的多门课程,并已发布每个课程组的偏好(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。您需要在 Student
和 Course
之间建立 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)
.