Esempio n. 1
0
        public void Cat_INIT(double[] solutionSpace, double maxVelocity, Random rnd)
        {
            //Random positions
            for (int i = 0; i < _position.Length; i++)
            {
                _position[i] = CSOAlgorithm.RandomDouble() * (solutionSpace[1] - solutionSpace[0]) + solutionSpace[0];
            }

            //Random velocity
            for (int i = 0; i < _velocities.Length; i++)
            {
                //_velocities[i] = CSOAlgorithm.RandomDouble() * (maxVelocity - 0) + 0;
                _velocities[i] = CSOAlgorithm.RandomDouble() * (maxVelocity - (-maxVelocity)) + (-maxVelocity);
            }
        }
        private void TestCATSParam()
        {
            int dimentionIterator = 2;
            int startDimention    = 16;
            int maxDimention      = 64;
            int iterationsCount   = 100;
            int maxCats           = 80;

            UI_progress.Maximum = (int)(iterationsCount * 3 * 4);
            MultipleSolution solution = new MultipleSolution(CSOAlgorithm.Goal.Minimize, iterationsCount);

            for (int dimentionIteration = startDimention; dimentionIteration < maxDimention + 1; dimentionIteration *= dimentionIterator) //choose dim
            {
                for (int curCats = 10; curCats < maxCats; curCats *= 2)                                                                   //choose SRD
                {
                    CSOAlgorithm algorithm = new CSOAlgorithm
                                             (
                        dimentionIteration,
                        curCats,
                        SMP,
                        1.2,
                        CDC,
                        MR,
                        C,
                        MAX_VELOSITY,
                        SPC,
                        R,
                        SOLUTION_SPACE,
                        CSOAlgorithm.Goal.Minimize
                                             );

                    for (int i = 0; i < iterationsCount; i++)               //Repeat 100tests on dim,SRD
                    {
                        UI_progress.PerformStep();
                        Solution stepSolution = stepSolution = algorithm.RunCSO(ITERATONS, UI_progress, true);

                        //solution.AddFV(dimentionIteration, stepSolution.BestFV);
                        //solution.AddVector(dimentionIteration, stepSolution.BestPosition);
                        solution.AddIterations(dimentionIteration, stepSolution.Iterations);
                        //solution.AddStepFV(dimentionIteration, i, stepSolution.FitnessValues);
                    }
                }

                Logger.LogIt(dimentionIteration + " Finished");
            }
        }
        //Единичный запуск
        private void StartProgram()
        {
            //initiallize solution components
            CSOAlgorithm algorithm = new CSOAlgorithm
                                     (
                DIMENTIONS_NUMBER,
                SWARM_SIZE,
                SMP,
                SRD,
                CDC,
                MR,
                C,
                MAX_VELOSITY,
                SPC,
                R,
                SOLUTION_SPACE,
                CSOAlgorithm.Goal.Minimize
                                     );

            Solution finalSolution = algorithm.RunCSOWrong(ITERATONS, UI_progress);


            //Write all solution data to LOG file
            Logger.LogIt("Solution vector:");
            for (int i = 0; i < DIMENTIONS_NUMBER; i++)
            {
                Logger.LogIt(i + ")" + finalSolution.BestPosition[i]);
            }
            Logger.LogIt("FV=" + finalSolution.FitnessValues[finalSolution.FitnessValues.Count - 1]);

            //Add point to chart
            for (int i = 0; i < finalSolution.FitnessValues.Count; i++)
            {
                //BestFVChart.Series["BestFV"].Points.AddXY(i+1, finalSolution.FitnessValues[i]);
            }
        }
        private void TestSRDParam()
        {
            int    dimentionIterator = 2;
            int    startDimention    = 16;
            int    maxDimention      = 64;
            int    iterationsCount   = 100;
            double minSRD            = 0.2;

            UI_progress.Maximum = (int)(iterationsCount * 3 * 9);
            MultipleSolution solution = new MultipleSolution(CSOAlgorithm.Goal.Minimize, iterationsCount);

            for (int dimentionIteration = startDimention; dimentionIteration < maxDimention + 1; dimentionIteration *= dimentionIterator) //choose dim
            {
                for (double curSRD = minSRD; curSRD < 1.8; curSRD += 0.2)                                                                 //choose SRD
                {
                    CSOAlgorithm algorithm = new CSOAlgorithm
                                             (
                        dimentionIteration,
                        SWARM_SIZE,
                        SMP,
                        curSRD,
                        CDC,
                        MR,
                        C,
                        MAX_VELOSITY,
                        SPC,
                        R,
                        SOLUTION_SPACE,
                        CSOAlgorithm.Goal.Minimize
                                             );

                    for (int i = 0; i < iterationsCount; i++)               //Repeat 100tests on dim,SRD
                    {
                        UI_progress.PerformStep();
                        Solution stepSolution = stepSolution = algorithm.RunCSO(ITERATONS, UI_progress, true);

                        //solution.AddFV(dimentionIteration, stepSolution.BestFV);
                        //solution.AddVector(dimentionIteration, stepSolution.BestPosition);
                        //solution.AddIterations(dimentionIteration, stepSolution.Iterations);
                        //solution.AddStepFV(dimentionIteration, i, stepSolution.FitnessValues);

                        solution.AddSRD_FV(dimentionIteration, curSRD, stepSolution.BestFV);
                        solution.AddSRD_Acc(dimentionIteration, curSRD, stepSolution.functionAccessed);
                    }
                }

                Logger.LogIt(dimentionIteration + " Finished");
            }

            for (int dimentionIteration = startDimention; dimentionIteration < maxDimention + 1; dimentionIteration *= dimentionIterator)
            {
                Logger.LogIt(dimentionIteration.ToString());
                string dimId = "M=" + dimentionIteration;

                for (double curSRD = minSRD; curSRD < 1.8; curSRD += 0.2)
                {
                    Logger.LogIt(curSRD.ToString());
                    Logger.LogIt("Fbest " + solution.GetSRDBestFV(dimentionIteration, curSRD));
                    Logger.LogIt("Pf " + solution.GetSRD_Probability_F(dimentionIteration, curSRD));
                    Logger.LogIt("Lavg " + solution.GetSRDAvgAcc(dimentionIteration, curSRD));

                    SRD_fbest_chart.Series[dimId].Points.AddXY(curSRD, solution.GetSRDBestFV(dimentionIteration, curSRD));
                    SRD_pf_chart.Series[dimId].Points.AddXY(curSRD, solution.GetSRD_Probability_F(dimentionIteration, curSRD));
                    SRD_acc_chart.Series[dimId].Points.AddXY(curSRD, solution.GetSRDAvgAcc(dimentionIteration, curSRD));

                    Logger.LogIt("_______________________________________");
                }
            }

            SRD_pf_chart.ChartAreas[0].AxisY.Maximum = 1;

            SRD_pf_chart.ChartAreas[0].AxisX.Minimum    = 0;
            SRD_acc_chart.ChartAreas[0].AxisX.Minimum   = 0;
            SRD_fbest_chart.ChartAreas[0].AxisX.Minimum = 0;
        }
        private void MultyStartProgramm()
        {
            const int dimentionIteratior = 2;
            const int startDimention     = 2;
            const int maxDimention       = 64;
            const int iterationsCount    = 100;



            UI_progress.Maximum = (int)(iterationsCount * (Math.Sqrt(maxDimention)));
            //Probably new solution class need to be created
            MultipleSolution solution = new MultipleSolution(CSOAlgorithm.Goal.Minimize, iterationsCount);

            for (int dimentionIteration = startDimention; dimentionIteration < maxDimention + 1; dimentionIteration *= dimentionIteratior)
            {
                CSOAlgorithm algorithm = new CSOAlgorithm
                                         (
                    dimentionIteration,
                    SWARM_SIZE,
                    SMP,
                    SRD,
                    CDC,
                    MR,
                    C,
                    MAX_VELOSITY,
                    SPC,
                    R,
                    SOLUTION_SPACE,
                    CSOAlgorithm.Goal.Minimize
                                         );

                for (int i = 0; i < iterationsCount; i++)
                {
                    UI_progress.PerformStep();
                    Solution stepSolution = stepSolution = algorithm.RunCSO(ITERATONS, UI_progress, true);

                    solution.AddFV(dimentionIteration, stepSolution.BestFV);
                    solution.AddVector(dimentionIteration, stepSolution.BestPosition);
                    solution.AddIterations(dimentionIteration, stepSolution.Iterations);
                    solution.AddStepFV(dimentionIteration, i, stepSolution.FitnessValues);
                }
            }
            Logger.LogIt("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
            for (int dimentionIteration = startDimention; dimentionIteration < maxDimention + 1; dimentionIteration *= dimentionIteratior)
            {
                Logger.LogIt("DIMENTIONS: " + dimentionIteration);
                Logger.LogIt("Лучшее достигнутое значение функции: " + Math.Round(solution.GetBestFV(dimentionIteration), 3));
                OutputChart.Series["Best FV"].Points.AddXY(dimentionIteration, solution.GetBestFV(dimentionIteration));

                Logger.LogIt("Среднее значение целевой функции: " + Math.Round(solution.GetMedianFV(dimentionIteration), 3));
                Logger.LogIt("Среднеквадратическое отклониение: " + Math.Round(solution.GetFVMQD(dimentionIteration), 3));
                MedianFVChart.Series["Median FV"].Points.AddXY(dimentionIteration, solution.GetMedianFV(dimentionIteration));
                double centerFV = solution.GetMedianFV(dimentionIteration);
                double err      = solution.GetFVMQD(dimentionIteration);
                MedianFVChart.Series["CKO"].Points.AddXY(dimentionIteration, centerFV, centerFV - err, centerFV + err);
                MedianFVChart.ChartAreas[0].RecalculateAxesScale();

                Logger.LogIt("Лучшая точность локализации: " + Math.Round(solution.GetLocalisationOppraximation(dimentionIteration).Min(), 3));
                LocalizationChart.Series["Localisation"].Points.AddXY(dimentionIteration, solution.GetLocalisationOppraximation(dimentionIteration).Min()); //MAX?

                Logger.LogIt("Средняя точность локализации: " + Math.Round(solution.GetMedian_dX(dimentionIteration), 3));
                Logger.LogIt("Среднеквадратическое отклониение локализации: " + Math.Round(solution.Get_dXMQD(dimentionIteration), 3));
                mediandXchart.Series["Avg. localization"].Points.AddXY(dimentionIteration, solution.GetMedian_dX(dimentionIteration));
                double centerdX = solution.GetMedian_dX(dimentionIteration);
                double errdx    = solution.Get_dXMQD(dimentionIteration);
                mediandXchart.Series["CKO"].Points.AddXY(dimentionIteration, centerdX, centerdX - errdx, centerdX + errdx);
                mediandXchart.ChartAreas[0].RecalculateAxesScale();

                Logger.LogIt("Вероятность локализации по F: " + Math.Round(solution.FProbability(dimentionIteration), 3));
                fProbabilityChart.Series["L.Probability"].Points.AddXY(dimentionIteration, solution.FProbability(dimentionIteration));

                Logger.LogIt("Вероятность локализации по X: " + Math.Round(solution.XProbability(dimentionIteration), 3));
                dXProbabilityChart.Series["X.Probability"].Points.AddXY(dimentionIteration, solution.XProbability(dimentionIteration));

                Logger.LogIt("Максимальное число итераций: " + solution.MaximumIterations(dimentionIteration));
                MaxIterationsChart.Series["Maximum It."].Points.AddXY(dimentionIteration, solution.MaximumIterations(dimentionIteration));

                Logger.LogIt("Среднее число итераций: " + solution.AverageIterationNumber(dimentionIteration));
                Logger.LogIt("Среднеквадратическое отклониение числа итераций: " + Math.Round(solution.GetMMQD(dimentionIteration), 3));
                AverageIterationsChart.Series["Average It."].Points.AddXY(dimentionIteration, solution.AverageIterationNumber(dimentionIteration));
                double centerM = solution.AverageIterationNumber(dimentionIteration);
                double errM    = solution.GetMMQD(dimentionIteration);
                AverageIterationsChart.Series["CKO"].Points.AddXY(dimentionIteration, centerM, centerM - errM, centerM + errM);
                AverageIterationsChart.ChartAreas[0].RecalculateAxesScale();

                int    BestIterationId = solution.BestIterationId(dimentionIteration);
                string chartId         = "M=" + dimentionIteration;

                DecreaseFV2_chart.Series[chartId].IsValueShownAsLabel = false;
                DecreaseFV2_chart.Series[chartId].MarkerStep          = 20;

                for (int i = 0; i < solution.dimention_iteration_fvs[dimentionIteration][BestIterationId].Count; i++)
                {
                    DecreaseFV2_chart.Series[chartId].Points.AddXY(i, solution.dimention_iteration_fvs[dimentionIteration][BestIterationId][i]);
                }

                Logger.LogIt("_______________________________________________________________");
            }


            OutputChart.Series["Best FV"].SmartLabelStyle.Enabled = true;
            OutputChart.ChartAreas[0].AxisX.IsLogarithmic         = true;
            OutputChart.ChartAreas[0].AxisX.LogarithmBase         = 2;
            OutputChart.Series["Best FV"].IsValueShownAsLabel     = false;

            MedianFVChart.ChartAreas[0].AxisX.IsLogarithmic = true;
            MedianFVChart.ChartAreas[0].AxisX.LogarithmBase = 2;
            MedianFVChart.Series["CKO"]["PixelPointWidth"]  = "20";
            MedianFVChart.Series["CKO"].Color = Color.Black;
            MedianFVChart.Series["Median FV"].IsValueShownAsLabel = false;

            LocalizationChart.ChartAreas[0].AxisX.IsLogarithmic          = true;
            LocalizationChart.ChartAreas[0].AxisX.LogarithmBase          = 2;
            LocalizationChart.Series["Localisation"].IsValueShownAsLabel = false;

            mediandXchart.ChartAreas[0].AxisX.IsLogarithmic = true;
            mediandXchart.ChartAreas[0].AxisX.LogarithmBase = 2;
            mediandXchart.Series["CKO"]["PixelPointWidth"]  = "20";
            mediandXchart.Series["CKO"].Color = Color.Black;
            mediandXchart.Series["Avg. localization"].IsValueShownAsLabel = false;

            fProbabilityChart.ChartAreas[0].AxisX.IsLogarithmic          = true;
            fProbabilityChart.Series["L.Probability"]["PixelPointWidth"] = "15";
            fProbabilityChart.ChartAreas[0].AxisX.LogarithmBase          = 2;
            fProbabilityChart.ChartAreas[0].AxisY.Maximum = 1;

            dXProbabilityChart.ChartAreas[0].AxisX.IsLogarithmic = true;
            dXProbabilityChart.ChartAreas[0].AxisX.LogarithmBase = 2;
            dXProbabilityChart.ChartAreas[0].AxisY.Maximum       = 1;

            MaxIterationsChart.ChartAreas[0].AxisX.IsLogarithmic = true;
            MaxIterationsChart.ChartAreas[0].AxisX.LogarithmBase = 2;

            AverageIterationsChart.ChartAreas[0].AxisX.IsLogarithmic = true;
            AverageIterationsChart.ChartAreas[0].AxisX.LogarithmBase = 2;
            AverageIterationsChart.Series["CKO"]["PixelPointWidth"]  = "20";
            AverageIterationsChart.Series["CKO"].Color = Color.Black;

            SRD_acc_chart.ChartAreas[0].AxisY.Maximum = 0.01;
        }
        //Прогонка алгоритма с циклами
        private void StartProgramWithCycles()
        {
            CSOAlgorithm alg = new CSOAlgorithm
                               (
                DIMENTIONS_NUMBER,
                SWARM_SIZE,
                SMP,
                SRD,
                CDC,
                MR,
                C,
                MAX_VELOSITY,
                SPC,
                R,
                SOLUTION_SPACE,
                CSOAlgorithm.Goal.Minimize
                               );

            for (int i = 0; i < CYCLES; i++)
            {
                // cycles.Add(alg.RunCSO());
                UI_progress.PerformStep();
            }

            Solution finalSolution = new Solution(DIMENTIONS_NUMBER);

            for (int i = 0; i < ITERATONS; i++)
            {
                double sum = 0;
                for (int j = 0; j < CYCLES; j++)
                {
                    double cycleResult = cycles[j].FitnessValues[i];

                    if (ROUND_ENABLED)
                    {
                        if (Math.Abs(cycleResult) < ROUND_BOUNDARY)
                        {
                            cycleResult = 0;
                        }
                    }

                    sum += cycleResult;
                }

                finalSolution.FitnessValues.Add(sum /= CYCLES);
            }

            int M = cycles.FirstOrDefault().BestPosition.Length;

            double[] finPos = new double[M];

            foreach (Solution sol in cycles)
            {
                for (int i = 0; i < sol.BestPosition.Length; i++)
                {
                    double solutionResult = sol.BestPosition[i];

                    if (ROUND_ENABLED)
                    {
                        if (Math.Abs(solutionResult) < ROUND_BOUNDARY)
                        {
                            solutionResult = 0;
                        }
                    }

                    finPos[i] += solutionResult;
                }
            }
            Logger.LogIt("Solution vector:");
            for (int i = 0; i < M; i++)
            {
                Logger.LogIt(i + ")" + (finPos[i] /= CYCLES));
            }

            Logger.LogIt("AVG FV=" + finalSolution.FitnessValues[ITERATONS - 1]);

            for (int i = 0; i < finalSolution.FitnessValues.Count; i++)
            {
                OutputChart.Series["Test"].Points.AddXY(i, finalSolution.FitnessValues[i]);
            }
        }