diff --git a/java/school-timetabling/src/main/java/org/acme/schooltimetabling/domain/Lesson.java b/java/school-timetabling/src/main/java/org/acme/schooltimetabling/domain/Lesson.java index 65f599214d..c71fb334f0 100644 --- a/java/school-timetabling/src/main/java/org/acme/schooltimetabling/domain/Lesson.java +++ b/java/school-timetabling/src/main/java/org/acme/schooltimetabling/domain/Lesson.java @@ -5,6 +5,8 @@ import ai.timefold.solver.core.api.domain.variable.PlanningVariable; import com.fasterxml.jackson.annotation.JsonIdentityReference; +import java.util.List; + @PlanningEntity public class Lesson { @@ -15,6 +17,9 @@ public class Lesson { private String teacher; private String studentGroup; + private String reqTag; + private List tags; + @JsonIdentityReference @PlanningVariable private Timeslot timeslot; @@ -26,15 +31,17 @@ public class Lesson { public Lesson() { } - public Lesson(String id, String subject, String teacher, String studentGroup) { + public Lesson(String reqTag, List tags, String id, String subject, String teacher, String studentGroup) { this.id = id; this.subject = subject; this.teacher = teacher; this.studentGroup = studentGroup; + this.reqTag = reqTag; + this.tags = tags; } public Lesson(String id, String subject, String teacher, String studentGroup, Timeslot timeslot, Room room) { - this(id, subject, teacher, studentGroup); + this(null, List.of(), id, subject, teacher, studentGroup); this.timeslot = timeslot; this.room = room; } @@ -79,4 +86,20 @@ public Room getRoom() { public void setRoom(Room room) { this.room = room; } + + public String getReqTag() { + return reqTag; + } + + public void setReqTag(String reqTag) { + this.reqTag = reqTag; + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } } diff --git a/java/school-timetabling/src/main/java/org/acme/schooltimetabling/rest/TimetableDemoResource.java b/java/school-timetabling/src/main/java/org/acme/schooltimetabling/rest/TimetableDemoResource.java index d742ed7b7a..9c804996f8 100644 --- a/java/school-timetabling/src/main/java/org/acme/schooltimetabling/rest/TimetableDemoResource.java +++ b/java/school-timetabling/src/main/java/org/acme/schooltimetabling/rest/TimetableDemoResource.java @@ -4,6 +4,7 @@ import java.time.LocalTime; import java.util.ArrayList; import java.util.List; +import java.util.Random; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; @@ -29,8 +30,8 @@ public class TimetableDemoResource { public enum DemoData { - SMALL, - LARGE + LARGE, + SMALL } @APIResponses(value = { @@ -52,6 +53,21 @@ public DemoData[] list() { @Path("/{demoDataId}") public Response generate(@Parameter(description = "Unique identifier of the demo data.", required = true) @PathParam("demoDataId") DemoData demoData) { + List reqTagOptions = List.of("A", "B", "C", "D", "E"); + List> tagsOptions = List.of( + List.of("A", "B", "C"), + List.of("A", "B", "D"), + List.of("A", "B", "E"), + List.of("A", "C", "D"), + List.of("A", "C", "E"), + List.of("A", "D", "E"), + List.of("B", "C", "D"), + List.of("B", "C", "E"), + List.of("B", "D", "E"), + List.of("C", "D", "E") + ); + Random random = new Random(7); + List timeslots = new ArrayList<>(10); long nextTimeslotId = 0L; timeslots.add(new Timeslot(Long.toString(nextTimeslotId++), DayOfWeek.MONDAY, LocalTime.of(8, 30), LocalTime.of(9, 30))); @@ -96,112 +112,112 @@ public Response generate(@Parameter(description = "Unique identifier of the demo List lessons = new ArrayList<>(); long nextLessonId = 0L; - lessons.add(new Lesson(Long.toString(nextLessonId++), "Math", "A. Turing", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Math", "A. Turing", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Physics", "M. Curie", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Chemistry", "M. Curie", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Biology", "C. Darwin", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "History", "I. Jones", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "English", "I. Jones", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "English", "I. Jones", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Spanish", "P. Cruz", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Spanish", "P. Cruz", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Math", "A. Turing", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Math", "A. Turing", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Physics", "M. Curie", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Chemistry", "M. Curie", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Biology", "C. Darwin", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "History", "I. Jones", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "English", "I. Jones", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "English", "I. Jones", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Spanish", "P. Cruz", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Spanish", "P. Cruz", "9th grade")); if (demoData == DemoData.LARGE) { - lessons.add(new Lesson(Long.toString(nextLessonId++), "Math", "A. Turing", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Math", "A. Turing", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Math", "A. Turing", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "ICT", "A. Turing", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Physics", "M. Curie", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Geography", "C. Darwin", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Geology", "C. Darwin", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "History", "I. Jones", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "English", "I. Jones", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Drama", "I. Jones", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Art", "S. Dali", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Art", "S. Dali", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Physical education", "C. Lewis", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Physical education", "C. Lewis", "9th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Physical education", "C. Lewis", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Math", "A. Turing", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Math", "A. Turing", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Math", "A. Turing", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "ICT", "A. Turing", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Physics", "M. Curie", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Geography", "C. Darwin", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Geology", "C. Darwin", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "History", "I. Jones", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "English", "I. Jones", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Drama", "I. Jones", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Art", "S. Dali", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Art", "S. Dali", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Physical education", "C. Lewis", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Physical education", "C. Lewis", "9th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Physical education", "C. Lewis", "9th grade")); } - lessons.add(new Lesson(Long.toString(nextLessonId++), "Math", "A. Turing", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Math", "A. Turing", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Math", "A. Turing", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Physics", "M. Curie", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Chemistry", "M. Curie", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "French", "M. Curie", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Geography", "C. Darwin", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "History", "I. Jones", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "English", "P. Cruz", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Spanish", "P. Cruz", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Math", "A. Turing", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Math", "A. Turing", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Math", "A. Turing", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Physics", "M. Curie", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Chemistry", "M. Curie", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "French", "M. Curie", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Geography", "C. Darwin", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "History", "I. Jones", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "English", "P. Cruz", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Spanish", "P. Cruz", "10th grade")); if (demoData == DemoData.LARGE) { - lessons.add(new Lesson(Long.toString(nextLessonId++), "Math", "A. Turing", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Math", "A. Turing", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "ICT", "A. Turing", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Physics", "M. Curie", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Biology", "C. Darwin", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Geology", "C. Darwin", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "History", "I. Jones", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "English", "P. Cruz", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "English", "P. Cruz", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Drama", "I. Jones", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Art", "S. Dali", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Art", "S. Dali", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Physical education", "C. Lewis", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Physical education", "C. Lewis", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Physical education", "C. Lewis", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Math", "A. Turing", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Math", "A. Turing", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "ICT", "A. Turing", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Physics", "M. Curie", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Biology", "C. Darwin", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Geology", "C. Darwin", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "History", "I. Jones", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "English", "P. Cruz", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "English", "P. Cruz", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Drama", "I. Jones", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Art", "S. Dali", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Art", "S. Dali", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Physical education", "C. Lewis", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Physical education", "C. Lewis", "10th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Physical education", "C. Lewis", "10th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Math", "A. Turing", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Math", "A. Turing", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Math", "A. Turing", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Math", "A. Turing", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Math", "A. Turing", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "ICT", "A. Turing", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Physics", "M. Curie", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Chemistry", "M. Curie", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "French", "M. Curie", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Physics", "M. Curie", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Geography", "C. Darwin", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Biology", "C. Darwin", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Geology", "C. Darwin", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "History", "I. Jones", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "History", "I. Jones", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "English", "P. Cruz", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "English", "P. Cruz", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "English", "P. Cruz", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Spanish", "P. Cruz", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Drama", "P. Cruz", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Art", "S. Dali", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Art", "S. Dali", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Physical education", "C. Lewis", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Physical education", "C. Lewis", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Physical education", "C. Lewis", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Math", "A. Turing", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Math", "A. Turing", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Math", "A. Turing", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Math", "A. Turing", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Math", "A. Turing", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "ICT", "A. Turing", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Physics", "M. Curie", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Chemistry", "M. Curie", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "French", "M. Curie", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Physics", "M. Curie", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Geography", "C. Darwin", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Biology", "C. Darwin", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Geology", "C. Darwin", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "History", "I. Jones", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "History", "I. Jones", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "English", "P. Cruz", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "English", "P. Cruz", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "English", "P. Cruz", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Spanish", "P. Cruz", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Drama", "P. Cruz", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Art", "S. Dali", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Art", "S. Dali", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Physical education", "C. Lewis", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Physical education", "C. Lewis", "11th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Physical education", "C. Lewis", "11th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Math", "A. Turing", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Math", "A. Turing", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Math", "A. Turing", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Math", "A. Turing", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Math", "A. Turing", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "ICT", "A. Turing", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Physics", "M. Curie", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Chemistry", "M. Curie", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "French", "M. Curie", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Physics", "M. Curie", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Geography", "C. Darwin", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Biology", "C. Darwin", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Geology", "C. Darwin", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "History", "I. Jones", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "History", "I. Jones", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "English", "P. Cruz", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "English", "P. Cruz", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "English", "P. Cruz", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Spanish", "P. Cruz", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Drama", "P. Cruz", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Art", "S. Dali", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Art", "S. Dali", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Physical education", "C. Lewis", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Physical education", "C. Lewis", "12th grade")); - lessons.add(new Lesson(Long.toString(nextLessonId++), "Physical education", "C. Lewis", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Math", "A. Turing", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Math", "A. Turing", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Math", "A. Turing", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Math", "A. Turing", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Math", "A. Turing", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "ICT", "A. Turing", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Physics", "M. Curie", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Chemistry", "M. Curie", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "French", "M. Curie", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Physics", "M. Curie", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Geography", "C. Darwin", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Biology", "C. Darwin", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Geology", "C. Darwin", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "History", "I. Jones", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "History", "I. Jones", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "English", "P. Cruz", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "English", "P. Cruz", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "English", "P. Cruz", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Spanish", "P. Cruz", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Drama", "P. Cruz", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Art", "S. Dali", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Art", "S. Dali", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Physical education", "C. Lewis", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Physical education", "C. Lewis", "12th grade")); + lessons.add(new Lesson(reqTagOptions.get(random.nextInt(reqTagOptions.size())), tagsOptions.get(random.nextInt(tagsOptions.size())), Long.toString(nextLessonId++), "Physical education", "C. Lewis", "12th grade")); } return Response.ok(new Timetable(demoData.name(), timeslots, rooms, lessons)).build(); } diff --git a/java/school-timetabling/src/main/java/org/acme/schooltimetabling/solver/TimetableConstraintProvider.java b/java/school-timetabling/src/main/java/org/acme/schooltimetabling/solver/TimetableConstraintProvider.java index ff4fe617a1..78c783d75b 100644 --- a/java/school-timetabling/src/main/java/org/acme/schooltimetabling/solver/TimetableConstraintProvider.java +++ b/java/school-timetabling/src/main/java/org/acme/schooltimetabling/solver/TimetableConstraintProvider.java @@ -20,12 +20,28 @@ public Constraint[] defineConstraints(ConstraintFactory constraintFactory) { teacherConflict(constraintFactory), studentGroupConflict(constraintFactory), // Soft constraints - teacherRoomStability(constraintFactory), - teacherTimeEfficiency(constraintFactory), - studentGroupSubjectVariety(constraintFactory) + softTagNew(constraintFactory) }; } + Constraint softTagOld(ConstraintFactory constraintFactory) { + // A teacher prefers to teach sequential lessons and dislikes gaps between lessons. + return constraintFactory + .forEach(Lesson.class) + .join(Lesson.class, Joiners.filtering((a, b) -> a.getTags().contains(b.getReqTag()))) + .reward(HardSoftScore.ONE_SOFT) + .asConstraint("Soft tag"); + } + + Constraint softTagNew(ConstraintFactory constraintFactory) { + // A teacher prefers to teach sequential lessons and dislikes gaps between lessons. + return constraintFactory + .forEach(Lesson.class) + .join(Lesson.class, Joiners.contain(Lesson::getTags, Lesson::getReqTag)) + .reward(HardSoftScore.ONE_SOFT) + .asConstraint("Soft tag"); + } + Constraint roomConflict(ConstraintFactory constraintFactory) { // A room can accommodate at most one lesson at the same time. return constraintFactory