Example #1
0
        internal LayerGene MateLayer(LayerGene moreNeurons, LayerGene lessNeurons, Random random)
        {
            LayerGene childGene = new LayerGene
            {
                Neurons = new List <NeuronGene>()
            };

            var sameNumberOfTerminalsPerNeuronForBothMates = moreNeurons.Neurons[0].Axon.Weights.Count == lessNeurons.Neurons[0].Axon.Weights.Count;
            var maxTerminals = Math.Max(moreNeurons.Neurons[0].Axon.Weights.Count, lessNeurons.Neurons[0].Axon.Weights.Count);

            for (int j = 0; j < moreNeurons.Neurons.Count; j++)
            {
                //only breed the neuron if both mates have it. Otherwise just leave add the extra neuron untouched.
                if (j < lessNeurons.Neurons.Count)
                {
                    var neuron     = moreNeurons.Neurons[j];
                    var lessNeuron = lessNeurons.Neurons[j];
                    childGene.Neurons.Add(BreedNeuron(neuron, lessNeuron, random));
                }
                else
                {
                    if (sameNumberOfTerminalsPerNeuronForBothMates)
                    {
                        childGene.Neurons.Add(moreNeurons.Neurons[j]);
                    }
                    else
                    {
                        childGene.Neurons.Add(AdjustAxonTerminalsOfNeuronGene(moreNeurons.Neurons[j], maxTerminals));
                    }
                }
            }
            return(childGene);
        }
Example #2
0
        internal ILayer CreateLayerFromGene(LayerGene layerGene, Dictionary <int, Dictionary <int, IList <Synapse> > > synapseMapping, int layerInNetwork)
        {
            IList <INeuron> layerNeurons = new List <INeuron>();

            for (int i = 0; i < layerGene.Neurons.Count; i++)
            {
                layerNeurons.Add(CreateNeuronFromGene(layerGene.Neurons[i], synapseMapping, layerInNetwork, i));
            }
            return(Layer.GetInstance(layerNeurons));
        }
        internal LayerGene TryAddNeuronsToLayer(NeuralNetworkGene networkGenes, int hiddenLayerIndex, double mutateChance, out bool didMutate)
        {
            LayerGene hiddenLayer = networkGenes.HiddenGenes[hiddenLayerIndex];

            didMutate = false;
            while (_random.NextDouble() <= mutateChance)
            {
                didMutate = true;
                //update layer-1 axon terminals
                LayerGene previousLayer = GetPreviousLayerGene(networkGenes, hiddenLayerIndex);
                foreach (NeuronGene neuron in previousLayer.Neurons)
                {
                    neuron.Axon.Weights.Add(_weightInitializer.InitializeWeight());
                }

                hiddenLayer.Neurons.Add(GetRandomHiddenNeuronGene(networkGenes, hiddenLayerIndex));
            }
            return(hiddenLayer);
        }
        internal NeuralNetworkGene TryAddLayerToNetwork(NeuralNetworkGene genes, double mutateChance, out bool didMutate)
        {
            NeuralNetworkGene newGenes = genes;

            didMutate = false;
            while (_random.NextDouble() <= mutateChance)
            {
                didMutate = true;
                int layerToReplace  = _random.Next(newGenes.HiddenGenes.Count);
                int hiddenLayerSize = DetermineNumberOfHiddenNeuronsInLayer(genes, mutateChance);

                //update layer-1 axon terminals
                LayerGene previousLayer = GetPreviousLayerGene(newGenes, layerToReplace);
                foreach (NeuronGene neuron in previousLayer.Neurons)
                {
                    neuron.Axon.Weights.Clear();
                    for (int i = 0; i < hiddenLayerSize; i++)
                    {
                        neuron.Axon.Weights.Add(_weightInitializer.InitializeWeight());
                    }
                }

                LayerGene newLayer = new LayerGene
                {
                    Neurons = new List <NeuronGene>()
                };
                newGenes.HiddenGenes.Insert(layerToReplace, newLayer);

                for (int i = 0; i < hiddenLayerSize; i++)
                {
                    var newNeuron = GetRandomHiddenNeuronGene(newGenes, layerToReplace);
                    newGenes.HiddenGenes[layerToReplace].Neurons.Add(newNeuron);
                }
            }
            return(newGenes);
        }
        internal NeuronGene GetRandomHiddenNeuronGene(NeuralNetworkGene networkGenes, int hiddenLayerIndex)
        {
            var neuronGene = new NeuronGene
            {
                Axon = new AxonGene
                {
                    Weights            = new List <double>(),
                    ActivationFunction = GetRandomActivationFunction().GetType()
                },
                Soma = new SomaGene
                {
                    Bias = _weightInitializer.InitializeWeight(),
                    SummationFunction = GetRandomSummationFunction().GetType()
                }
            };
            //update terminals for current neuron
            LayerGene nextlayer = GetNextLayerGene(networkGenes, hiddenLayerIndex);

            for (int i = 0; i < nextlayer.Neurons.Count; i++)
            {
                neuronGene.Axon.Weights.Add(_weightInitializer.InitializeWeight());
            }
            return(neuronGene);
        }
