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); }
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); }
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); }
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; }