// public int sizeLessonComparator(Lesson l1, Lesson l2) { if (l1.getSize() > l2.getSize()) { return(1); } else if (l1.getSize() < l2.getSize()) { return(-1); } else { return(amountLessonComparator(l1, l2)); } }
public void crossSchoolTimeTables(SchoolTimeTable stt1, SchoolTimeTable stt2) { foreach (TimeTable tt1 in stt1.groupTimeTables) { TimeTable tt2 = null; foreach (TimeTable tt2_tmp in stt2.groupTimeTables) { if (tt1.group.Equals(tt2_tmp.group)) { tt2 = tt2_tmp; break; } } if (tt2 != null) { //tt1.printTimeTable(); //tt2.printTimeTable(); List <TimeSlot> slots = getTheSameTimeSlotInTheSameLesson(tt1, tt2); foreach (TimeSlot slot in slots) { Lesson lesson = tt1.getLesson(slot.day, slot.hour)[0]; if (lesson.getSize() == 1) { TimeTable teacherTimeTable = null; foreach (TimeTable teacherTT in this.teacherTimeTables) { if (teacherTT.Equals(lesson.getTeacher())) { teacherTimeTable = teacherTT; break; } } TimeTable groupTimeTable = null; foreach (TimeTable groupTT in this.groupTimeTables) { if (groupTT.Equals(lesson.getGroup())) { groupTimeTable = groupTT; break; } } teacherTimeTable.addLesson(lesson, slot.day, slot.hour); groupTimeTable.addLesson(lesson, slot.day, slot.hour); } } } } lessons = getListOfLessonToInsert(); this.generateSchoolTimeTable(); //this.printTimeTable(); }
public Boolean removeLessonsAndFindNewPosition(Lesson lesson) { bool result = true; TimeTable groupTT = lesson.getGroup().getTimeTable(); //plan zajęć dla grupy szukanej lekcji TimeTable teacherTT = lesson.getTeacher().getTimeTable(); //plan zajec dla nauczyciela szukanej lekcji List <TimeSlot> groupSlots = groupTT.getFreeTimeSlot(lesson.getSize()); //wolne sloty grupy List <TimeSlot> teacherSlots = teacherTT.getFreeTimeSlot(lesson.getSize()); //wolne sloty nauczyciela List <FreeSlotsToLesson> freeSlotsToLesson = new List <FreeSlotsToLesson>(); List <TimeSlot> slotsToChange = new List <TimeSlot>(); TimeSlot bestSlot = null; Lesson lessonToMove = null; for (int d = 0; d < ConstVariable.NUMBER_OF_DAYS; d++) { for (int h = 0; h < ConstVariable.NUMBER_OF_SLOTS_IN_DAY; h++) { ////pobranie wolnych sal i grupy/nauczyciela ////porównanie wolnych slotów nauczyciela, grupy i sal ////dodanie do listy if (true) { slotsToChange.Add(new TimeSlot(d, h)); } } } bestSlot = slotsToChange[rand.Next(slotsToChange.Count - 1)]; //wylosowanie z listy najlepszego slotu //wstawienie zmienianej lekcji lessonToMove = groupTT.getLesson(bestSlot.day, bestSlot.hour)[0]; //// //usuniecie zmienianej lekcji z poprzedniej pozycji groupTT.removeLesson(lessonToMove, bestSlot.day, bestSlot.hour); teacherTT.removeLesson(lessonToMove, bestSlot.day, bestSlot.hour); ////room //wstawienie w wybrany slot lekcji do wstawienia groupTT.addLesson(lesson, bestSlot.day, bestSlot.hour); teacherTT.addLesson(lesson, bestSlot.day, bestSlot.hour); ////room return(result); /* * Boolean result = true; * Boolean isGroupHaveMoreSlots = true; * List<FreeSlotsToLesson> freeSlotsToLesson = new List<FreeSlotsToLesson>(); * * TimeTable groupTT = lesson.getGroup().getTimeTable(); //plan zajęć dla grupy szukanej lekcji * TimeTable teacherTT = lesson.getTeacher().getTimeTable(); //plan zajec dla nauczyciela szukanej lekcji * List<TimeSlot> groupSlots = groupTT.getFreeTimeSlot(lesson.getSize()); //wolne sloty grupy * List<TimeSlot> teacherSlots = teacherTT.getFreeTimeSlot(lesson.getSize()); //wolne sloty nauczyciela * * List<FreeSlotsInRoomToLesson> freeSlotsInRoomToLesson = new List<FreeSlotsInRoomToLesson>(); //lista wolnych slotów sal pasujących do lekcji i grupy * foreach (TimeTable tt in roomTimeTables) * { * if (tt.room.type.Equals(lesson.getSubject().getRoomType()) && tt.room.amount >= lesson.getGroup().amount) * { * freeSlotsInRoomToLesson.Add(new FreeSlotsInRoomToLesson(tt.getFreeTimeSlot(), tt.room)); * } * } * * List<TimeSlot> theSameSlots = getTheSameSlots(groupSlots, teacherSlots); //generuje liste wolnych slotów dla grupt i nauczyciela i sprawdza wolne sale * freeSlotsToLesson.Add(new FreeSlotsToLesson(theSameSlots, lesson, freeSlotsInRoomToLesson)); //generuje lekcje wraz z listą wolnych slotów * * * if (getTheSameSlots(groupSlots,teacherSlots).Count == 0) { * TimeTable firstTT = groupTT; * TimeTable secondTT = teacherTT; * isGroupHaveMoreSlots = true; * * if (groupSlots.Count > teacherSlots.Count) { * firstTT = teacherTT; * secondTT = groupTT; * isGroupHaveMoreSlots = false; * } * * //first - plan który posiada mniej wolnych slotów * //second - plan który posiada więcej wolnych slotow * // * //w "second" szukamy lekcji mozliwych dozamiany w slotach planu "first" * * * List<TimeSlot> firstSlots = firstTT.getFreeTimeSlot(lesson.getSize()); * List<TimeSlot> secondSlots = secondTT.getFreeTimeSlot(lesson.getSize()); * // do poprawienia * // dopisac uwzglednianie wiekszych lekcji * // zwalnianie slotow przy zamianie * // nie zmieniac wiekszych slotow * * while (firstSlots.Count > 0) { * int slotsIndex = rand.Next(0, firstSlots.Count); * TimeSlot timeSlotToClear = firstSlots[slotsIndex]; * Lesson checkedLesson = secondTT.getDays()[timeSlotToClear.day].getSlots()[timeSlotToClear.hour].getLesson(0); * * List<TimeSlot> slotsToCompare; * if (isGroupHaveMoreSlots) { * slotsToCompare = checkedLesson.getGroup().getTimeTable().getFreeTimeSlot(); * } else { * slotsToCompare = checkedLesson.getTeacher().getTimeTable().getFreeTimeSlot(); * } * * List<TimeSlot> freeSlots = getTheSameSlots(slotsToCompare, secondSlots); * if (freeSlots.Count > 0 ) { * int newSlotIndex = rand.Next(0, freeSlots.Count); * * // wstawaimy lekcje do przeniesienia * checkedLesson.getGroup().getTimeTable().addLesson(checkedLesson, freeSlots[newSlotIndex].day, freeSlots[newSlotIndex].hour); * checkedLesson.getTeacher().getTimeTable().addLesson(checkedLesson, freeSlots[newSlotIndex].day, freeSlots[newSlotIndex].hour); * // zwalniamy wolny slot * checkedLesson.getGroup().getTimeTable().removeLesson(checkedLesson, timeSlotToClear.day, timeSlotToClear.hour); * checkedLesson.getTeacher().getTimeTable().removeLesson(checkedLesson, timeSlotToClear.day, timeSlotToClear.hour); * // ustawiam nowa lekcje * lesson.getGroup().getTimeTable().addLesson(lesson, freeSlots[newSlotIndex].day, freeSlots[newSlotIndex].hour); * lesson.getTeacher().getTimeTable().addLesson(lesson, freeSlots[newSlotIndex].day, freeSlots[newSlotIndex].hour); * //Console.WriteLine("find free slots"); * break; * } * * * firstSlots.RemoveAt(slotsIndex); * } * if (firstSlots.Count == 0) * { * //Console.WriteLine("NOT FOUND"); * * // szukanie wgłąb * firstSlots = firstTT.getFreeTimeSlot(); * while (firstSlots.Count > 0) * { * int slotsIndex = rand.Next(0, firstSlots.Count); * TimeSlot timeSlotToClear = firstSlots[slotsIndex]; * Lesson checkedLesson = secondTT.getDays()[timeSlotToClear.day].getSlots()[timeSlotToClear.hour].getLesson(0); * * if (removeLessonsAndFindNewPosition(checkedLesson)) * { * removeLessonsAndFindNewPosition(lesson); * break; * } * * firstSlots.RemoveAt(slotsIndex); * } * * } * * } * * return result; * */ }