Skip to content

Commit bf8b95a

Browse files
committed
chore: fix the comparator logic
1 parent 42a81a4 commit bf8b95a

19 files changed

Lines changed: 275 additions & 384 deletions

src/main/java/ai/timefold/solver/benchmarks/examples/curriculumcourse/domain/Lecture.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,21 @@
33
import java.util.Set;
44

55
import ai.timefold.solver.benchmarks.examples.common.domain.AbstractPersistable;
6-
import ai.timefold.solver.benchmarks.examples.curriculumcourse.domain.solver.LectureDifficultyWeightFactory;
7-
import ai.timefold.solver.benchmarks.examples.curriculumcourse.domain.solver.PeriodStrengthWeightFactory;
8-
import ai.timefold.solver.benchmarks.examples.curriculumcourse.domain.solver.RoomStrengthWeightFactory;
6+
import ai.timefold.solver.benchmarks.examples.curriculumcourse.domain.solver.LectureComparatorFactory;
7+
import ai.timefold.solver.benchmarks.examples.curriculumcourse.domain.solver.PeriodComparatorFactory;
8+
import ai.timefold.solver.benchmarks.examples.curriculumcourse.domain.solver.RoomComparatorFactory;
99
import ai.timefold.solver.core.api.domain.entity.PlanningEntity;
1010
import ai.timefold.solver.core.api.domain.entity.PlanningPin;
1111
import ai.timefold.solver.core.api.domain.variable.PlanningVariable;
1212

1313
import com.fasterxml.jackson.annotation.JsonIgnore;
1414

