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;
        }
Пример #2
0
        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++;
            }
        }