Exemple #1
0
 public HillClimber(int NeighbourHoodSize, int gPopSize, int Dim, OptimisationFunctionSet func, IOptimiser optimiser)
 {
     NeighbourhoodSize = NeighbourHoodSize;
     GuessedPopSize    = gPopSize;
     Dimension         = Dim;
     Functions         = func;
     Optimiser         = optimiser;
 }
Exemple #2
0
        public IEnumerable <PerformanceIndicator> Run(OptimisationFunctionSet Functions)
        {
            List <PerformanceIndicator> performances = new List <PerformanceIndicator>();

            foreach (var func in Functions.Functions)
            {
                double accuracy = double.NaN;
                int    averageEpochsToConverge = 0;
                double averageAccuracy         = 0.0;

                for (int runNum = 0; runNum < NUMBER_OF_RUNS; runNum++)
                {
                    bool converged = false;

                    m_thisGeneration = new ArrayList(Generations);


                    CreateGenomes(func);



                    for (int generationNum = 0; generationNum < Generations; generationNum++)
                    {
                        m_nextGeneration = new ArrayList(Generations);

                        if (!converged && Math.Abs(((Genome)m_thisGeneration[0]).Fitness - func.KnownGoal) < FITNESS_MARGIN)
                        {
                            converged = true;
                            averageEpochsToConverge += generationNum;
                            break;
                        }

                        RankPopulation(ref m_thisGeneration, func.Function);
                        CreateNextGeneration(ref m_thisGeneration, ref m_nextGeneration);
                        RankPopulation(ref m_nextGeneration, func.Function);
                        ApplyElitism(ref m_thisGeneration, ref m_nextGeneration);
                    }

                    if (!converged)
                    {
                        averageEpochsToConverge += Generations;
                    }

                    if (double.IsNaN(accuracy))
                    {
                        accuracy = ((Genome)m_thisGeneration[0]).Fitness;
                    }


                    averageAccuracy += ((Genome)m_thisGeneration[0]).Fitness;

                    if (((Genome)m_thisGeneration[0]).Fitness < accuracy)
                    {
                        accuracy = ((Genome)m_thisGeneration[0]).Fitness;
                    }

                    //if (runNum % (NUMBER_OF_RUNS / 10) == 0)
                    //    Console.Write("..." + (((double)(runNum) / NUMBER_OF_RUNS * 100.0) + 10.0) + "%");
                }

                averageEpochsToConverge /= NUMBER_OF_RUNS;
                averageAccuracy         /= NUMBER_OF_RUNS;


                performances.Add(new PerformanceIndicator()
                {
                    Accuracy         = accuracy,
                    Function         = func,
                    AlgorithmName    = "GGA",
                    PopulationNumber = PopulationSize,
                    Iterations       = averageEpochsToConverge
                });
            }

            return(performances);
        }