15-
@PlanningEntity(comparatorFactoryClass = LectureDifficultyWeightFactory.class)
15+
@PlanningEntity(comparatorFactoryClass = LectureComparatorFactory.class)
1616
public class Lecture extends AbstractPersistable {
1717

1818
private Course course;
1919
private int lectureIndexInCourse;
20+
private int unavailablePeriodPenaltyCount = -1;
2021
private boolean pinned;
2122

2223
// Planning variables: changes during planning, between score calculations.
@@ -67,7 +68,7 @@ public void setPinned(boolean pinned) {
6768
this.pinned = pinned;
6869
}
6970

70-
@PlanningVariable(comparatorFactoryClass = PeriodStrengthWeightFactory.class)
71+
@PlanningVariable(comparatorFactoryClass = PeriodComparatorFactory.class)
7172
public Period getPeriod() {
7273
return period;
7374
}
@@ -76,7 +77,7 @@ public void setPeriod(Period period) {
7677
this.period = period;
7778
}
7879

79-
@PlanningVariable(comparatorFactoryClass = RoomStrengthWeightFactory.class)
80+
@PlanningVariable(comparatorFactoryClass = RoomComparatorFactory.class)
8081
public Room getRoom() {
8182
return room;
8283
}
@@ -120,6 +121,19 @@ public int getTimeslotIndex() {
120121
return period.getTimeslot().getTimeslotIndex();
121122
}
122123

124+
@JsonIgnore
125+
public int getUnavailablePeriodPenaltyCount(CourseSchedule schedule) {
126+
if (unavailablePeriodPenaltyCount == -1) {
127+
unavailablePeriodPenaltyCount = 0;
128+
for (var penalty : schedule.getUnavailablePeriodPenaltyList()) {
129+
if (penalty.getCourse().equals(course)) {
130+
unavailablePeriodPenaltyCount++;
131+
}
132+
}
133+
}
134+
return unavailablePeriodPenaltyCount;
135+
}
136+
123137
@Override
124138
public String toString() {
125139
return course + "-" + lectureIndexInCourse;

src/main/java/ai/timefold/solver/benchmarks/examples/curriculumcourse/domain/Period.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55
import ai.timefold.solver.benchmarks.examples.common.domain.AbstractPersistable;
66

77
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
8+
import com.fasterxml.jackson.annotation.JsonIgnore;
89
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
910

1011
@JsonIdentityInfo(scope = Period.class, generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
1112
public class Period extends AbstractPersistable {
1213

1314
private Day day;
1415
private Timeslot timeslot;
16+
private int unavailablePeriodPenaltyCount = -1;
1517

1618
public Period() {
1719
}
@@ -39,6 +41,19 @@ public void setTimeslot(Timeslot timeslot) {
3941
this.timeslot = timeslot;
4042
}
4143

44+
@JsonIgnore
45+
public int getUnavailablePeriodPenaltyCount(CourseSchedule schedule) {
46+
if (unavailablePeriodPenaltyCount == -1) {
47+
unavailablePeriodPenaltyCount = 0;
48+
for (var penalty : schedule.getUnavailablePeriodPenaltyList()) {
49+
if (penalty.getPeriod().equals(this)) {
50+
unavailablePeriodPenaltyCount++;
51+
}
52+
}
53+
}
54+
return unavailablePeriodPenaltyCount;
55+
}
56+
4257
@Override
4358
public String toString() {
4459
return day + "-" + timeslot;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package ai.timefold.solver.benchmarks.examples.curriculumcourse.domain.solver;
2+
3+
import java.util.Comparator;
4+
5+
import ai.timefold.solver.benchmarks.examples.common.domain.AbstractPersistable;
6+
import ai.timefold.solver.benchmarks.examples.curriculumcourse.domain.CourseSchedule;
7+
import ai.timefold.solver.benchmarks.examples.curriculumcourse.domain.Lecture;
8+
import ai.timefold.solver.core.api.domain.common.ComparatorFactory;
9+
10+
public class LectureComparatorFactory implements ComparatorFactory<CourseSchedule, Lecture> {
11+
12+
@Override
13+
public Comparator<Lecture> createComparator(CourseSchedule schedule) {
14+
return Comparator.<Lecture> comparingInt(lecture -> lecture.getCurriculumSet().size())
15+
.thenComparingInt(lecture -> lecture.getUnavailablePeriodPenaltyCount(schedule))
16+
.thenComparingInt(lecture -> lecture.getCourse().getLectureSize())
17+
.thenComparingInt(lecture -> lecture.getCourse().getStudentSize())
18+
.thenComparingInt(lecture -> lecture.getCourse().getMinWorkingDaySize())
19+
.thenComparingLong(AbstractPersistable::getId);
20+
}
21+
}

src/main/java/ai/timefold/solver/benchmarks/examples/curriculumcourse/domain/solver/LectureDifficultyWeightFactory.java

Lines changed: 0 additions & 51 deletions
This file was deleted.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package ai.timefold.solver.benchmarks.examples.curriculumcourse.domain.solver;
2+
3+
import java.util.Comparator;
4+
5+
import ai.timefold.solver.benchmarks.examples.common.domain.AbstractPersistable;
6+
import ai.timefold.solver.benchmarks.examples.curriculumcourse.domain.CourseSchedule;
7+
import ai.timefold.solver.benchmarks.examples.curriculumcourse.domain.Period;
8+
import ai.timefold.solver.core.api.domain.common.ComparatorFactory;
9+
10+
public class PeriodComparatorFactory implements ComparatorFactory<CourseSchedule, Period> {
11+
12+
@Override
13+
public Comparator<Period> createComparator(CourseSchedule schedule) {
14+
return Comparator
15+
.<Period, Integer> comparing(period -> period.getUnavailablePeriodPenaltyCount(schedule),
16+
Comparator.reverseOrder())
17+
.thenComparingInt(period -> period.getDay().getDayIndex())
18+
.thenComparingInt(period -> period.getTimeslot().getTimeslotIndex())
19+
.thenComparingLong(AbstractPersistable::getId);
20+
}
21+
}

src/main/java/ai/timefold/solver/benchmarks/examples/curriculumcourse/domain/solver/PeriodStrengthWeightFactory.java

Lines changed: 0 additions & 52 deletions
This file was deleted.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package ai.timefold.solver.benchmarks.examples.curriculumcourse.domain.solver;
2+
3+
import java.util.Comparator;
4+
5+
import ai.timefold.solver.benchmarks.examples.common.domain.AbstractPersistable;
6+
import ai.timefold.solver.benchmarks.examples.curriculumcourse.domain.CourseSchedule;
7+
import ai.timefold.solver.benchmarks.examples.curriculumcourse.domain.Room;
8+
import ai.timefold.solver.core.api.domain.common.ComparatorFactory;
9+
10+
public class RoomComparatorFactory implements ComparatorFactory<CourseSchedule, Room> {
11+
12+
@Override
13+
public Comparator<Room> createComparator(CourseSchedule schedule) {
14+
return Comparator.comparingInt(Room::getCapacity)
15+
.thenComparingLong(AbstractPersistable::getId);
16+
}
17+
}

src/main/java/ai/timefold/solver/benchmarks/examples/curriculumcourse/domain/solver/RoomStrengthWeightFactory.java

Lines changed: 0 additions & 37 deletions
This file was deleted.

0 commit comments

Comments
 (0)