'Does Optaplanner support "combinatorial" planning variables?

Example:

Students want to enroll in multiple courses of different course groups (Math, English, Spanish, History) and have issued preferences for each course group (ENG-1 > ENG-2 means course ENG-1 is preferred to course 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:
...

Is it possible for a planning variable of each student (planning entity) to be a combination of each of their preferences? I.e. student A would be assigned MATH-2 and ENG-3, student B would be assigned ENG-1, SPA-4, and HIST-1, if the constraints allow for this.



Solution 1:[1]

Yes (and no). Technically no, because @PlanningVariable can only hold a single value.

But YES, OptaPlanner can handle your use case. You just need to choose the right way to map your domain to Java classes. You need to model a N:M relation between Student and Course:

  • Student A needs to enroll in 2 courses (one from the MATH group and one from the ENG group).
  • Student B needs to enroll in 3 courses (ENG, SPA, HIST).
  • etc.

You can model this type of relationship with the CourseAssignment class, which is your @PlanningEntity. It could look like this:

@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-...
}

Since the number of course assignments is known for each student and it's fixed, you'd simply create 2 CourseAssignment instances for Student A, 3 instances for Student B, etc.

Next, design your constraints to penalize each courseAssignment with a hard score penalty, if courseAssignment.course.group != courseAssignment.courseGroup and with a soft score penalty based on courseAssignment.student.getPreference(courseAssignment.course).

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 yurloc