private void improveGeneration() { // Selecting better solutions Dictionary <NeuroNetwork, double> genomes_dictionary = new Dictionary <NeuroNetwork, double>(); for (int i = 0; i < genomes_count; i++) { genomes_dictionary.Add(genomes[i], fitness[i]); } genomes_dictionary = genomes_dictionary.OrderByDescending(key => key.Value).Take(solution_selection_for_crossover).ToDictionary(pair => pair.Key, pair => pair.Value); // Create new genomes array NeuroNetwork[] newGenomes = new NeuroNetwork[genomes_count]; // Keep original 2 better solutions newGenomes[0] = genomes_dictionary.Keys.First(); newGenomes[1] = genomes_dictionary.Keys.Last(); // Cross-over solutions NeuroNetwork[] hybrids = crossover(newGenomes[0], newGenomes[1]); for (int i = 0; i < hybrids.Length; i++) { newGenomes[i + 2] = hybrids[i]; // Add crossed over solutions to new generation } // Mutated solutions for (int i = hybrids.Length + 2; i < newGenomes.Length; i++) { int selection = random.Next(0, 4); Perceptron[] old_ps = newGenomes[selection].getPerceptrons(); Perceptron[] new_ps = new Perceptron[old_ps.Length]; for (int o = 0; o < new_ps.Length; o++) { new_ps[o] = new Perceptron(old_ps[o].getWeights(), old_ps[o].getBias()); } newGenomes[i] = new NeuroNetwork(neuro_input_nodes, neurons_per_layer, neuro_output_nodes, random, new_ps); newGenomes[i].applyMutations(random); } // Replace old generation with new one genomes = newGenomes; }
private void createNetwork(sbyte[] genome) { perceptrons = new Perceptron[neurons_per_layer.Sum()]; n_values = new double[input_nodes + neurons_per_layer.Sum()]; // Indexes int currLayer = 0, curr_perceptron_all_layers = 0, curr_perceptron_this_layer = 0; for (int i = 0; i < genome.Length;) { if (curr_perceptron_this_layer > neurons_per_layer[currLayer] - 1) { curr_perceptron_this_layer = 0; currLayer++; } int input_length; if (currLayer == 0) { input_length = input_nodes; } else { input_length = neurons_per_layer[currLayer - 1]; } // Set perceptron weights and bias sbyte[] weights = new sbyte[input_length]; for (int w = 0; w < weights.Length; w++) { weights[w] = genome[i++]; } sbyte bias = genome[i++]; /*if (currLayer == hidden_layers_count - 1) bias = 0;*/ perceptrons[curr_perceptron_all_layers] = new Perceptron(weights, bias); curr_perceptron_this_layer++; curr_perceptron_all_layers++; } }