При создании решения я хочу наложить некоторые ограничения на расписание нескольких классов. Например, я хочу проверить, нет ли у одного и того же учителя двух временных интервалов (на уроках) в двух расписаниях. Итак, я хочу сравнить два временных интервала (два урока) в двух разных расписаниях. Я не знаю как.
Я использую класс ConstraintProvider:
public class TimeTableConstraintsProvider implements ConstraintProvider {
@Override
public Constraint[] defineConstraints(ConstraintFactory constraintFactory) {
return new Constraint[] {
timeSlotConflictPenalty(constraintFactory),
};
}
public Constraint timeSlotConflictPenalty(ConstraintFactory constraintFactory) {
return constraintFactory
.from(Lesson.class)
.join(Lesson.class)
.filter(Lesson::isOverlapping)
.penalize("time slot conflict", HardSoftScore.ONE_HARD);
}
}
У меня есть это решение для планирования:
@PlanningSolution
public class TimeTable {
private String id;
@PlanningEntityCollectionProperty
private List<Lesson> lessons;
@ValueRangeProvider(id = "timeSlotRange")
private List<TimeSlot> timeSlots;
@ProblemFactCollectionProperty
private List<SchoolRoom> schoolRooms;
@ProblemFactCollectionProperty
private List<Course> courses;
@ProblemFactCollectionProperty
private List<Teacher> teachers;
@ProblemFactCollectionProperty
private List<SchoolClass> schoolClasses;
@PlanningScore
private HardSoftScore score;
private SolverStatus solverStatus;
//...
}
Вот сущность урока :
@PlanningEntity
public class Lesson {
@PlanningId
private Long id;
private SchoolRoom schoolRoom;
private Subject subject;
private Teacher teacher;
@PlanningVariable(valueRangeProviderRefs = "timeSlotRange")
private TimeSlot timeSlot;
private SchoolClass schoolClass;
}
И часть метода решателя
schoolClasses.forEach(schoolClass -> {
final TimeTable timeTable = new TimeTable(clientId,
schoolClass, schoolClasses, schoolRooms, subjects, teachers, lessons,
lessons.stream().map(Lesson::getTimeSlot).collect(Collectors.toList()));
final SolverJob<TimeTable, String> solverJob =
solverManager.solveAndListen(schoolClassId, id -> timeTable,
this::saveTimeTable);
});