public int lessonComparator(Lesson l1, Lesson l2) { return(subGroupLessonComparator(l1, l2)); }
public bool removeLessonsAndFindNewPosition3(Lesson lesson, ref List <Lesson> allLesson, int level = 1) { //Console.WriteLine(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>removeLessonsAndFindNewPosition"); //Console.WriteLine("start " + lesson.ToString() + " level " + level); bool result = false; Timetable groupTT = lesson.getGroup().getTimetable(); //List<TimeSlot> groupFreeSlots = groupTT.getFreeSlotsToLesson(lesson); Timetable teacherTT = lesson.getTeacher().getTimetable(); List <TimeSlot> teacherFreeSlots = teacherTT.getFreeSlotsToLesson(lesson); // sloty w salach w które można wstawic daną lekcje List <FreeSlotsInRoomToLesson> freeSlotsInRoomToLesson = new List <FreeSlotsInRoomToLesson>(); foreach (Timetable tt in roomsTimetables) { if (tt.getRoom().getRoomType().Equals(lesson.getRoomType()) && tt.getRoom().getAmount() >= lesson.getGroup().getAmount()) { freeSlotsInRoomToLesson.Add(new FreeSlotsInRoomToLesson(tt.getFreeSlotsToLesson(lesson), tt.getRoom())); } } // sloty w sali i w planie nauczyciela w ktorych mozna wstawic dana lekcje FreeSlotsToLesson freeSlotsToLesson = new FreeSlotsToLesson(teacherFreeSlots, lesson, freeSlotsInRoomToLesson); if (freeSlotsToLesson.slots.Count == 0) { TimeSlot slotToChange = null; result = false; foreach (TimeSlot rts in freeSlotsToLesson.getSlotsFromRoomLists()) { if (teacherTT.getLessons(rts.day, rts.hour).Count == 1) { Lesson lessonToChange = teacherTT.getLessons(rts.day, rts.hour)[0]; if (level < 5) { result = removeLessonsAndFindNewPosition3(lessonToChange, ref allLesson, 4); } if (result) { slotToChange = rts; break; } } } if (!result) { //Console.WriteLine("error : freeSlotsToLesson.slots.Count = 0"); return(result); } freeSlotsToLesson.slots.Add(slotToChange); } // lista slotów skąd może być ściągnięta lekcja w planie dla grupy List <TimeSlot> slots = new List <TimeSlot>(); foreach (TimeSlot ts in freeSlotsToLesson.slots) { if (groupTT.getLessons(ts.day, ts.hour).Count == 1) { if (groupTT.getLessons(ts.day, ts.hour)[0].getSize() == 1) { slots.Add(ts); } } } if (slots.Count == 0) { //slots.Add() return(false); } //znajdujemy zastępczy slot dla losowej lekcji while (slots.Count > 0) { TimeSlot slot = slots[rand.Next(0, slots.Count - 1)]; slots.Remove(slot); //szukam zastepczego slotu Lesson lessonToChange = groupTT.getLessons(slot.day, slot.hour)[0]; List <FreeSlotsInRoomToLesson> freeSlotsInRoomToLessonTMP = new List <FreeSlotsInRoomToLesson>(); foreach (Timetable tt in roomsTimetables) { if (tt.getRoom().getRoomType().Equals(lessonToChange.getRoomType()) && tt.getRoom().getAmount() >= lessonToChange.getGroup().getAmount()) { freeSlotsInRoomToLesson.Add(new FreeSlotsInRoomToLesson(tt.getFreeSlotsToLesson(lessonToChange), tt.getRoom())); } } List <TimeSlot> groupSlots = groupTT.getFreeSlotsToLesson(lessonToChange); List <TimeSlot> teacherSlots = lessonToChange.getTeacher().getTimetable().getFreeSlotsToLesson(lessonToChange); List <TimeSlot> theSameSlots = getTheSameSlots(groupSlots, teacherSlots); FreeSlotsToLesson freeSlotsToLessonTMP = new FreeSlotsToLesson(theSameSlots, lessonToChange, freeSlotsInRoomToLesson); if (freeSlotsToLessonTMP.slots.Count > 0) { Room bestRoom = null; TimeSlot bestSlot = this.getBestTimeSlot(freeSlotsToLessonTMP.slots, freeSlotsToLessonTMP.roomSlots, ref bestRoom); //Console.WriteLine("found : " + lessonToChange.ToString()); lessonToChange.setRoom(bestRoom); lessonToChange.addLessonToTimetableAndBlockSlot(bestSlot.day, bestSlot.hour); lessonToChange.removeLessonFromTimetable(slot.day, slot.hour); bestRoom = freeSlotsToLesson.getRoomsFromSlot(slot)[0]; lesson.setRoom(bestRoom); lesson.addLessonToTimetableAndBlockSlot(slot.day, slot.hour); result = true; break; } } int i = 0;; while (!result && slots.Count > i) { TimeSlot slot = slots[i]; Lesson lessonToChange = groupTT.getLessons(slot.day, slot.hour)[0]; if (level < 5) { result = removeLessonsAndFindNewPosition3(lessonToChange, ref allLesson, 3); } } //Console.WriteLine("<<<<<<<<<<<<<<<<<<<<<<<<<<<removeLessonsAndFindNewPosition"); return(result); }