Example #6
0
        internal Dictionary <int, IList <Synapse> > CreateSynapseMapLayerFromLayerGene(ISynapseFactory synapseFactory, LayerGene layerGene)
        {
            var mapLayer = new Dictionary <int, IList <Synapse> >();

            for (int i = 0; i < layerGene.Neurons.Count; i++)
            {
                mapLayer[i] = CreateTerminalsFromWeightList(synapseFactory, layerGene.Neurons[i].Axon.Weights);
            }
            return(mapLayer);
        }
 internal Dictionary<int, IList<Synapse>> CreateSynapseMapLayerFromLayerGene(ISynapseFactory synapseFactory, LayerGene layerGene)
 {
     var mapLayer = new Dictionary<int, IList<Synapse>>();
     for (int i = 0; i < layerGene.Neurons.Count; i++)
     {
         mapLayer[i] = CreateTerminalsFromWeightList(synapseFactory, layerGene.Neurons[i].Axon.Weights);
     }
     return mapLayer;
 }
 internal ILayer CreateLayerFromGene(LayerGene layerGene, Dictionary<int, Dictionary<int, IList<Synapse>>> synapseMapping, int layerInNetwork)
 {
     IList<INeuron> layerNeurons = new List<INeuron>();
     for (int i = 0; i < layerGene.Neurons.Count; i++)
     {
         layerNeurons.Add(CreateNeuronFromGene(layerGene.Neurons[i], synapseMapping, layerInNetwork, i));
     }
     return Layer.GetInstance(layerNeurons);
 }
Example #9
0
        internal NeuralNetworkGene TryAddLayerToNetwork(NeuralNetworkGene genes, double mutateChance, out bool didMutate)
        {
            NeuralNetworkGene newGenes = genes;
            didMutate = false;
            while (_random.NextDouble() <= mutateChance)
            {
                didMutate = true;
                int layerToReplace = _random.Next(newGenes.HiddenGenes.Count);
                int hiddenLayerSize = DetermineNumberOfHiddenNeuronsInLayer(genes, mutateChance);

                //update layer-1 axon terminals
                LayerGene previousLayer = GetPreviousLayerGene(newGenes, layerToReplace);
                foreach (NeuronGene neuron in previousLayer.Neurons)
                {
                    neuron.Axon.Weights.Clear();
                    for (int i = 0; i < hiddenLayerSize; i++)
                    {
                        neuron.Axon.Weights.Add(_weightInitializer.InitializeWeight());
                    }
                }

                LayerGene newLayer = new LayerGene
                {
                    Neurons = new List<NeuronGene>()
                };
                newGenes.HiddenGenes.Insert(layerToReplace, newLayer);

                for (int i = 0; i < hiddenLayerSize; i++)
                {
                    var newNeuron = GetRandomHiddenNeuronGene(newGenes, layerToReplace);
                    newGenes.HiddenGenes[layerToReplace].Neurons.Add(newNeuron);
                }
            }
            return newGenes;
        }