Exemple #1
0
        public int getCountSubGroupLesson(Lesson lesson)
        {
            int count = 0;

            foreach (Day d in this.getGroup().getParent().getTimetable().getDays())
            {
                foreach (Slot s in d.getSlots())
                {
                    if (!s.isEmpty())
                    {
                        if (s.getLesson(0).getGroup().getParent() != null)
                        {
                            if (lesson.getGroup().getParent() != null)
                            {
                                if (s.getLesson(0).getGroup().getSubGroupsIndex() != lesson.getGroup().getSubGroupsIndex())
                                {
                                    if (s.getLesson(0).getGroup().getSubGroupId() == lesson.getGroup().getSubGroupId())
                                    {
                                        count++;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return(count);
        }
 public int subGroupLessonComparator(Lesson l1, Lesson l2)
 {
     if (l1.getGroup().getParent() != null)
     {
         if (l2.getGroup().getParent() != null)
         {
             if (l1.getGroup().getParent().getName().CompareTo(l2.getGroup().getParent().getName()) == 0)
             {
                 return(l1.getGroup().getName().CompareTo(l2.getGroup().getName()));
             }
             else
             {
                 return(l1.getGroup().getParent().getName().CompareTo(l2.getGroup().getParent().getName()));
             }
         }
         else
         {
             return(1);
         }
     }
     else if (l2.getGroup().getParent() != null)
     {
         return(-1);
     }
     else
     {
         return(sizeLessonComparator(l1, l2));
     }
 }
Exemple #3
0
        public TimeSlot getSubGroupFreeSlotToLesson(Lesson lesson)
        {
            if (parent != null)
            {
                foreach (Group g in parent.getSubGroup())
                {
                    if (lesson.getGroup().getSubGroupsIndex() == g.getSubGroupsIndex() &&
                        !g.Equals(lesson.getGroup()))
                    {
                        // podgrupy tejsamej kalegorii

                        if (g.getTimetable().getSlotsWithLesson().Count > 0)
                        {
                            foreach (TimeSlot ts in g.getTimetable().getSlotsWithLesson())
                            {
                                if (lesson.getGroup().getTimetable().getLessons(ts.day, ts.hour).Count == 0)
                                {
                                    return(ts);
                                }
                            }
                        }
                    }
                }
            }

            return(null);
        }
Exemple #4
0
        public List <TimeSlot> getFreeSlotsWithSubGroupLessons(Lesson lesson)
        {
            List <TimeSlot> freeSlots = new List <TimeSlot>();
            int             day       = 0;
            int             hour      = 0;

            foreach (Day d in this.getGroup().getParent().getTimetable().getDays())
            {
                foreach (Slot s in d.getSlots())
                {
                    bool result = true;
                    if (s.isEmpty())
                    {
                        result = false;
                    }

                    foreach (Lesson l in s.getLessons())
                    {
                        if (l.getGroup().getParent() != null)
                        {
                            if (lesson.getGroup().getParent() != null)
                            {
                                if (l.getGroup().getSubGroupsIndex() == lesson.getGroup().getSubGroupsIndex())
                                {
                                    if (l.getGroup().getSubGroupId() == lesson.getGroup().getSubGroupId())
                                    {
                                        result = false;
                                    }
                                }
                            }
                        }
                        else
                        {
                            result = false;
                        }
                    }

                    if (result)
                    {
                        freeSlots.Add(new TimeSlot(day, hour));
                    }

                    hour++;
                }
                hour = 0;
                day++;
            }


            if (freeSlots.Count == 0)
            {
                for (int h = 0; h < numberOfSlots; ++h)
                {
                    for (int d = 0; d < numberOfDays; ++d)
                    {
                        if ((days[d].getSlot(h).isEmpty() ||
                             (getLessons(d, h)[0].getGroup().getParent() != null &&
                              getLessons(d, h)[0].getGroup().getSubGroupsIndex() == lesson.getGroup().getSubGroupsIndex())) &&
                            !days[d].getSlot(h).isLocked())
                        {
                            freeSlots.Add(new TimeSlot(d, h));
                        }
                    }
                }
            }

            return(freeSlots);
        }
        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);
        }