public NeuralNetwork DoSexyTimeWith(NeuralNetwork other) { if (Array.Equals(other.Layers, Layers)) { NeuralNetwork newNet = new NeuralNetwork(Layers, activationFunction); for (int layer = Layers.Length - 2; layer >= 0; layer--) { for (int neuron = Layers[layer + 1] - 1; neuron >= 0; neuron--) { double[] factors = calculatedNeurons[layer][neuron].GetFactors(); double[] otherFactors = other.calculatedNeurons[layer][neuron].GetFactors(); for (int i = 0; i < factors.Length; i++) { if (RandomValues.RandomDouble() > 0.5) { factors[i] = otherFactors[i]; } else if (RandomValues.RandomDouble() <= 0.25) { factors[i] = (otherFactors[i] + factors[i]) / 2.0; } } newNet.calculatedNeurons[layer][neuron].SetFactors(factors); } } return(newNet); } else { throw new ArgumentException("Cannot breed between different networks"); } }
private void CreateLayers(int[] layers) { this.Layers = layers; List <Neuron> lastLayer = new List <Neuron>(); for (int i = 0; i < layers.Length; i++) { List <Neuron> currentLayer = new List <Neuron>(); if (i == 0) { for (int i2 = 0; i2 < layers[i]; i2++) { inputNeurons.Add(new InputNeuron()); } currentLayer.AddRange(inputNeurons); } else { for (int i2 = 0; i2 < layers[i]; i2++) { CalculatedNeuron neuron = new CalculatedNeuron(activationFunction); foreach (Neuron lastNeuron in lastLayer) { neuron.AddConnection(new NeuronConnection(lastNeuron, RandomValues.RandomDouble().Map(0, 1, -1, 1))); } currentLayer.Add(neuron); } calculatedNeurons.Add(currentLayer.Cast <CalculatedNeuron>().ToArray()); } lastLayer = currentLayer; } }
double[] RandomDoubles() { double[] inp = new double[evolver.InputCount]; for (int i = 0; i < inp.Length; i++) { inp[i] = RandomValues.RandomDouble() > 0.5 ? 1 : 0; } return(inp); }
public void Mutate(double probability, double factor) { calculatedNeurons.SelectMany(n => n).ToList().ForEach(n => { n.NeuronConnections.ToList().ForEach(c => { double val = RandomValues.RandomDouble(); if (val <= probability / 2) { double mutationFactor = 1 + factor * RandomValues.RandomDouble().Map(0, 1, -1, 1); c.factor = c.factor * mutationFactor; } else if (val <= probability) { double mutationFactor = factor * RandomValues.RandomDouble().Map(0, 1, -1, 1); c.factor = c.factor + mutationFactor; } }); }); }