Beispiel #1
0
        private void AdaptMutationProbability(GeneticSharp.Domain.GeneticAlgorithm geneticAlgorithm)
        {
            var lastGenerations = geneticAlgorithm.Population.Generations.Take(10).ToList();

            var bestChromosome = geneticAlgorithm.BestChromosome;

            if (lastGenerations.Count < 10)
            {
                return;
            }

            bool haveSameFitness = lastGenerations.All(
                x => Math.Abs(x.BestChromosome.Fitness.Value - bestChromosome.Fitness.Value) < float.Epsilon);

            // all chromosomes have same fitness => increase mutation rate
            if (haveSameFitness)
            {
                geneticAlgorithm.MutationProbability *= 1.01f;
                geneticAlgorithm.MutationProbability  =
                    Math.Min(geneticAlgorithm.MutationProbability, Global.Config.MaximumMutationProbability);
            }
            // otherwise decrease it if they don't have same fitness
            else
            {
                geneticAlgorithm.MutationProbability /= 1.15f;
                geneticAlgorithm.MutationProbability  =
                    Math.Max(geneticAlgorithm.MutationProbability, Global.Config.MinimumMutationProbability);
            }
        }
Beispiel #2
0
        public void GenerationRan(GeneticSharp.Domain.GeneticAlgorithm ga)
        {
            var latestFitness = 0.0;

            ga.GenerationRan += (sender, e) =>
            {
                var bestChromosome = ga.BestChromosome as BinaryChromosome;
                var bestFitness    = bestChromosome.Fitness.Value;

                if (bestFitness != latestFitness)
                {
                    latestFitness = bestFitness;
                    var phenotype = bestChromosome.GetGenes();

                    Console.WriteLine("Поколiння №{0,2}. Кращий результат = {1}", ga.GenerationsNumber, bestFitness);
                    Console.Write("Вид хромосоми: ");

                    foreach (GeneticSharp.Domain.Chromosomes.Gene g in phenotype)
                    {
                        Console.Write(g.Value.ToString() + "");
                    }
                    Console.WriteLine();
                }
            };
        }
Beispiel #3
0
        private ScheduleChromosome RunOnce(LineSeries lineSeries = null)
        {
            var adamChromosome = new ScheduleChromosome(jobShop);
            var population     = new Population(Global.Config.MinPopulationSize, Global.Config.MaxPopulationSize, adamChromosome);

            var fitness          = new ScheduleFitness();
            var selection        = new NonDeterministicTournamentSelection(Global.Config.TournamentSelectionProbability);
            var crossover        = new SchedulesCrossover(new CycleCrossover());
            var mutation         = new ScheduleMutation(Global.Config.MutationPerGeneProbability, new ReverseSequenceMutation());
            var geneticAlgorithm =
                new GeneticSharp.Domain.GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                Termination          = new GenerationNumberTermination(Global.Config.GenerationsCount),
                MutationProbability  = Global.Config.MutationProbability,
                CrossoverProbability = Global.Config.CrossoverProbability,
                OperatorsStrategy    = new JobShopOperatorStrategy(),
                Reinsertion          = new JobShopReinsertion(
                    new EliteSelection(),
                    new Elitism(Global.Config.ElitismPercent),
                    fitness
                    )
            };
            var stopWatch = new Stopwatch();

            if (adaptive)
            {
                geneticAlgorithm.GenerationRan += (sender, e) => AdaptMutationProbability(geneticAlgorithm);;
            }
            geneticAlgorithm.GenerationRan += (sender, e) =>
            {
                Print(geneticAlgorithm.Population, stopWatch.Elapsed);
            };

            // plot the model
            if (PlotModel != null)
            {
                geneticAlgorithm.GenerationRan += (sender, e) =>
                {
                    lineSeries.Points.Add(new DataPoint(geneticAlgorithm.Population.GenerationsNumber,
                                                        ((ScheduleChromosome)geneticAlgorithm.Population.BestChromosome).ScheduleLength.Value));
                };
            }

            geneticAlgorithm.GenerationRan += (o, e) => GenerationRan?.Invoke(geneticAlgorithm.Population.CurrentGeneration);
            if (Global.Config.ThreadsCount > 1)
            {
                geneticAlgorithm.TaskExecutor = new ParallelTaskExecutor()
                {
                    MinThreads = 1,
                    MaxThreads = Global.Config.ThreadsCount
                };
            }

            stopWatch.Start();
            geneticAlgorithm.Start();
            stopWatch.Stop();

            return((ScheduleChromosome)geneticAlgorithm.BestChromosome);
        }
Beispiel #4
0
 public void BuildGA()
 {
     _ga = new GeneticSharp.Domain.GeneticAlgorithm(
         _population,
         _fitness,
         _selection,
         _crossover,
         _mutation);
     _ga.Termination = _termination;
 }
Beispiel #5
0
        public GeneticSharp.Domain.GeneticAlgorithm GetGA()
        {
            //Сам генетический алгоритм
            var ga = new GeneticSharp.Domain.GeneticAlgorithm(
                _population,
                _fitness,
                _selection,
                _crossover,
                _mutation);

            ga.Termination = _termination;
            return(ga);
        }
