示例#1
0
        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();
            }
        }