排课输入条件


其中,前两条硬性要求靠下面代码解决:

 @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次课

猜你喜欢

转载自blog.csdn.net/seareal1/article/details/80647996