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; }
// <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