public static Solution RunCSO()
        {
            Logger.LogIt(" +++++++++++++++++++++++++++++++" + DateTime.Now.ToShortDateString() + "+++++++++++++++++++++++++++++++");
            //Data is used temporary in run
            Solution      solution   = new Solution(DIMENTIONS_NUMBER);
            List <Cat>    catSwarm   = new List <Cat>();
            List <double> tempFV     = new List <double>();
            Random        randomizer = new Random();
            Cat           bestCat    = null;
            int           numberOfTracers;
            int           indexOfTracersStart;
            int           dimentionsToChange = (int)(DIMENTIONS_NUMBER * CDC);
            double        prevBest           = 0;
            double        nextBest           = 0;

            //Step 1: create N cats in process
            for (int i = 0; i < SWARM_SIZE; i++)
            {
                catSwarm.Add(new Cat(DIMENTIONS_NUMBER));
            }

            //step 2: sprinkle cats around dimentions and asset the flags
            foreach (Cat cat in catSwarm)
            {
                cat.Cat_INIT(SOLUTION_SPACE, MAX_VELOSITY, randomizer);
            }

            numberOfTracers = (int)(catSwarm.Count * MR);
            //indexOfTracersStart = randomizer.Next(0, (catSwarm.Count - numberOfTracers));
            indexOfTracersStart = 0;

            //select seekers and tracers
            for (int i = 0; i < numberOfTracers; i++)
            {
                catSwarm[indexOfTracersStart + i].CurrentMode = Cat.Mode.Tracer;
            }

            //Step 3 Evaluating fitenessValue and save the best
            foreach (Cat cat in catSwarm)
            {
                cat.FitnessValue = Function(cat.Position);
                tempFV.Add(cat.FitnessValue);
            }
            bestCat  = catSwarm.Find(x => x.FitnessValue == tempFV.Min());
            prevBest = bestCat.FitnessValue;
            Logger.LogIt(bestCat.FitnessValue.ToString());
            do
            {
                prevBest = bestCat.FitnessValue;
                //Step 4 Applay Modes
                foreach (Cat cat in catSwarm)
                {
                    if (cat.CurrentMode == Cat.Mode.Seeker)
                    {
                        #region Seeker's Mode
                        List <Cat>    memoryCopy          = new List <Cat>();
                        List <int>    indexOfDimention    = new List <int>();
                        List <double> copiesProbabilities = new List <double>();
                        int           startIndex          = 0;

                        double FSmax = tempFV.Max();
                        double FSmin = tempFV.Min();
                        double FSb;

                        //Depends on what we aim for
                        if (SOLUTION_GOAL == Goal.Minimize)
                        {
                            FSb = FSmax;
                        }
                        else
                        {
                            FSb = FSmin;
                        }

                        for (int i = 0; i < SMP; i++)
                        {
                            memoryCopy.Add(cat);
                        }

                        if (SPC)
                        {
                            startIndex = 1;
                        }

                        //Mutate cat position
                        for (int i = startIndex; i < SMP; i++)
                        {
                            //Selecting a part of memory
                            Cat currentCopy = memoryCopy[i];

                            //Выбор параметров для изменения
                            while (indexOfDimention.Count < dimentionsToChange)
                            {
                                for (int dim = 0; dim < DIMENTIONS_NUMBER; dim++)
                                {
                                    double chance = randomizer.NextDouble();
                                    if (chance >= 0.5)
                                    {
                                        indexOfDimention.Add(dim);
                                    }
                                }
                            }

                            //MUTATION POSITION
                            for (int dimIndex = 0; dimIndex < DIMENTIONS_NUMBER; dimIndex++)
                            {
                                //изменяем выбранные параметры
                                if (indexOfDimention.Contains(dimIndex))
                                {
                                    double r    = randomizer.NextDouble() * (R[1] - R[0]) - R[0];   //R=[-1,1] for making +-SRD allowed
                                    int    sign = randomizer.Next(0, 1);
                                    if (sign == 0)
                                    {
                                        sign = -1;
                                    }
                                    double newParameter = (1 + sign * SRD * r) * currentCopy.Position[dimIndex];

                                    currentCopy.Position[dimIndex] = newParameter;
                                    continue;
                                }
                            }
                        }

                        foreach (Cat currentCopy in memoryCopy)
                        {
                            //Probability count
                            double FSi = Function(currentCopy.Position);
                            currentCopy.SelectiongProbability = (Math.Abs(FSi - FSb) / (FSmax - FSmin));
                            copiesProbabilities.Add(currentCopy.SelectiongProbability);
                        }
                        double rouletProbability = randomizer.NextDouble() * (copiesProbabilities.Max() + 1 - copiesProbabilities.Min()) - copiesProbabilities.Min();
                        Cat    nextChoose        = null; //memoryCopy.First(x => x.SelectiongProbability < rouletProbability);
                        foreach (Cat ct in memoryCopy)
                        {
                            if (rouletProbability > ct.SelectiongProbability)
                            {
                                nextChoose = ct;
                            }
                            else
                            {
                                nextChoose = memoryCopy.Last();
                            }
                        }

                        //Проверка на принадлежность интервалу решений
                        for (int pos = 0; pos < nextChoose.Position.Length; pos++)
                        {
                            if (nextChoose.Position[pos] > SOLUTION_SPACE[1])
                            {
                                nextChoose.Position[pos] = SOLUTION_SPACE[1];
                            }
                            else if (nextChoose.Position[pos] < SOLUTION_SPACE[0])
                            {
                                nextChoose.Position[pos] = SOLUTION_SPACE[0];
                            }
                        }

                        cat.Position = nextChoose.Position;
                        #endregion
                    }
                    else
                    {
                        #region Tracer's Mode
                        //Updating velocity
                        for (int i = 0; i < DIMENTIONS_NUMBER; i++)
                        {
                            double r           = randomizer.NextDouble();
                            double newVelocity = cat.Velocities[i] + r * C * (bestCat.Position[i] - cat.Position[i]);
                            if (newVelocity > MAX_VELOSITY)
                            {
                                cat.Velocities[i] = MAX_VELOSITY;
                            }
                            else
                            {
                                cat.Velocities[i] = newVelocity;
                            }
                        }

                        //Updating positions
                        for (int i = 0; i < DIMENTIONS_NUMBER; i++)
                        {
                            cat.Position[i] = cat.Position[i] + cat.Velocities[i];

                            //Проверка на принадлежность интервалу решений
                            if (cat.Position[i] > SOLUTION_SPACE[1])
                            {
                                cat.Position[i] = SOLUTION_SPACE[1];
                            }
                            else if (cat.Position[i] < SOLUTION_SPACE[0])
                            {
                                cat.Position[i] = SOLUTION_SPACE[0];
                            }
                        }
                        #endregion
                    }
                }

                //selecting new best cat
                tempFV.Clear();
                foreach (Cat cat in catSwarm)
                {
                    cat.FitnessValue = Function(cat.Position);
                    tempFV.Add(cat.FitnessValue);
                    cat.CurrentMode = Cat.Mode.Seeker;
                }
                bestCat  = catSwarm.Find(x => x.FitnessValue == tempFV.Min());
                nextBest = bestCat.FitnessValue;

                //choose new tracers
                indexOfTracersStart = +numberOfTracers;
                if (indexOfTracersStart - numberOfTracers < 0)
                {
                    indexOfTracersStart = 0;
                }
                for (int i = 0; i < numberOfTracers; i++)
                {
                    catSwarm[indexOfTracersStart + i].CurrentMode = Cat.Mode.Tracer;
                }

                solution.FitnessValues.Add(bestCat.FitnessValue);
            } while (Math.Abs(prevBest - nextBest) > 10E-6);

            Logger.LogIt("Solution FV = " + bestCat.FitnessValue);
            Logger.LogIt("Solution parameters: \n" + bestCat.ToString());

            return(solution);
        }
