其中,前两条硬性要求靠下面代码解决:
@ProblemFactCollectionProperty
private List<CourseConflict> calculateCourseConflictList() {
List<CourseConflict> courseConflictList = new ArrayList<>();
for (Course leftCourse : courseList) {
for (Course rightCourse : courseList) {
if (leftCourse.getId() < rightCourse.getId()) {
int conflictCount = 0;
if (leftCourse.getTeacher().equals(rightCourse.getTeacher())) {
conflictCount++;
}
for (Curriculum curriculum : leftCourse.getCurriculumList()) {
if (rightCourse.getCurriculumList().contains(curriculum)) {
conflictCount++;
}
}
if (conflictCount > 0) {
courseConflictList.add(new CourseConflict(leftCourse, rightCourse, conflictCount));
}
}
}
}
return courseConflictList;
}
,但是要配合上同一period要加上:
// Three conflicting lectures count as 3 violations: one for each pair.
rule "conflictingLecturesDifferentCourseInSamePeriod"
when
$courseConflict : CourseConflict($leftCourse : leftCourse, $rightCourse : rightCourse)
$leftLecture : Lecture(course == $leftCourse, $period : period, period != null)
$rightLecture : Lecture(course == $rightCourse, period == $period, this != $leftLecture)
then
scoreHolder.addHardConstraintMatch(kcontext, - $courseConflict.getConflictCount());
end
地点要分开
一个老师对多个currirulumn,但是只对一个course.
一个老师可能去不同的校区,所以对每个局部来说,老师的可用时间段也是不同的。
由于前面有课程占用,room的可用时间段也有不同。
有的currirulumn时间比较固定,比如都是周五上午。
有的是1对1的。
时间问题
举例而言:时间:2018/9/9 至 2019/1/13 周日16:30-18:30(其中9月30日、10月7日、11月4日休息) ,共计16次课