Beispiel #1
0
        private List <Filling <T> > GetFillings <T>(List <Filling <T> > fillingsOld) where T : class, IAbbreviation
        {
            List <Filling <T> > fillingsNew = new List <Filling <T> >();

            foreach (var fillingOld in fillingsOld)
            {
                Filling <T> fillingNew = new Filling <T>();
                fillingNew.Value            = fillingOld.Value;
                fillingNew.PossibleFillings = new List <PossibleFilling>();
                foreach (var fillingOldPossibleFilling in fillingOld.PossibleFillings)
                {
                    if (fillingOldPossibleFilling.BusyPair != null)
                    {
                        BusyPair busyPairFree = new BusyPair(new Classroom(), fillingOldPossibleFilling.BusyPair.Subject, new Group());
                        fillingNew.PossibleFillings.Add(new PossibleFilling(fillingOldPossibleFilling.Pair, fillingOldPossibleFilling.StudyDay)
                        {
                            BusyPair = busyPairFree
                        });
                    }
                    else
                    {
                        fillingNew.PossibleFillings.Add(new PossibleFilling(fillingOldPossibleFilling.Pair, fillingOldPossibleFilling.StudyDay));
                    }
                }
                fillingsNew.Add(fillingNew);
            }
            return(fillingsNew);
        }
Beispiel #2
0
        public object Clone()
        {
            var newClassroom = Classroom.Clone() as Classroom;

            var newSubject = Subject.Clone() as Subject;
            var newGroups  = Groups.Clone() as Group[];

            BusyPair newBusyPair = new BusyPair(newClassroom, newSubject, newGroups);

            return(newBusyPair);
        }
Beispiel #3
0
        /// <summary>
        /// Добавить один предмет в учебный план и выводит которые не получилось добавить
        /// </summary>
        /// <param name="MaxCurricula"> План для добавления предмета </param>
        /// <returns> Выводить список планов которые не удалось добавить</returns>
        private List <Curriculum> AddOneSubjectInCurriculum(CurriculaWithAmountPair MaxCurricula)
        {
            //Пустой план не получившийся добавить
            List <Curriculum> curriculaNot = new List <Curriculum>();
            //a. Из элемента плана понимаем что за предмет и какая группа
            var group   = MaxCurricula.GetGroups();
            var subject = MaxCurricula.GetSubject();
            //c. Выбираем аудитории с кол-во мест больше чем в группе
            //(так как они отсортированы по возрастанию то просто номер первой подходящей аудитории)
            //Номер Аудитории из массива которая сейчас будет рассматриваться -1 значит нет такой аудитории

            int NumClassroom = Classrooms.FindIndex(x => x.NumberOfSeats >= group.Sum(y => y.NumberOfPersons));
            //Теперь для каждой  группы подцепляем занятость
            var fillingGroup = FillingGroups.Where(x => group.Contains(x.Value)).ToList();
            //Добавилась ли пара
            bool success = false;

            //i. Цикл по расписанию
            if (NumClassroom != -1)
            {
                for (int cu = 0; cu < NumberStudyDays; cu++)
                {
                    //d. Цикл по аудиториям
                    for (int cl = NumClassroom; cl < Classrooms.Count; cl++)
                    {
                        //Теперь для аудитории подцепляем занятость
                        var fillingClassroom = FillingClassrooms.First(x => x.Value.ClassroomId == Classrooms[cl].ClassroomId);
                        //Условия что в этот день в эту пару группы не заняты
                        bool FG = true;
                        foreach (var fillingGroup1 in fillingGroup)
                        {
                            bool FG1 = fillingGroup1[cu].BusyPair == null;
                            if (!FG1)
                            {
                                FG = false;
                                break;
                            }
                        }
                        //Условия что в этот день в эту пару классная комната не занята
                        bool FC = fillingClassroom[cu].BusyPair == null;
                        //ToDO: в день не должно быть более 2-х одинаковых пар
                        //все пары в этот день у этой группы
                        var allPairsInGroup = fillingGroup[0].PossibleFillings.Where(x => x.StudyDay == fillingGroup[0].PossibleFillings[cu].StudyDay).ToArray();
                        //одинаковые пары в день
                        int numOfThisLesson = allPairsInGroup.Where(x => x.BusyPair != null && x.BusyPair.Subject == subject).Count();
                        //Кол-во пар в день не более 2
                        bool FNT = true;
                        if (numOfThisLesson >= 2)
                        {
                            FNT = false;
                        }
                        //1. Если в этот день свободна и группа и преподаватель и аудитория
                        if (FNT && FG && FC)
                        {
                            BusyPair busyPair = new BusyPair(Classrooms[cl], subject, group);
                            //a. Добавляем им пару

                            foreach (var fillingGroup1 in fillingGroup)
                            {
                                fillingGroup1[cu].BusyPair = busyPair;
                            }
                            fillingClassroom[cu].BusyPair = busyPair;
                            //b. Заканчиваем 2 цикла(по расписанию и по аудиториям)
                            success = true;
                            break;
                        }
                        //Если закончено
                    }

                    //Цикл по расписанию закончен
                    //b. Заканчиваем 2 цикла(по расписанию и по аудиториям) если пара добавилась
                    if (success)
                    {
                        break;
                    }
                }
            }
            //Цикл аудиторий закончен

            //e. Если не смогли добавить то
            if (!success)
            {
                //Так как несколько планов то проходим по всем
                for (int i = 0; i < MaxCurricula.GetNumberPlan(); i++)
                {
                    //индекс в учебном плане
                    int ind = curriculaNot.FindIndex(x => x.CurriculumId == MaxCurricula.GetCurriculumId()[i]);
                    //i. Если был  такой элемент

                    if (ind == -1)
                    {
                        //1. Сохраняем что не смогли добавить в кол-ве 1 пара
                        curriculaNot.Add(MaxCurricula.NewCurriculum(i, 1));
                    }
                    //Иначе если не было такого элемента
                    else
                    {
                        //1. Добавляем к элементу 1 пару
                        curriculaNot[ind].Number++;
                    }
                    //Если закончено
                }
            }
            //Если закончено
            //план не получившийся добавить
            return(curriculaNot);
        }