예제 #2
0
        public Solution RunCSOWrong(int minIterations, ProgressBar progress, bool saveFV = false)
        {
            //Logger.LogIt(" +++++++++++++++++++++++++++++++" + DateTime.Now.ToShortDateString() + "+++++++++++++++++++++++++++++++");
            //Data is used temporary in run
            Solution      solution    = new Solution(DIMENTIONS_NUMBER);
            List <Cat>    catSwarm    = new List <Cat>();
            List <double> tempFV      = new List <double>();
            Cat           bestCat     = null;
            Cat           bestCatEver = null;
            int           numberOfTracers;
            int           indexOfTracersStart;
            int           dimentionsToChange = (int)(DIMENTIONS_NUMBER * CDC);
            double        prevBest           = 1;
            double        nextBest           = 0;
            int           countOfRepeats     = 0;

            //Step 1: create N cats in process
            for (int i = 0; i < SWARM_SIZE; i++)
            {
                catSwarm.Add(new Cat(DIMENTIONS_NUMBER));
            }

            //step 2: sprinkle cats around dimentions and asset the flags
            foreach (Cat cat in catSwarm)
            {
                cat.Cat_INIT(SOLUTION_SPACE, MAX_VELOSITY, randomizer);
            }

            numberOfTracers     = (int)(catSwarm.Count * MR);
            indexOfTracersStart = randomizer.Next(0, (catSwarm.Count - numberOfTracers) + 1);         //!!!+1 may be delete
            //indexOfTracersStart = 0;

            //select seekers and tracers
            for (int i = 0; i < numberOfTracers; i++)
            {
                catSwarm[indexOfTracersStart + i].CurrentMode = Cat.Mode.Tracer;
            }

            //Step 3 Evaluating fitenessValue and save the best
            foreach (Cat cat in catSwarm)
            {
                cat.FitnessValue = Function(cat.Position, solution);
                tempFV.Add(cat.FitnessValue);
            }
            bestCat     = catSwarm.Find(x => x.FitnessValue == tempFV.Min());
            bestCatEver = new Cat(bestCat);
            prevBest    = bestCatEver.FitnessValue;

            int iteration = 0;

            do
            {
                prevBest = bestCatEver.FitnessValue;

                //Step 4 Applay Modes
                foreach (Cat cat in catSwarm)
                {
                    if (cat.CurrentMode == Cat.Mode.Seeker)
                    {
                        #region Seeker's Mode
                        List <Cat> memoryCopy = new List <Cat>();

                        List <int>    indexOfDimention    = null;
                        List <double> copiesProbabilities = new List <double>();
                        int           startIndex          = 0;

                        double FSmax = tempFV.Max();
                        double FSmin = tempFV.Min();
                        double FSb   = 0;

                        //Depends on what we aim for
                        if (SOLUTION_GOAL == Goal.Minimize)
                        {
                            FSb = FSmax;
                        }
                        else
                        {
                            FSb = FSmin;
                        }

                        for (int i = 0; i < SMP; i++)
                        {
                            memoryCopy.Add(cat);
                        }

                        if (SPC)
                        {
                            startIndex = 1;
                        }

                        //Mutate cat position
                        for (int i = startIndex; i < SMP; i++)
                        {
                            //Selecting a part of memory
                            Cat currentCopy = memoryCopy[i];

                            indexOfDimention = new List <int>();

                            while (indexOfDimention.Count < dimentionsToChange)
                            {
                                int nextDimentionToAdd = randomizer.Next(0, DIMENTIONS_NUMBER + 1);
                                if (!indexOfDimention.Contains(nextDimentionToAdd))
                                {
                                    indexOfDimention.Add(nextDimentionToAdd);
                                }
                            }


                            //MUTATION POSITION
                            for (int dimIndex = 0; dimIndex < DIMENTIONS_NUMBER; dimIndex++)
                            {
                                //изменяем выбранные параметры
                                if (indexOfDimention.Contains(dimIndex))
                                {
                                    double r    = randomizer.NextDouble() * (R[1] - R[0]) - R[0];
                                    int    sign = randomizer.Next(0, 2);
                                    if (sign == 0)
                                    {
                                        sign = -1;
                                    }
                                    double newParameter = (1 + sign * SRD * r) * currentCopy.Position[dimIndex];

                                    currentCopy.Position[dimIndex] = newParameter;
                                    //continue;
                                }
                            }
                        }

                        foreach (Cat currentCopy in memoryCopy)
                        {
                            //Probability count

                            double FSi = Function(currentCopy.Position, solution);
                            currentCopy.SelectiongProbability = (Math.Abs(FSi - FSb) / (FSmax - FSmin));
                            copiesProbabilities.Add(currentCopy.SelectiongProbability);

                            //double FSi = Function(memoryCopy[i].Position);
                            //memoryCopy[i].SelectiongProbability = (Math.Abs(FSi - FSb) / (FSmax - FSmin));
                            //copiesProbabilities.Add(memoryCopy[i].SelectiongProbability);
                        }

                        //double rouletProbability = RandomDouble() * (copiesProbabilities.Max() + 1 - copiesProbabilities.Min()) - copiesProbabilities.Min();
                        Cat    nextChoose   = null; //memoryCopy.First(x => x.SelectiongProbability < rouletProbability);
                        var    cumulated    = copiesProbabilities.CumulativeSum().Select((i, index) => new { i, index });
                        double randomNumber = randomizer.NextDouble() * (copiesProbabilities.Max() - copiesProbabilities.Min()) + copiesProbabilities.Min();
                        int    matchedIndex;
                        try
                        {
                            matchedIndex = cumulated.First(j => j.i > randomNumber).index;
                        }
                        catch (InvalidOperationException)
                        {
                            double maxProb = copiesProbabilities.Max();
                            matchedIndex = copiesProbabilities.IndexOf(maxProb);
                        }
                        nextChoose = memoryCopy[matchedIndex];

                        /*foreach (Cat ct in memoryCopy)
                         * {
                         *  if (rouletProbability > ct.SelectiongProbability)
                         *      nextChoose = ct;
                         *  else
                         *      nextChoose = memoryCopy.Last();
                         * }*/

                        //Проверка на принадлежность интервалу решений
                        for (int pos = 0; pos < nextChoose.Position.Length; pos++)
                        {
                            if (nextChoose.Position[pos] > SOLUTION_SPACE[1])
                            {
                                nextChoose.Position[pos] = SOLUTION_SPACE[1];
                            }
                            else if (nextChoose.Position[pos] < SOLUTION_SPACE[0])
                            {
                                nextChoose.Position[pos] = SOLUTION_SPACE[0];
                            }
                        }

                        cat.Position = nextChoose.Position;
                        #endregion
                    }
                    else
                    {
                        #region Tracer's Mode
                        //Updating velocity
                        for (int i = 0; i < DIMENTIONS_NUMBER; i++)
                        {
                            double r           = randomizer.NextDouble();
                            double newVelocity = cat.Velocities[i] + r * C * (bestCat.Position[i] - cat.Position[i]);
                            if (newVelocity > MAX_VELOSITY)
                            {
                                cat.Velocities[i] = MAX_VELOSITY;
                            }
                            else
                            {
                                cat.Velocities[i] = newVelocity;
                            }
                        }

                        //Updating positions
                        for (int i = 0; i < DIMENTIONS_NUMBER; i++)
                        {
                            cat.Position[i] = cat.Position[i] + cat.Velocities[i];

                            //Проверка на принадлежность интервалу решений
                            if (cat.Position[i] > SOLUTION_SPACE[1])
                            {
                                cat.Position[i] = SOLUTION_SPACE[1];
                            }
                            else if (cat.Position[i] < SOLUTION_SPACE[0])
                            {
                                cat.Position[i] = SOLUTION_SPACE[0];
                            }
                        }
                        #endregion
                    }
                }

                //selecting new best cat
                tempFV.Clear();
                foreach (Cat cat in catSwarm)
                {
                    cat.FitnessValue = Function(cat.Position, solution);
                    tempFV.Add(cat.FitnessValue);
                    cat.CurrentMode = Cat.Mode.Seeker;
                }


                if (SOLUTION_GOAL == Goal.Minimize)
                {
                    bestCat = catSwarm.Find(x => x.FitnessValue == tempFV.Min());

                    if (bestCatEver.FitnessValue > bestCat.FitnessValue)
                    {
                        bestCatEver.FitnessValue = bestCat.FitnessValue;
                        bestCat.Position.CopyTo(bestCatEver.Position, 0);
                    }
                }
                else if (SOLUTION_GOAL == Goal.Maximaze)
                {
                    bestCat = catSwarm.Find(x => x.FitnessValue == tempFV.Max());

                    if (bestCatEver.FitnessValue < bestCat.FitnessValue)
                    {
                        bestCatEver.FitnessValue = bestCat.FitnessValue;
                        bestCat.Position.CopyTo(bestCatEver.Position, 0);
                    }
                }
                nextBest = bestCatEver.FitnessValue;

                //choose new tracers

                /*indexOfTracersStart = +numberOfTracers;
                 * if (indexOfTracersStart - numberOfTracers < 0)
                 * {
                 *  indexOfTracersStart = 0;
                 * }*/

                indexOfTracersStart = randomizer.Next(0, (catSwarm.Count - numberOfTracers));
                for (int i = 0; i < numberOfTracers; i++)
                {
                    catSwarm[indexOfTracersStart + i].CurrentMode = Cat.Mode.Tracer;
                }

                solution.FitnessValues.Add(bestCatEver.FitnessValue);
                bestCatEver.Position.CopyTo(solution.BestPosition, 0);
                iteration++;
                //solution.Iterate();

                if (Math.Abs(prevBest - nextBest) < 1e-6)
                {
                    countOfRepeats++;
                }
                else
                {
                    // iteration -= countOfRepeats;
                    countOfRepeats = 0;
                }
                solution.Iterations = iteration;
                // ||(iteration<minIterations)(Math.Abs(prevBest-nextBest)>1e-6)
                if (saveFV)
                {
                    solution.FitnessValues.Add(bestCatEver.FitnessValue);
                }
            } while (countOfRepeats < 20);


            return(solution);
        }