Esempio n. 1
0
    private static NeuralChromosome InsertNeuron(NeuralChromosome chromosome)
    {
        List <int> numbers = chromosome.GetNeuronsNumbers();

        int newNumber;

        if (numbers.Any())
        {
            newNumber = numbers.Max() + 1;
        }
        else
        {
            newNumber = 1;
        }

        //substitute a existing dendrite
        int          pos      = r.Next(chromosome.dendriteGenes.Length);
        DendriteGene dendrite = chromosome.dendriteGenes[pos];

        DendriteGene[] dendriteGenes = new DendriteGene[chromosome.dendriteGenes.Length + 1];
        for (int i = 0; i < chromosome.dendriteGenes.Length; i++)
        {
            dendriteGenes[i] = chromosome.dendriteGenes[i];
        }


        dendriteGenes[chromosome.dendriteGenes.Length] = new DendriteGene(newNumber, dendriteGenes[pos].endNeuron, dendriteGenes[pos].weight);

        dendriteGenes[pos] = new DendriteGene(dendrite.startNeuron, newNumber, 1f);



        return(new NeuralChromosome(dendriteGenes));
    }
Esempio n. 2
0
    private static NeuralChromosome InsertDendrite(NeuralChromosome chromosome, HashSet <int> inputNeuronsNumbers, HashSet <int> outputNeuronsNumbers)
    {
        HashSet <int> startingNeurons     = new HashSet <int>(); //neurons that will be added as input
        HashSet <int> endNeurons          = new HashSet <int>(); //neurons that require input
        List <int>    neuronsInChromosome = chromosome.GetNeuronsNumbers();

        startingNeurons.UnionWith(inputNeuronsNumbers);
        startingNeurons.UnionWith(neuronsInChromosome);
        foreach (int n in outputNeuronsNumbers)
        {
            startingNeurons.Remove(n);
        }

        endNeurons.UnionWith(outputNeuronsNumbers);
        endNeurons.UnionWith(neuronsInChromosome);
        foreach (int n in inputNeuronsNumbers)
        {
            endNeurons.Remove(n);
        }

        if (!startingNeurons.Any() || !endNeurons.Any())
        {
            return(chromosome);
        }

        int startingNeuron = startingNeurons.ToArray()[r.Next(startingNeurons.Count)];
        int endingNeuron   = endNeurons.ToArray()[r.Next(endNeurons.Count)];

        HashSet <DendriteGene.ComparableGene> existingGenes = new HashSet <DendriteGene.ComparableGene>();

        foreach (DendriteGene dendrite in chromosome.dendriteGenes)
        {
            existingGenes.Add(dendrite.GetComparableGene());
        }
        if (existingGenes.Contains(new DendriteGene.ComparableGene(new DendriteGene(startingNeuron, endingNeuron, 0))))
        {
            return(chromosome);
        }

        DendriteGene[] dendriteGenes = new DendriteGene[chromosome.dendriteGenes.Length + 1];
        for (int i = 0; i < chromosome.dendriteGenes.Length; i++)
        {
            dendriteGenes[i] = chromosome.dendriteGenes[i];
        }

        dendriteGenes[chromosome.dendriteGenes.Length] = new DendriteGene(startingNeuron, endingNeuron, (float)r.NextDouble() * 2 - 1);

        return(new NeuralChromosome(dendriteGenes));
    }
    /// <summary>
    /// Creates all hidden neurons and links them to the input and output layer. Fills
    /// the dictionaries variables
    /// </summary>
    /// <param name="chromosome"></param>
    /// <param name="inputLayer">Neurons that comes from the organism and can be used as input in the neural network</param>
    /// <param name="outputLayer">Neurons that will be used by the organism to make decisions, are the output of the neural network</param>
    private void CreateHiddenNeurons(NeuralChromosome chromosome, Neuron[] inputLayer, Neuron[] outputLayer)
    {
        List <int> hiddenNeuronsNumbers = chromosome.GetNeuronsNumbers();

        foreach (Neuron neuron in inputLayer)
        {
            AddNeuron(inputNeurons, neuron);
            hiddenNeuronsNumbers.Remove(neuron.number);
        }
        foreach (Neuron neuron in outputLayer)
        {
            AddNeuron(outputNeurons, neuron);
            hiddenNeuronsNumbers.Remove(neuron.number);
        }

        foreach (int hn in hiddenNeuronsNumbers)
        {
            Neuron neuron = new Neuron(hn);

            AddNeuron(hiddenNeurons, neuron);
        }
    }