Beispiel #6
0
        public void Init(int patternLength, List <string> choices, int populationSize, int maxGenerations,
                         Selection selection, Crossover crossover, Mutation mutation)
        {
            string selectionname = Enum.GetName(typeof(Selection), selection);

            _selection = (ISelection)Activator.CreateInstance("GeneticSharp.Domain", "GeneticSharp.Domain.Selections." + selectionname).Unwrap(); //new EliteSelection();
            _crossover = (ICrossover)Activator.CreateInstance("GeneticSharp.Domain", "GeneticSharp.Domain.Crossovers." + crossover).Unwrap();     //new TwoPointCrossover();
            _mutation  = (IMutation)Activator.CreateInstance("GeneticSharp.Domain", "GeneticSharp.Domain.Mutations." + mutation).Unwrap();        //new PartialShuffleMutation();

            _fittness = new ClosestToMillion();

            _playPatternChromosome = new PlayPatternChromosome(patternLength, choices);
            //var bestPattern = BestPattern.Get(context);
            _population = new Population(populationSize, populationSize, _playPatternChromosome);

            _geneticAlgorithm = new GeneticSharp.Domain.GeneticAlgorithm(_population, _fittness, _selection,
                                                                         _crossover, _mutation);
            _geneticAlgorithm.Termination = new GenerationNumberTermination(maxGenerations);
            _geneticAlgorithm.Init();
        }
Beispiel #7
0
        public override void ConfigGA(GeneticSharp.Domain.GeneticAlgorithm ga)
        {
            var latestFitness = 0.0;

            Context.GA.GenerationRan += (object sender, EventArgs e) =>
            {
                m_bestChromosome = Context.GA.BestChromosome as FloatingPointChromosome;

                if (m_bestChromosome != null)
                {
                    lock (m_positions)
                    {
                        var fitness = m_bestChromosome.Fitness.Value;
                        var points  = m_bestChromosome.ToFloatingPoints();

                        m_positions.Add(new KeyValuePair <double, double[]>(fitness, points));


                        if (fitness != latestFitness)
                        {
                            latestFitness = fitness;
                            var phenotype = m_bestChromosome.ToFloatingPoints();

                            Console.WriteLine(
                                "Generation {0,2}: ({1},{2}),({3},{4}) = {5}",
                                ga.GenerationsNumber,
                                phenotype[0],
                                phenotype[1],
                                phenotype[2],
                                phenotype[3],
                                fitness
                                );
                        }
                    }
                }
            };
        }
Beispiel #8
0
        //Одне скомбіноване рішення
        //Недоречний варіант!!!
        public void Start()
        {
            //Сам генетический алгоритм
            var ga = new GeneticSharp.Domain.GeneticAlgorithm(
                _population,
                _fitness,
                _selection,
                _crossover,
                _mutation);

            ga.Termination = _termination;

            var latestFitness = 0.0;

            ga.GenerationRan += (sender, e) =>
            {
                var bestChromosome = ga.BestChromosome as BinaryChromosome;
                var bestFitness    = bestChromosome.Fitness.Value;

                if (bestFitness != latestFitness)
                {
                    latestFitness = bestFitness;
                    var phenotype = bestChromosome.GetGenes();

                    Console.WriteLine("Поколiння №{0,2}. Кращий результат = {1}", ga.GenerationsNumber, bestFitness);
                    Console.Write("Вид хромосоми: ");

                    foreach (GeneticSharp.Domain.Chromosomes.Gene g in phenotype)
                    {
                        Console.Write(g.Value.ToString() + "");
                    }
                    Console.WriteLine();
                }
            };

            ga.Start();
        }
Beispiel #9
0
        static void Main(string[] args)
        {
            var selection  = new EliteSelection();
            var crossover  = new OnePointCrossover();
            var mutation   = new ReverseSequenceMutation();
            var fitness    = new MyProblemFitness();
            var chromosome = new MyProblemChromosome();
            var population = new Population(20, 20, chromosome);

            var ga = new GeneticSharp.Domain.GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                Termination = new GenerationNumberTermination(100)
            };

            Console.WriteLine("GA running...");
            ga.Start();

            if (ga.BestChromosome.Fitness != null)
            {
                double fitnessValue = ga.BestChromosome.Fitness.Value;
                string solution     = ga.BestChromosome.ToUserFriendly();
                Console.WriteLine($"Best solution {solution} found has {fitnessValue} fitness for {ga.GenerationsNumber} generations.");
            }
        }
Beispiel #10
0
 public void Start(GeneticSharp.Domain.GeneticAlgorithm ga) => ga.Start();
