private CourseOffering CreateCourseOffering(Course course, Section section, AcademicSemester currentActiveSemester)
        {
            var courseOffering = new CourseOffering
            {
                SectionId          = section.Id,
                CourseId           = course.Id,
                AcademicSemesterId = currentActiveSemester.Id
            };

            if (course.Lecture > 0)
            {
                courseOffering.Instructors.Add(new InstructorAssignment
                {
                    TypeId = 1
                });
                courseOffering.Rooms.Add(new CourseOfferingRoomAssignment
                {
                    TypeId = 1
                });
            }

            if (course.Lab > 0)
            {
                courseOffering.Instructors.Add(new InstructorAssignment
                {
                    TypeId = 2
                });
                courseOffering.Rooms.Add(new CourseOfferingRoomAssignment
                {
                    TypeId    = 2,
                    LabTypeId = course.LabTypeId
                });
            }

            if (course.Tutor > 0)
            {
                courseOffering.Instructors.Add(new InstructorAssignment
                {
                    TypeId = 3
                });
                courseOffering.Rooms.Add(new CourseOfferingRoomAssignment
                {
                    TypeId = 3
                });
            }

            return(courseOffering);
        }
        public ActionResult SaveSemester(AcademicSemestersViewModel model)
        {
            if (ModelState.IsValid)
            {
                var academicSemester = new AcademicSemester
                {
                    AcademicYearId  = model.AcademicYearId,
                    CurrentSemester = true,
                    Semester        = model.Semester,
                    StartDate       = model.StartDate,
                    EndDate         = model.EndDate
                };

                var academicSemesterStartEvent = new AcademicEvent
                {
                    Subject     = "Academic Semester Start Date",
                    Description = $"Semester {academicSemester.AcademicSemesterTitle} Start Date",
                    Start       = model.StartDate
                };

                var academicSemesterEndEvent = new AcademicEvent
                {
                    Subject     = "Academic Semester End Date",
                    Description = $"Semester {academicSemester.AcademicSemesterTitle} End Date",
                    Start       = model.EndDate
                };

                var previousSemesters = _context.AcademicSemesters.Where(s => s.CurrentSemester);

                foreach (var semester in previousSemesters)
                {
                    semester.CurrentSemester = false;
                }

                _context.AcademicSemesters.Add(academicSemester);
                _context.AcademicEvents.Add(academicSemesterStartEvent);
                _context.AcademicEvents.Add(academicSemesterEndEvent);
                _context.SaveChanges();

                return(RedirectToAction("Index", "Home"));
            }

            return(View("Index"));
        }
Exemple #3
0
        private async Task <ICollection <Schedule> > InitializePopulation(Section section, ScheduleConfiguration scheduleConfiguration, AcademicSemester currentSemester)
        {
            ICollection <Schedule> population = new Collection <Schedule>();
            var weekDays = await unitOfWork.WeekDays.GetFirstWeekDays(scheduleConfiguration.NumberOfDaysPerWeek);

            for (int i = 0; i < GeneticAlgorithmConf.POPULATION_SIZE; i++)
            {
                var schedule = helper.InitializeScheduleForSection(section, scheduleConfiguration, weekDays.ToList(), currentSemester);
                population.Add(schedule);
            }

            return(population);
        }
        public Schedule InitializeScheduleForSection(Section section, ScheduleConfiguration scheduleConfiguration, IList <WeekDay> weekDays, AcademicSemester academicSemester)
        {
            var schedule = new Schedule(section, scheduleConfiguration, weekDays, academicSemester);

            foreach (var courseOffering in section.CourseOfferings)
            {
                var lecture = courseOffering.Course.Lecture;
                var tutor   = courseOffering.Course.Tutor;
                var lab     = courseOffering.Course.Lab;


                while (lecture > 0)
                {
                    var randDay = Helper.GetRandomInteger(scheduleConfiguration.NumberOfDaysPerWeek);

                    var lectureInstructor = GetInstructor(courseOffering, LECTURE_ID);

                    var lectureRoom = GetRoom(courseOffering, LECTURE_ID);

                    var scheduleEntry = CreateScheduleEntry(courseOffering.Course, lectureInstructor, lectureRoom, LECTURE_ID);

                    if (lecture >= GeneticAlgorithmConf.MAX_CONSECUTIVE_LECTURE)
                    {
                        scheduleEntry.Duration = GeneticAlgorithmConf.MAX_CONSECUTIVE_LECTURE;
                        lecture -= schedule.AddScheduleEntry(scheduleEntry, randDay);
                    }
                    else if (lecture > 0)
                    {
                        scheduleEntry.Duration = GeneticAlgorithmConf.MAX_CONSECUTIVE_LECTURE - 1;
                        lecture -= schedule.AddScheduleEntry(scheduleEntry, randDay);
                    }
                }

                while (tutor > 0)
                {
                    var randDay = Helper.GetRandomInteger(scheduleConfiguration.NumberOfDaysPerWeek);

                    var tutorInstructor = GetInstructor(courseOffering, TUTOR_ID);

                    var tutorRoom = GetRoom(courseOffering, TUTOR_ID);

                    var scheduleEntry = CreateScheduleEntry(courseOffering.Course, tutorInstructor, tutorRoom, TUTOR_ID, duration: 1);

                    tutor -= schedule.AddScheduleEntry(scheduleEntry, randDay);
                }

                while (lab > 0)
                {
                    var randDay = Helper.GetRandomInteger(scheduleConfiguration.NumberOfDaysPerWeek);

                    var labInstructor = GetInstructor(courseOffering, LAB_ID);

                    var labRoom = GetRoom(courseOffering, LAB_ID);

                    var scheduleEntry = CreateScheduleEntry(courseOffering.Course, labInstructor, labRoom, LAB_ID);

                    if (lab >= GeneticAlgorithmConf.MAX_CONSECUTIVE_LAB)
                    {
                        scheduleEntry.Duration = GeneticAlgorithmConf.MAX_CONSECUTIVE_LAB;
                        lab -= schedule.AddScheduleEntry(scheduleEntry, randDay);
                    }
                    else if (lab >= (GeneticAlgorithmConf.MAX_CONSECUTIVE_LAB - 1))
                    {
                        scheduleEntry.Duration = GeneticAlgorithmConf.MAX_CONSECUTIVE_LAB - 1;
                        lab -= schedule.AddScheduleEntry(scheduleEntry, randDay);
                    }
                }
            }
            return(schedule);
        }