首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Optaplanner支持“组合”计划变量吗?

Optaplanner支持“组合”计划变量吗?
EN

Stack Overflow用户
提问于 2022-04-07 20:59:46
回答 1查看 52关注 0票数 0

示例:

学生希望参加不同课程组(数学、英语、西班牙语、历史)的多门课程,并为每个课程组提供优惠(ENG-1 > ENG-2意味着ENG-1课程优先于ENG-2课程)。

代码语言:javascript
复制
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,如果约束允许的话。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-07 22:50:42

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

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

group).

  • Student
  • 学生A需要注册2门课程(一门来自数学小组,一门来自ENG
  • B需要注册3门课程(ENG,SPA,HIST).
  • etc.

)

您可以使用CourseAssignment类(也就是您的@PlanningEntity )来建模这种关系。看起来可能是这样的:

代码语言:javascript
复制
@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)的软分数惩罚。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71788853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档