diff --git a/backend/src/main/java/org/conferatus/timetable/backend/algorithm/constraints/PenaltyEnum.java b/backend/src/main/java/org/conferatus/timetable/backend/algorithm/constraints/PenaltyEnum.java index b5f7607..d24d9d5 100644 --- a/backend/src/main/java/org/conferatus/timetable/backend/algorithm/constraints/PenaltyEnum.java +++ b/backend/src/main/java/org/conferatus/timetable/backend/algorithm/constraints/PenaltyEnum.java @@ -1,10 +1,10 @@ package org.conferatus.timetable.backend.algorithm.constraints; -import java.util.concurrent.atomic.AtomicReference; - import org.conferatus.timetable.backend.algorithm.scheduling.GroupEvolve; import org.conferatus.timetable.backend.algorithm.scheduling.LessonWithTime; +import java.util.concurrent.atomic.AtomicReference; + import static org.conferatus.timetable.backend.algorithm.constraints.CalculateResult.ok; import static org.conferatus.timetable.backend.algorithm.constraints.CalculateResult.problem; @@ -15,15 +15,17 @@ * positive if good ending */ public enum PenaltyEnum { - TeacherAndAudienceType( + TeacherWish( (data) -> { - // FIXME видимо просто удалить эти строчки, препод же привязывается сразу в предмету -// LessonWithTime lesson = data.currentLesson(); -// if (!lesson.audience().groupCapacity() -// .equals(lesson.teacher().teacherType())) { -// return problem(-100., "Teacher and audience has different types " -// + lesson.teacher() + " " + lesson.audience()); -// } + LessonWithTime lesson = data.currentLesson(); + var maybeWish = lesson.teacher().wishes().stream().filter(wish -> wish.time().equals(lesson.time())).findAny(); + if (maybeWish.isPresent()) { + var wish = maybeWish.get(); + return wish.penalty() >= 0 + ? ok(wish.penalty()) + : problem(wish.penalty(), "Teacher {%s} doesn't want this time {%s}" + .formatted(lesson.teacher().toString(), lesson.time())); + } return ok(); }, true @@ -57,7 +59,7 @@ public enum PenaltyEnum { }, true ), - GroupsInOneAuditory( //todo: fix that + GroupsInOneAuditory( (data) -> { LessonWithTime lesson = data.currentLesson(); var otherLessons = data.getOtherLessons(lesson); @@ -105,9 +107,9 @@ public enum PenaltyEnum { LessonWithTime lesson = data.currentLesson(); double roomCapacity = lesson.cell().audience().groupCapacity(); double groupsAmount = lesson.groups().size(); - double value = baseVal * 1 - groupsAmount/roomCapacity; - if (value >= 0.666 * baseVal) { - return problem(-value*2, "Audience is almost empty"); + double value = baseVal * 1 - groupsAmount / roomCapacity; + if (value >= 0.666 * baseVal) { + return problem(-value * 2, "Audience is almost empty"); } return ok(-value); } diff --git a/backend/src/main/java/org/conferatus/timetable/backend/algorithm/experementations/AlgSimulation.java b/backend/src/main/java/org/conferatus/timetable/backend/algorithm/experementations/AlgSimulation.java index b685c53..c708c0e 100644 --- a/backend/src/main/java/org/conferatus/timetable/backend/algorithm/experementations/AlgSimulation.java +++ b/backend/src/main/java/org/conferatus/timetable/backend/algorithm/experementations/AlgSimulation.java @@ -56,14 +56,14 @@ public static void main(String[] args) throws InterruptedException { int lectureTeachersAmount = 1600; for (long i = 1; i <= teachersAmount; i++) { long studyPlan = i % studyPlans + 1; - TeacherEvolve teacherEvolve = new TeacherEvolve(i/*AudienceType.PRACTICAL*/); + TeacherEvolve teacherEvolve = new TeacherEvolve(i/*AudienceType.PRACTICAL*/, null); planToSeminarTeachers.get(studyPlan).add(teacherEvolve); } for (long i = 1; i <= lectureTeachersAmount; i++) { long studyPlan = i % studyPlans + 1; - TeacherEvolve teacherEvolve = new TeacherEvolve(i/*AudienceType.LECTURE*/); + TeacherEvolve teacherEvolve = new TeacherEvolve(i/*AudienceType.LECTURE*/, null); planToLectureTeachers.get(studyPlan).add(teacherEvolve); } diff --git a/backend/src/main/java/org/conferatus/timetable/backend/algorithm/scheduling/LessonFixType.java b/backend/src/main/java/org/conferatus/timetable/backend/algorithm/scheduling/LessonFixType.java new file mode 100644 index 0000000..3479b00 --- /dev/null +++ b/backend/src/main/java/org/conferatus/timetable/backend/algorithm/scheduling/LessonFixType.java @@ -0,0 +1,7 @@ +package org.conferatus.timetable.backend.algorithm.scheduling; + +public enum LessonFixType { + NONE, + SOFT_FIX, + HARD_FIX +} diff --git a/backend/src/main/java/org/conferatus/timetable/backend/algorithm/scheduling/TeacherEvolve.java b/backend/src/main/java/org/conferatus/timetable/backend/algorithm/scheduling/TeacherEvolve.java index e944077..cf4c496 100644 --- a/backend/src/main/java/org/conferatus/timetable/backend/algorithm/scheduling/TeacherEvolve.java +++ b/backend/src/main/java/org/conferatus/timetable/backend/algorithm/scheduling/TeacherEvolve.java @@ -1,8 +1,18 @@ package org.conferatus.timetable.backend.algorithm.scheduling; +import org.conferatus.timetable.backend.model.entity.Teacher; + +import java.util.List; import java.util.Objects; -public record TeacherEvolve(Long id) { +public record TeacherEvolve(Long id, List wishes) { + public TeacherEvolve(Teacher teacher) { + this( + teacher.getId(), + teacher.getTeacherWishes().stream().map(TeacherWishEvolve::new).toList() + ); + } + @Override public String toString() { return String.valueOf(id); diff --git a/backend/src/main/java/org/conferatus/timetable/backend/algorithm/scheduling/TeacherWishEvolve.java b/backend/src/main/java/org/conferatus/timetable/backend/algorithm/scheduling/TeacherWishEvolve.java new file mode 100644 index 0000000..c32ec2e --- /dev/null +++ b/backend/src/main/java/org/conferatus/timetable/backend/algorithm/scheduling/TeacherWishEvolve.java @@ -0,0 +1,12 @@ +package org.conferatus.timetable.backend.algorithm.scheduling; + +import org.conferatus.timetable.backend.model.entity.TeacherWish; +import org.conferatus.timetable.backend.model.enums.TableTime; + +public record TeacherWishEvolve(TableTime time, double penalty) { + public TeacherWishEvolve(TeacherWish teacherWish) { + this(new TableTime(teacherWish.getDayOfWeek().getValue(), + (int) teacherWish.getLessonNumber()), + teacherWish.getPriority()); + } +} diff --git a/backend/src/main/java/org/conferatus/timetable/backend/services/ScheduleService.java b/backend/src/main/java/org/conferatus/timetable/backend/services/ScheduleService.java index 0574c9f..338522c 100644 --- a/backend/src/main/java/org/conferatus/timetable/backend/services/ScheduleService.java +++ b/backend/src/main/java/org/conferatus/timetable/backend/services/ScheduleService.java @@ -34,7 +34,7 @@ public ScheduleAlgorithmService.StatusId generate(Long semesterId, User user) { for (SubjectPlan subjectPlan : sp.subjectPlans()) { SubjectEvolve subjectEvolve; - TeacherEvolve teacherEvolve = new TeacherEvolve(subjectPlan.teacher().getId()); + TeacherEvolve teacherEvolve = new TeacherEvolve(subjectPlan.teacher()); Map> teacherToGroups = new HashMap<>(); teacherToGroups.put(teacherEvolve, new ArrayList<>());