Exemple #3
0
        public IEnumerable <PerformanceIndicator> Run(OptimisationFunctionSet Functions)
        {
            Random r1 = new Random(System.DateTime.Now.Millisecond);
            Random r2 = new Random(System.DateTime.Now.Millisecond);

            SetUp();
            foreach (FunctionWrapper function in Functions.Functions)
            {
                //initialise swarm
                Population = new Particle[PopulationSize];
                double[] GlobalBest = new double[Dimensions];
                for (int i = 0; i < Dimensions; i++)
                {
                    GlobalBest[i] = function.UpperBound;
                }
                Random rand = new Random();
                for (int i = 0; i < PopulationSize; i++)
                {
                    Population[i] = new Particle()
                    {
                        Position     = new double[Dimensions],
                        BestPosition = new double[Dimensions],
                        Velocity     = new double[Dimensions],
                        Fitness      = 0
                    };
                    //define Position
                    for (int j = 0; j < Dimensions; j++)
                    {
                        Population[i].Velocity[j]     = 0;
                        Population[i].Position[j]     = function.LowerBound + rand.NextDouble() * (function.UpperBound - function.LowerBound);
                        Population[i].BestPosition[j] = Population[i].Position[j];
                    }
                }
                //execute pso algorithm
                int iteration = 0;
                while (iteration <= MaxIterations)
                {
                    for (int i = 0; i < PopulationSize; i++)
                    {
                        //check BestPosition Position
                        if (function.Function(Population[i].Position) < function.Function(Population[i].BestPosition))
                        {
                            Array.Copy(Population[i].Position, Population[i].BestPosition, Dimensions);
                        }
                        //check gBest Position
                        if (function.Function(Population[i].BestPosition) < function.Function(GlobalBest))
                        {
                            Array.Copy(Population[i].BestPosition, GlobalBest, GlobalBest.Length);
                        }
                    }
                    //Velocity and Position updates

                    for (int i = 0; i < PopulationSize; i++)
                    {
                        //Velocity
                        for (int j = 0; j < Dimensions; j++)
                        {
                            Population[i].Velocity[j] = W * Population[i].Velocity[j] + C1 * r1.NextDouble() * (Population[i].BestPosition[j] - Population[i].Position[j])
                                                        + C2 * r2.NextDouble() * (GlobalBest[j] - Population[i].Position[j]);
                        }
                        //Position
                        for (int j = 0; j < Dimensions; j++)
                        {
                            Population[i].Position[j] = Population[i].Position[j] + Population[i].Velocity[j];
                            if (Population[i].Position[j] < function.LowerBound)
                            {
                                Population[i].Position[j] = function.LowerBound;
                            }
                            else if (Population[i].Position[j] > function.UpperBound)
                            {
                                Population[i].Position[j] = function.UpperBound;
                            }
                        }
                    }
                    Console.WriteLine(iteration + ". " + function.Function(GlobalBest));

                    /*!!!!!!!!!For diversity measure
                     * if (iteration % 10 == 0)
                     * {
                     *  //work out average of average distance
                     *  //every particle
                     *  double outerSum = 0;
                     *  for (int i = 0; i < PopulationSize; i++)
                     *  {
                     *      double innerSum = 0;
                     *      for (int j = 0; j < PopulationSize; j++)
                     *      {
                     *          double ksum = 0;
                     *          for (int k = 0; k < Dimensions; k++)
                     *          {
                     *              ksum += Math.Pow(Population[i].Position[k] - Population[j].Position[k], 2);
                     *          }
                     *          innerSum += Math.Sqrt(ksum);
                     *      }
                     *      outerSum += 1.0 / PopulationSize * innerSum;
                     *  }
                     *  outerSum = 1.0 / PopulationSize * outerSum;
                     * }!!!!!!!!!!!!*/
                    /*!!!!!!!!!!!!!!for efficiency
                     * if (Math.Abs(function.optimumGoal - calculateFitness(gBest)) < 0.005 && !solFound)
                     * {
                     *  solFound = true;
                     *  solutionIteration = iteration;
                     * }!!!!!!!!!!!!!!!!!!*/
                    iteration++;
                }
            }
            //accuracy
            //double acc = Math.Abs(function.Function(gBest) - function.optimumGoal);
            Console.ReadLine();
            return(new List <PerformanceIndicator>());
        }
 public IEnumerable <PerformanceIndicator> Run(OptimisationFunctionSet Functions)
 {
     foreach (FunctionWrapper function in Functions.Functions)
     {
         SetUp();
         //initialise population
         Random rand = new Random();
         for (int i = 0; i < PopulationSize; i++)
         {
             Agent agent = new Agent()
             {
                 Position = new double[Dimensions],
                 Fitness  = 0
             };
             for (int j = 0; j < Dimensions; j++)
             {
                 agent.Position[j] = function.LowerBound + rand.NextDouble() * (function.UpperBound - function.LowerBound);
             }
             Population.Add(agent);
         }
         int generation = 0;
         while (generation < MaxGenerations)
         {
             List <Agent> newPopulation = new List <Agent>();
             foreach (Agent parentAgent in Population)
             {
                 //fitness
                 parentAgent.Fitness = function.Function(parentAgent.Position);
                 //trial vector (mutation)
                 Agent trialAgent = new Agent()
                 {
                     Position = new double[Dimensions],
                     Fitness  = 0
                 };
                 List <Agent> targetAgents = new List <Agent>();
                 rand = new Random();
                 while (targetAgents.Count < 3)
                 {
                     Agent testAgent = Population.ElementAt(rand.Next(PopulationSize));
                     if (!testAgent.Equals(parentAgent) && !targetAgents.Contains(testAgent))
                     {
                         targetAgents.Add(testAgent);
                     }
                 }
                 Agent a, b, c;
                 a = targetAgents.ElementAt(0);
                 b = targetAgents.ElementAt(1);
                 c = targetAgents.ElementAt(2);
                 for (int i = 0; i < Dimensions; i++)
                 {
                     trialAgent.Position[i] = a.Position[i] + ScalingFactor * (b.Position[i] - c.Position[i]);
                     if (!(trialAgent.Position[i] > function.LowerBound && trialAgent.Position[i] < function.UpperBound))
                     {
                         trialAgent.Position[i] = function.LowerBound + rand.NextDouble() * (function.UpperBound - function.LowerBound);
                     }
                 }
                 //crossover
                 rand = new Random();
                 Agent offspringAgent = new Agent()
                 {
                     Position = new double[Dimensions],
                     Fitness  = 0
                 };
                 int crossoverDefault = rand.Next(Dimensions);
                 offspringAgent.Position[crossoverDefault] = trialAgent.Position[crossoverDefault];
                 for (int i = 0; i < Dimensions; i++)
                 {
                     if (i != crossoverDefault)
                     {
                         if (rand.NextDouble() < CrossoverProbability)
                         {
                             offspringAgent.Position[i] = trialAgent.Position[i];
                         }
                         else
                         {
                             offspringAgent.Position[i] = parentAgent.Position[i];
                         }
                     }
                 }
                 offspringAgent.Fitness = function.Function(offspringAgent.Position);
                 //offspring vs parent test
                 if (offspringAgent.Fitness < parentAgent.Fitness)
                 {
                     newPopulation.Add(offspringAgent);
                 }
                 else
                 {
                     newPopulation.Add(parentAgent);
                 }
             }
             Population = newPopulation;
             generation++;
             double avg = 0;
             foreach (Agent agent in Population)
             {
                 avg += agent.Fitness;
             }
             avg /= PopulationSize;
             Console.WriteLine(avg);
         }
     }
     Console.ReadLine();
     return(new List <PerformanceIndicator>());
 }