public void Init() { string[] diversRaw = ReadFile(diversFilePath); string[] scheduleRaw = ReadFile(diveScheduleFilePath); outFilePath = GetOutFilePath(outFilePath); if (diversRaw != null && scheduleRaw != null) { AddDiversToList(diversRaw); AddDiveSchedule(scheduleRaw); DivingClubSingleton divingClub = DivingClubSingleton.GetInstance(); DiveAlgorithmFactory diveFactory = new DiveAlgorithmFactory(); DiveAlgorithmProduct algorithm = diveFactory.createAlgorithm(algorithmName); AddDiversToDiveSchedule(algorithm); Writer.CreateFile(outFilePath); Writer.WriteDiveSchedule(diveSchedule.AsEnumerable(), outFilePath); Writer.WriteDivers(divers.AsEnumerable(), outFilePath); } }
/// <summary> /// For each dive schedule run each algorithm and calculate safety measure sum for each dive /// After that choose algorithm with smallest safety measure sum because it represents highest level of safety /// </summary> /// <param name="algorithms">Array of algorithm names</param> private void TestAlgorithms(List <string> algorithms) { AlgorithmFactoryAbstract diveFactory = new DiveAlgorithmFactory(); // We'll save generated diver groups into dictionary with algorithm name as key Dictionary <String, List <PairHelper> > diverGroupsByAlgorithm = new Dictionary <string, List <PairHelper> >(); // Test each algorithm for each dive for (int i = 0; i < diveSchedule.Count(); i++) { // safety measure sum for dive float safetyMeasureMax = 0; float safetyMeasureForDive; string chosenAlgorithmName = ""; // Max dive depth float maxDiveDepth = diveSchedule[i].maxDepth; foreach (string algorithm in algorithms) { DiveAlgorithmProductAbstract currentAlgorithm = diveFactory.createAlgorithm(algorithm); // Generate dive groups with passed algorithm List <PairHelper> diveGroup = currentAlgorithm.GetDivePairs(diveSchedule[i].divers, diveSchedule[i]); // Add dive group to dictionary diverGroupsByAlgorithm.Add(algorithm, diveGroup); // Calculate safety measure sum for group safetyMeasureForDive = PairHelper.CalculateSafetyMeasureSum(diveGroup); // If safetyMeasureForGroup is greater than currently max safetyMeasureSum then safetyMeasureForGroup is max if (safetyMeasureForDive > safetyMeasureMax) { safetyMeasureMax = safetyMeasureForDive; chosenAlgorithmName = algorithm; } } // Add dive groups to dive diveSchedule[i].diveGroups = diverGroupsByAlgorithm[chosenAlgorithmName]; // Add safety measure to dive diveSchedule[i].safetyMeasure = safetyMeasureMax; // Add used algorithm name to dive diveSchedule[i].algorithmName = chosenAlgorithmName; // Add dive to each diver foreach (Diver d in diveSchedule[i].divers) { d.AddDive(diveSchedule[i]); } // Add dive to dive club and to national diving association divingClub.SetDive(diveSchedule[i]); // Clear dictionary with dive groups because it needs to be empty for next iteration diverGroupsByAlgorithm.Clear(); } }