示例#1
0
        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");
            }
        }
示例#2
0
        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;
            }
        }
示例#3
0
 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);
 }
示例#4
0
 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;
             }
         });
     });
 }