Example #1
0
 public int lessonComparator(Lesson l1, Lesson l2)
 {
     return(subGroupLessonComparator(l1, l2));
 }
Example #2
0
        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);
        }