Esempio n. 1
0
        private async void btnRunAlgorithm_Click(object sender, RoutedEventArgs e)
        {

            btnRunAlgorithm.IsEnabled = false;
            if (!allowUserInteraction) return;
            allowUserInteraction = false;

            try
            {


                AnimateStatusObjectModel model = new AnimateStatusObjectModel();

                Infrastructures.Algorithm.MainAlgorithm mainAlgorithm = new Infrastructures.Algorithm.MainAlgorithm(maxCntSuggestion);

                Task.Run(() => { mainAlgorithm.Run(offeredCourses, mainCurriculum, minUnits, maxUnits, exampCollideChecking, Properties.Settings.Default.AlgorithmMaxProcessingTimeMS, model); });


                await AlgorithmAnimation.Animate(this, canvasAlgorithmMsg, Properties.Settings.Default.AlgorithmAnimationEffectStatus, model);

                Directory.EnumerateFiles(DirectoryManager.LastAlgorithmExeOutputs).ToList().ForEach(c =>
                {
                    File.Delete(c);
                });

                mainAlgorithm.ChoosedWeeklyProgram.Sort();
                for (int i = 0; i < mainAlgorithm.ChoosedWeeklyProgram.Count; i++)
                {
                    var p = mainAlgorithm.ChoosedWeeklyProgram[i];

                    OfferedWeeklyProgram newProgram = new OfferedWeeklyProgram();
                    newProgram.DataSource = new List<GoalVersionOfferedCoursesRow>();
                    int units = 0;
                    DfsTopologicalSortAlgorithm.DfsTopologicalSort(p.WeeklyProgram.Columns).ForEach(c =>
                    {
                        newProgram.DataSource.Add(c.GoalVersionOfferedCourseRow);
                        units += c.OfferedCourse.Course.Units;
                    });
                    newProgram.Description = "";
                    newProgram.NumberOfUnits = units;
                    newProgram.UserScore = 0;
                    newProgram.TermNumber = termNumber;
                    newProgram.Score = p.WeeklyProgramScore;

                    string name = Guid.NewGuid().ToString();
                    FileServiceProvider.SerializeToXmlFile(DirectoryManager.LastAlgorithmExeOutputs + name + ".xml", newProgram);
                    Thread.Sleep(10);
                }
            }
            catch { }

            allowUserInteraction = true;
            btnRunAlgorithm.IsEnabled = true;
        }
Esempio n. 2
0
        // <param name="mainCurriculum">updated curriculum</param>
        public void Run(List <OfferedCourse> inputs, MainCurriculum mainCurriculum, int minUnitsRequired, int maxUnitsRequired, bool examCollideCheck, int timeout, AnimateStatusObjectModel model)
        {
            ChoosedWeeklyProgram.Clear();

            double[] courseScore = new double[mainCurriculum.Courses.Count];


            double numberOfGreenUnits = 0;

            List <OfferedCourse> greenCourses = new List <OfferedCourse>();
            List <OfferedCourse> whiteCourses = new List <OfferedCourse>();//white courses that have at least one white row

            int greenUnits = 0;

            for (int i = 0; i < inputs.Count; i++)
            {
                var offeredCourse = inputs[i];

                if (offeredCourse.Color == ReductionStep2ColorStatus.Green)
                {
                    greenCourses.Add(offeredCourse);
                    greenUnits += offeredCourse.Course.Units;
                }
                else if (offeredCourse.Color == ReductionStep2ColorStatus.WHITE)
                {
                    for (int r = 0; r < offeredCourse.OfferedCourseRows.Count; r++)
                    {
                        var offeredCourseRow = offeredCourse.OfferedCourseRows[r];
                        if (offeredCourseRow.Color == ReductionStep2ColorStatus.WHITE)
                        {
                            whiteCourses.Add(offeredCourse);
                            break;
                        }
                    }
                }

                var course = offeredCourse.Course;

                courseScore[course.Id] += (course.Units * 2 - 1) * 1;

                for (int c = 0; c < course.PrerequisiteCourses.Count; c++)
                {
                    var preCourse = course.PrerequisiteCourses[c];

                    if (!preCourse.IsPassed && preCourse.IsAvailable())
                    {
                        if (preCourse.NumberOfFailed > 1)
                        {
                            courseScore[preCourse.Id] += (course.Units * 2 - 1) * 0.20;
                        }
                        else
                        {
                            courseScore[preCourse.Id] += (course.Units * 2 - 1) * 0.25;
                        }
                    }
                }
                for (int c = 0; c < course.RequisiteCourses.Count; c++)
                {
                    var reqCourse = course.RequisiteCourses[c];

                    if (!reqCourse.IsPassed && reqCourse.IsAvailable())
                    {
                        courseScore[reqCourse.Id] += (course.Units * 2 - 1) * 0.20;
                    }
                }
            }

            double totalScore = 0;

            whiteCourses.ForEach(i =>
            {
                totalScore += courseScore[i.Course.Id];
            });

            List <Box> greenCoursesBoxes = new List <Box>();

            greenCourses.ForEach(gc =>
            {
                numberOfGreenUnits += gc.Course.Units;
                Box b = ReductionStep2ServiceProvider.CreateBoxForOfferedCourse(gc);
                greenCoursesBoxes.Add(b);
            });

            if (greenCoursesBoxes.Count > 0)
            {
                List <Box> res = ReductionStep2ServiceProvider.Validate(greenCoursesBoxes, examCollideCheck);
                if (res != null)
                {
                    greenCoursesBoxes.Clear();
                    greenCoursesBoxes.Add(res[0]);
                }
            }

            new AlgorithmLogicProvider().Run(courseScore, whiteCourses, greenCourses, minUnitsRequired, maxUnitsRequired, greenUnits, totalScore, mainCurriculum, greenCoursesBoxes, examCollideCheck, ChoosedWeeklyProgram, timeout);

            if (ChoosedWeeklyProgram.Count > 0)
            {
                model.Succ = true;
            }
            else
            {
                model.Succ = false;
            }
        }//end method Run