예제 #1
0
 public SmartGenAlgorithm(GeneticAlgorithm.GeneticAlgorithm geneticAlgorithm,
                          NeuralNetwork.NeuralNetwork neuralNetwork)
 {
     _geneticAlgorithm = geneticAlgorithm;
     _neuralNetwork    = neuralNetwork;
     IsPaused          = false;
 }
예제 #2
0
        private void runBtn_Click(object sender, RoutedEventArgs e)
        {
            _populationSize = (int)populField.Value;
            _citiesAmount   = (short)citySlider.Value;
            _crossoverProb  = crossSlider.Value;
            _mautationProb  = mutSlider.Value;

            _ga = new GA(_populationSize, _citiesAmount, canvas.Width, canvas.Height, _selectOperator, _crossoverProb, _mautationProb);
            _bestSolutionSoFar = _ga.GetBestSolutionSoFar();

            Thread thread = new Thread(Run);

            thread.Start();
        }
예제 #3
0
        public static GeneticAlgorithm.GeneticAlgorithm CreateGeneticAlgorithm(int genomeSize)
        {
            var populationSize = Settings.Default.PopulationSize;

            var geneticAlgorithm = new GeneticAlgorithm.GeneticAlgorithm(populationSize, genomeSize)
            {
                Selection = SelectionExtension.GetSelection(Settings.Default.Selection, populationSize,
                                                            Settings.Default.SelectionSize),
                Crossover = CrossoverExtension.GetCrossover(Settings.Default.Crossover, populationSize,
                                                            Settings.Default.CrossoverProbability),
                Mutation = MutationExtension.GetMutation(Settings.Default.Mutation,
                                                         Settings.Default.MutationProbability)
            };

            return(geneticAlgorithm);
        }
예제 #4
0
        public void Test2([Values(500)] int iterations, [Values(100)] int columns)
        {
            var testDir  = Path.GetDirectoryName(Path.GetDirectoryName(TestContext.CurrentContext.TestDirectory));
            var dataPath = Path.Combine(testDir ?? throw new NullReferenceException(), "..", "Data", "data.csv");

            var mapper = new CsvMapper();

            var data        = mapper.ReadDataFromFile(dataPath, 1);
            var correlation = Correlation.GetCorrelation(data);

            data = data.RemoveLeastRelevantColumn(correlation, columns);

            var dataSet      = data.SplitData(1, 2, 0);
            var trainingData = dataSet[DataType.Training];
            var testingData  = dataSet[DataType.Testing];

            var neuralNetwork = new NeuralNetwork.NeuralNetwork {
                MinWeight = -5, MaxWeight = 5
            };
            var activationFunction = new SigmoidFunction(-1);

            neuralNetwork.ActivationFunction = activationFunction;
            neuralNetwork.AddLayer(new Layer(10, columns));
            neuralNetwork.AddLayer(new Layer(1, 10));

            var genetic = new GeneticAlgorithm.GeneticAlgorithm(100, neuralNetwork.GetConnectionCount())
            {
                Selection = new TournamentSelection(100, 10),
                Crossover = new TwoPointCrossover(0.65, 100),
                Mutation  = new FlipBitMutation(0.05)
            };

            var keepLooping = true;

            for (var it = 0; it < iterations && keepLooping; it++)
            {
                foreach (var chromosome in genetic.Population)
                {
                    neuralNetwork.SetWeights(chromosome.Genome);

                    Parallel.For(0, trainingData.Attributes.Count, i =>
                    {
                        var res = neuralNetwork.GetResult(trainingData.Attributes[i]);
                        lock (chromosome)
                        {
                            chromosome.Fitness += Math.Abs(res[0] - trainingData.ObjectClass[i]);
                        }
                    });
                }

                keepLooping = !genetic.Population.Any(chromosome => chromosome.Fitness < 5.0);

                Console.WriteLine($@"iteration: {it} | " +
                                  $@"best: {genetic.Population.MinBy(chromosome => chromosome.Fitness).First().Fitness}");

                if (keepLooping && it < iterations - 1)
                {
                    genetic.NextGeneration();
                }
            }

            var best = genetic.Population.MinBy(chromosome => chromosome.Fitness).First();

            neuralNetwork.SetWeights(best.Genome);

            var correct = testingData.Attributes
                          .AsParallel()
                          .Where((t, i) => Math.Abs(neuralNetwork.GetResult(t)[0] - testingData.ObjectClass[i]) < 0.3)
                          .Count();

            Console.WriteLine(
                $@"Population: {100}, iterations: {iterations} - fitness: {best.Fitness:0.0} " +
                $@"| correctly recognized: {correct}/{testingData.Attributes.Count}");
        }
예제 #5
0
        public void Test1([Values(100, 200)] int populationSize,
                          [Values(10, 50, 250, 1000)] int iterations,
                          [Values(30)] int dataSize)
        {
            var neuralNetwork = new NeuralNetwork.NeuralNetwork {
                MinWeight = -5, MaxWeight = 5
            };
            var activationFunction = new TanHFunction();

            neuralNetwork.ActivationFunction = activationFunction;
            neuralNetwork.AddLayer(new Layer(4, 2));
            neuralNetwork.AddLayer(new Layer(1, 4));

            var genetic = new GeneticAlgorithm.GeneticAlgorithm(populationSize, neuralNetwork.GetConnectionCount())
            {
                Selection = new TournamentSelection(populationSize, populationSize / 10),
                Crossover = new TwoPointCrossover(0.65, populationSize),
                Mutation  = new FlipBitMutation(0.05)
            };

            var data = new List <SampleData>();

            for (var i = 0; i < dataSize; i++)
            {
                data.Add(new SampleData());
            }

            for (var it = 0; it < iterations; it++)
            {
                foreach (var chromosome in genetic.Population)
                {
                    neuralNetwork.SetWeights(chromosome.Genome);

                    foreach (var sampleData in data)
                    {
                        var res = neuralNetwork.GetResult(sampleData.Data);

                        lock (genetic)
                        {
                            chromosome.Fitness += Math.Abs(res[0] - sampleData.ObjectClass);
                        }
                    }
                }

                if (it < iterations - 1)
                {
                    genetic.NextGeneration();
                }
            }

            var best = genetic.Population.MinBy(chromosome => chromosome.Fitness).First();

            neuralNetwork.SetWeights(best.Genome);

            var correct = data.Count(d => Math.Abs(neuralNetwork.GetResult(d.Data)[0] - d.ObjectClass) < 0.3);

            Console.WriteLine(
                $@"Population: {populationSize}, iterations: {iterations} - fitness: {best.Fitness:0.0} " +
                $@"| correctly recognized: {correct}");

            foreach (var d in data)
            {
                var results = neuralNetwork.GetResult(d.Data)[0];
                Console.WriteLine(
                    $@"[{d.Data[0]: 0.00;-0.00} {d.Data[1]: 0.00;-0.00}] - class: {d.ObjectClass: 0;-0} " +
                    $@"| recognized: {results: 0.00;-0.00} " +
                    $@"| is correct: {Math.Abs(results - d.ObjectClass) < 0.3}");
            }
        }