/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.optaplanner.examples.curriculumcourse.domain;
import java.util.ArrayList;
import java.util.List;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import org.optaplanner.core.api.domain.solution.PlanningEntityCollectionProperty;
import org.optaplanner.core.api.domain.solution.PlanningScore;
import org.optaplanner.core.api.domain.solution.PlanningSolution;
import org.optaplanner.core.api.domain.solution.drools.ProblemFactCollectionProperty;
import org.optaplanner.core.api.domain.valuerange.ValueRangeProvider;
import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore;
import org.optaplanner.examples.common.domain.AbstractPersistable;
import org.optaplanner.examples.curriculumcourse.domain.solver.CourseConflict;
import org.optaplanner.persistence.xstream.api.score.buildin.hardsoft.HardSoftScoreXStreamConverter;
@PlanningSolution
@XStreamAlias("CourseSchedule")
public class CourseSchedule extends AbstractPersistable {
private String name;
private List<Teacher> teacherList;
private List<Curriculum> curriculumList;
private List<Course> courseList;
private List<Day> dayList;
private List<Timeslot> timeslotList;
private List<Period> periodList;
private List<Room> roomList;
private List<UnavailablePeriodPenalty> unavailablePeriodPenaltyList;
private List<Lecture> lectureList;
@XStreamConverter(HardSoftScoreXStreamConverter.class)
private HardSoftScore score;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ProblemFactCollectionProperty
public List<Teacher> getTeacherList() {
return teacherList;
}
public void setTeacherList(List<Teacher> teacherList) {
this.teacherList = teacherList;
}
@ProblemFactCollectionProperty
public List<Curriculum> getCurriculumList() {
return curriculumList;
}
public void setCurriculumList(List<Curriculum> curriculumList) {
this.curriculumList = curriculumList;
}
@ProblemFactCollectionProperty
public List<Course> getCourseList() {
return courseList;
}
public void setCourseList(List<Course> courseList) {
this.courseList = courseList;
}
@ProblemFactCollectionProperty
public List<Day> getDayList() {
return dayList;
}
public void setDayList(List<Day> dayList) {
this.dayList = dayList;
}
@ProblemFactCollectionProperty
public List<Timeslot> getTimeslotList() {
return timeslotList;
}
public void setTimeslotList(List<Timeslot> timeslotList) {
this.timeslotList = timeslotList;
}
@ValueRangeProvider(id = "periodRange")
@ProblemFactCollectionProperty
public List<Period> getPeriodList() {
return periodList;
}
public void setPeriodList(List<Period> periodList) {
this.periodList = periodList;
}
@ValueRangeProvider(id = "roomRange")
@ProblemFactCollectionProperty
public List<Room> getRoomList() {
return roomList;
}
public void setRoomList(List<Room> roomList) {
this.roomList = roomList;
}
@ProblemFactCollectionProperty
public List<UnavailablePeriodPenalty> getUnavailablePeriodPenaltyList() {
return unavailablePeriodPenaltyList;
}
public void setUnavailablePeriodPenaltyList(List<UnavailablePeriodPenalty> unavailablePeriodPenaltyList) {
this.unavailablePeriodPenaltyList = unavailablePeriodPenaltyList;
}
@PlanningEntityCollectionProperty
public List<Lecture> getLectureList() {
return lectureList;
}
public void setLectureList(List<Lecture> lectureList) {
this.lectureList = lectureList;
}
@PlanningScore
public HardSoftScore getScore() {
return score;
}
public void setScore(HardSoftScore score) {
this.score = score;
}
// ************************************************************************
// Complex methods
// ************************************************************************
@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;
}
}