示例#1
0
        public static void SwapMutation(Solution <T> a, CreateNewSolution <T> createSolution, FitnessFunction <T> fitnessFunction, double mutationProbability)
        {
            Random r = new Random();

            foreach (var c in a.Chromosomes)
            {
                for (int i = 0; i < c.GenesCount; i++)
                {
                    // Probability od mutatnion / 2 - 2 genes affected for one mutation
                    if (mutationProbability / 2 < r.NextDouble())
                    {
                        continue;
                    }

                    int pos1 = r.Next(c.GenesCount);
                    int pos2 = r.Next(c.GenesCount);

                    T tmp = c.Genes[pos1];
                    c.Genes[pos1] = c.Genes[pos2];
                    c.Genes[pos2] = tmp;
                }
            }

            a.Fitness = fitnessFunction(a);
        }
示例#2
0
        public static void ReplaceMutation(Solution <T> a, CreateNewSolution <T> createSolution, FitnessFunction <T> fitnessFunction, double mutationProbability)
        {
            Random       r = new Random();
            Solution <T> n = createSolution();

            var ae = a.Chromosomes.GetEnumerator();
            var ne = n.Chromosomes.GetEnumerator();

            while (ae.MoveNext() && ne.MoveNext())
            {
                var ac = ae.Current.Genes;
                var nc = ne.Current.Genes;

                for (int i = 0; i < ac.Count; i++)
                {
                    // Probability od mutatnion
                    if (mutationProbability < r.NextDouble())
                    {
                        break;
                    }

                    ac[i] = nc[i];
                }
            }

            a.Fitness = fitnessFunction(a);
        }
示例#3
0
        public GeneticAlgorithm(Selection <T> selectionMethod, Crossover <T> crossoverMethod, Mutation <T> mutationMethod, FitnessFunction <T> fitnessFunction, CreateNewSolution <T> createNewSolution, AcceptResult <T> acceptResult, int population, double mutationProbability, int selectionCount, int eliteCount = 0)
        {
            if (population < 2)
            {
                throw new Exception("Population must be greater or equal 2.");
            }

            if (eliteCount >= population)
            {
                throw new Exception("EliteCount must be less than population.");
            }

            selection      = selectionMethod;
            crossover      = crossoverMethod;
            mutation       = mutationMethod;
            fitness        = fitnessFunction;
            createSolution = createNewSolution;
            accept         = acceptResult;

            maxPopulation            = population;
            this.mutationProbability = mutationProbability;
            this.selectionCount      = selectionCount;
            this.eliteCount          = eliteCount;
        }