Exemple #1
0
        public void DisplayPopulation(int[,] population, Fitness fitness, String selectorName = null, String crossoverName = null, Double rate = 0)
        {
            var fitnessNo    = fitness.GetFitnessMethod();
            var fitnessIndex = _genomeLength;

            fitness.ResetTotalPoints();
            _topGenerationCandidate = 0;

            //Console.WriteLine(message);
            Console.WriteLine("--------------------");
            Console.WriteLine("Fitness Function: " + fitness.GetFitnessName());

            if (selectorName != null)
            {
                Console.WriteLine("Selection Function: " + selectorName);
            }

            if (crossoverName != null)
            {
                Console.WriteLine("Crossover Operator: " + crossoverName);
            }

            if (rate > 0)
            {
                Console.WriteLine("Mutation Rate: " + rate);
            }

            Console.WriteLine("--------------------");

            for (var i = 0; i < _populationSize; i++)
            {
                Console.Write("Genome " + (i + 1) + ": ");
                fitness.ResetRankPoints();

                for (var j = 0; j < _genomeLength; j++)
                {
                    Console.Write(population[i, j] + " ");

                    //Only for Digit Ranking
                    if (fitnessNo == 1)
                    {
                        fitness.AddRankPoints(population[i, j]);
                        //population[i, fitnessIndex] = fitness.GetRankPoints();
                    }
                    else if (fitnessNo == 2 && population[i, j] == 1)
                    {
                        fitness.AddRankPoints(fitness.CalculateBinaryFitness(_genomeLength, j));
                    }
                }

                Console.Write("Fitness: " + fitness.GetRankPoints());
                population[i, fitnessIndex] = fitness.GetRankPoints();

                if (population[i, fitnessIndex] > _topGenerationCandidate)
                {
                    _topGenerationCandidate = fitness.GetRankPoints();
                }

                Console.WriteLine();
            }

            if (_topGenerationCandidate > _topCycleCandidate)
            {
                _topCycleCandidate = _topGenerationCandidate;
            }

            Console.WriteLine();
            Console.WriteLine("Total Fitness: " + fitness.GetTotalPoints());
            Console.WriteLine("Average Fitness: " + fitness.CalculateAverageFitness(_populationSize));
            Console.WriteLine("Top Candidate: " + _topGenerationCandidate);
            Console.WriteLine("Best Cycle Candidate: " + _topCycleCandidate);
        }
        public static void Main(string[] args)
        {
            var optionsNo = 0;

            Console.WriteLine("*****START*******");
            Console.WriteLine();

            Initializer initializer = new Initializer();
            Fitness     fitness     = new Fitness();
            Selector    selector    = new Selector();
            Crossover   crossover   = new Crossover();

            StartUp();

            while (optionsNo != 9)
            {
                switch (DisplayMenu())
                {
                case 1:
                    Console.WriteLine("GENERATION 1");
                    initializer.DisplayPopulation(initializer.GetPopulation(), fitness);
                    break;

                case 2:
                    FullCycle();
                    break;

                case 3:
                    fitness.SetFitnessMethod();
                    initializer.DisplayPopulation(initializer.GetPopulation(), fitness);
                    Wait();
                    break;

                case 8:
                    initializer.CreatePopulation();
                    initializer.DisplayPopulation(initializer.GetPopulation(), fitness);
                    Wait();
                    break;

                case 9:
                    Console.WriteLine("This Program is over. Bye!");
                    break;

                default:
                    Console.WriteLine("Try Again!");
                    break;
                }
            }

            void StartUp()
            {
                initializer.CreatePopulation();
                fitness.SetFitnessMethod();
                initializer.DisplayPopulation(initializer.GetPopulation(), fitness);
                Wait();
            }

            int DisplayMenu()
            {
                Console.WriteLine();
                Console.WriteLine("OPTIONS: ");
                Console.WriteLine("------------------");
                Console.WriteLine("1- Display Population");
                Console.WriteLine("2- Full Cycle");
                Console.WriteLine("3- Change Fitness Function");
                Console.WriteLine("8- Re-Initiation");
                Console.WriteLine("9- Exit");
                Console.WriteLine();
                optionsNo = initializer.CheckIntegerInput("Please Select an Option:");
                return(optionsNo);
            }

            void Wait()
            {
                Console.WriteLine();
                Console.WriteLine("Next...");
                Console.ReadLine();
            }

            void FullCycle()
            {
                //Set Up Generation Cycle and Parameters
                var isPhaseSkip = false;
                var isFound     = false;
                var inputNo     = 0;

                initializer.ResetStats();
                selector.SetNoOfCycles();
                selector.SetSelectionType();
                crossover.SetCrossoverMethod();
                selector.SetMutationRate();


                while (isFound == false)
                {
                    Console.WriteLine("Would you like to skip the individual steps on each generations (Selection, Mutation, etc) and just the final results of each generation ? ");
                    Console.WriteLine("1 - Yes");
                    Console.WriteLine("2 - No");
                    inputNo = initializer.CheckIntegerInput();

                    if (inputNo == 1 || inputNo == 0)
                    {
                        isFound = true;

                        if (inputNo == 1)
                        {
                            isPhaseSkip = true;
                        }
                    }
                    else
                    {
                        Console.WriteLine("Please choose a enter option");
                    }
                }

                //For Each Cycle
                for (int i = 0; i < selector.GetNotOfCycles(); i++)
                {
                    Console.WriteLine("GENERATION " + (i + 1));

                    //Selection Phase
                    if (selector.GetSelectionType() == 2)
                    {
                        Selector.OrderSamples(initializer.GetPopulation(), initializer.GetGenomeLength(), initializer.GetPopulationSize());
                        initializer.SetSelectionCandidates(Selector.RankSelection(initializer));
                    }
                    //Roulette Wheel Selection
                    else
                    {
                        initializer.SetSelectionCandidates(Selector.RouletteWheel(initializer, fitness.GetTotalPoints()));
                    }

                    if (isPhaseSkip == false)
                    {
                        //Display Selected Candidates
                        Console.WriteLine("After Selection...");
                        initializer.DisplayPopulation(initializer.GetPopulation(), fitness, selector.GetSelectionName(), crossover.GetCrossoverName(), selector.GetMutationRate());
                        Wait();
                    }



                    //Reproduction Phase
                    if (crossover.GetCrossoverMethod() == 1)
                    {
                        //Single Point Crossover
                        initializer.SetSelectionCandidates(crossover.SinglePointCrossover(initializer));
                    }
                    else
                    {
                        //Uniform Crossover
                        initializer.SetSelectionCandidates(crossover.UniformCrossover(initializer));
                    }

                    if (isPhaseSkip == false)
                    {
                        Console.WriteLine("After Crossover");
                        initializer.DisplayPopulation(initializer.GetPopulation(), fitness, selector.GetSelectionName(), crossover.GetCrossoverName(), selector.GetMutationRate());
                        Wait();
                    }

                    initializer.SetSelectionCandidates(selector.Mutation(initializer));

                    if (isPhaseSkip == false)
                    {
                        //Mutation Phase
                        Console.WriteLine("After Mutation...");
                        initializer.DisplayPopulation(initializer.GetPopulation(), fitness, selector.GetSelectionName(), crossover.GetCrossoverName(), selector.GetMutationRate());
                        Wait();
                    }

                    if (isPhaseSkip)
                    {
                        initializer.DisplayPopulation(initializer.GetPopulation(), fitness, selector.GetSelectionName(), crossover.GetCrossoverName(), selector.GetMutationRate());
                        Wait();
                    }

                    //Q FOR QUIT
                }

                initializer.ResetStats();
            }
        }