Beispiel #11
0
        static void Main(string[] args)
        {
            TestData.GetData(out var servers, out var services);

            var chromosome = new MyChromosome(servers, services);

            var populationSize = 9;
            var population     = new Population(populationSize, populationSize, chromosome);

            var fitness = new FuncFitness((c) =>
            {
                var mc = (MyChromosome)c;

                var genes   = mc.GetGenes();
                var servers = genes.Select(x => (Server)x.Value).ToList();

                var freeServersTerm     = servers.Count(x => x.IsFree) * 2.5;
                var negativeHddFreeTerm = servers.Where(x => x.HddFree < 0).Select(x => x.HddFree * 3).Sum();
                var positiveHddFreeTerm = servers.Where(x => x.HddFree > 0).Select(x => x.HddFree * 0.2).Sum();
                var negativeRamFreeTerm = servers.Where(x => x.RamFree < 0).Select(x => x.RamFree * 3).Sum();
                var positiveRamFreeTerm = servers.Where(x => x.RamFree > 0).Select(x => x.RamFree * 0.2).Sum();
                var negativeCpuFreeTerm = servers.Where(x => x.CpuFree < 0).Select(x => x.CpuFree * 3).Sum();
                var positiveCpuFreeTerm = servers.Where(x => x.CpuFree > 0).Select(x => x.CpuFree * 0.2).Sum();

                var fitness = freeServersTerm + negativeHddFreeTerm + positiveHddFreeTerm + negativeRamFreeTerm +
                              positiveRamFreeTerm + negativeCpuFreeTerm + positiveCpuFreeTerm;

                //по каждому серверу нужно вычислить коэффициент заполненности
                var serversFill = new List <double>();
                foreach (var server in servers)
                {
                    var serverFill = ((server.HddFull - server.HddFree) / server.HddFull) * 0.2 +
                                     ((server.RamFull - server.RamFree) / server.RamFull) * 0.4 +
                                     ((server.CpuFull - server.CpuFree) / server.CpuFull) * 0.4;
                    serversFill.Add(serverFill);
                }
                serversFill = serversFill.OrderByDescending(x => x).ToList();
                //отладочная строка
                //var serversFill = new List<double> { 0.9d, 0.9d, 0.6d, 0.2d,0 };
                //среднее значение заполненности серверов
                var averageFill = serversFill.Sum() / servers.Count();
                //рассчитаем дисперсию у serversFill
                var dispersion = serversFill.Select(eachFill => (eachFill - averageFill) * (eachFill - averageFill)).Sum() / servers.Count;

                return((dispersion * 3) + fitness);
            });

            var selection = new EliteSelection();
            //сделал свой кроссовер, похожий на UniformCrossover
            var crossover = new MyCrossover();
            //строка для отладки кроссовера
            //crossover.Cross(new List<IChromosome> {chromosome.CreateNew(), chromosome.CreateNew()});

            var mutation = new MyMutation();
            //mutation.Mutate(chromosome, Single.Epsilon);

            var termination = new FitnessStagnationTermination(100);

            var ga = new GeneticSharp.Domain.GeneticAlgorithm(
                population,
                fitness,
                selection,
                crossover,
                mutation)
            {
                Termination         = termination,
                MutationProbability = 0.3f
            };

            var latestFitness = 0.0;

            ga.GenerationRan += (sender, e) =>
            {
                var ga = (GeneticSharp.Domain.GeneticAlgorithm)sender;
                Console.Write("Номер итерации: " + ga.GenerationsNumber + "  " + "Время работы: " + ga.TimeEvolving);
                Console.WriteLine();

                var bestChromosome = ga.BestChromosome as MyChromosome;
                var bestFitness    = bestChromosome.Fitness.Value;

                if (bestFitness != latestFitness)
                {
                    latestFitness = bestFitness;
                    var phenotype = bestChromosome.GetGenes()
                                    .Select(x => (Server)x.Value).ToList();

                    Console.Write("Фитнес: " + bestFitness);
                    Console.WriteLine();

                    foreach (var server in phenotype)
                    {
                        Console.Write("Сервер: " + server.Name +
                                      ", HddFull: " + server.HddFull +
                                      ", RamFull: " + server.RamFull +
                                      ", HddFree: " + server.HddFree +
                                      ", RamFree: " + server.RamFree +
                                      ", CpuFree: " + server.CpuFree +
                                      ", сервисы: ");
                        Console.Write(" Заполненность Hdd: " + Math.Round(100 - (server.HddFree / server.HddFull * 100)) + "%");
                        Console.Write(" Заполненность Ram: " + Math.Round(100 - (server.RamFree / server.RamFull * 100)) + "%");
                        Console.Write(" Заполненность Cpu: " + Math.Round(100 - server.CpuFree) + "%");
                        foreach (var service in server.Services)
                        {
                            Console.Write(service.Name + ", ");
                        }
                        Console.WriteLine();
                        Console.WriteLine();

                        //получить хромосомы на этой итерации и смотреть, равны ли они.
                        //Хромосомы равны, если равны их фитнесы.
                        //Если равны, алгоритм преждевременно сходится (вырождается популяция)
                        var chromosomesFitnessCollection = ga.Population.CurrentGeneration.Chromosomes;
                    }
                }
            };

            ga.Start();
        }