示例:
学生希望参加不同课程组(数学、英语、西班牙语、历史)的多门课程,并为每个课程组提供优惠(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:
...每个学生(计划实体)的计划变量是否有可能是他们各自偏好的组合?也就是说,学生A将被分配数学-2和ENG-3,学生B将被分配ENG-1,SPA-4和HIST-1,如果约束允许的话。
发布于 2022-04-07 22:50:42
是的(也不是)。从技术上讲是不行的,因为@PlanningVariable只能保存一个值。
但是是,OptaPlanner可以处理您的用例。您只需要选择正确的方式将您的域映射到Java类。您需要在Student和Course之间建立N:M关系。
group).
)
您可以使用CourseAssignment类(也就是您的@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)的软分数惩罚。
https://stackoverflow.com/questions/71788853
复制相似问题