public SmartGenAlgorithm(GeneticAlgorithm.GeneticAlgorithm geneticAlgorithm, NeuralNetwork.NeuralNetwork neuralNetwork) { _geneticAlgorithm = geneticAlgorithm; _neuralNetwork = neuralNetwork; IsPaused = false; }
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(); }
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); }
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}"); }
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}"); } }