public MainWindow() { Formatter = d => d.ToString("0.####", CultureInfo.InvariantCulture); _milliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds(); AlgorithmErrorValues = new ChartValues <ObservablePoint>(); AlgorithmValidationValues = new ChartValues <ObservablePoint>(); ActivationFunctionChartValues = new ChartValues <ObservablePoint>(); for (var i = -10.0; i < 10.0; i += 0.25) { ActivationFunctionChartValues.Add(new ObservablePoint(i, 0.0)); } Function = new TanHFunction(); Layers = new ObservableCollection <LayerModel>(); InitializeComponent(); InitializeDataSetSettings(); InitializeNeuralNetworkSettings(); InitializeGeneticAlgorithmSettings(); DataContext = this; }
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}"); } }