/// <summary>
        /// Сгенерировать нейроны сети.
        /// </summary>
        /// <param name="attributes">Количество параметров входящего вектора.</param>
        /// <param name="neuronsCount">Количество нейронов.</param>
        public void GenerateNeurons(List <NetworkAttribute> attributes, int neuronsCount)
        {
            Neurons.Clear();
            Weights.Clear();
            InputAttributes.Clear();

            InputAttributes.AddRange(attributes.Select(a => new InputAttributeBase
            {
                InputAttributeNumber = a.OrderNumber,
                Name = a.Name
            })
                                     .ToList());

            for (int i = 0; i < neuronsCount; i++)
            {
                Neurons.Add(new NeuronBase
                {
                    NeuronNumber = i
                });
            }

            foreach (var inputAttribute in InputAttributes)
            {
                foreach (var neuron in Neurons)
                {
                    var randomWeight = NormalizationType.GetNeuronWeight(attributes.Count);
                    Weights.Add(new WeightBase
                    {
                        InputAttributeNumber = inputAttribute.InputAttributeNumber,
                        NeuronNumber         = neuron.NeuronNumber,
                        Value = randomWeight
                    });
                }
            }
        }
예제 #2
0
        public void FromParents(Neat parent, Neat other)
        {
            lock (ThinkLock) {
                OnRemove?.Invoke();
                Neurons.Clear();
                Genes.Clear();
            }

            if (other == null || R.NextDouble() > mutate_crossover)
            {
                CopyFrom(parent);
                VaryColor(parent, null);
            }
            else
            {
                Dictionary <int, Gene> genes = new Dictionary <int, Gene>();

                foreach (Gene gene in parent.Genes.Concat(other.Genes))
                {
                    if (!genes.ContainsKey(gene.innovation))
                    {
                        Gene mutate = gene;
                        if (!mutate.enabled && R.NextDouble() < mutate_enable)
                        {
                            mutate.enabled = true;
                        }
                        genes[gene.innovation] = mutate;
                    }
                }

                int max = 0;

                foreach (Gene gene in genes.Values)
                {
                    max = Max(max, Max(gene.from, gene.axon.destination));
                    Genes.Add(gene);
                }

                addNeurons(max);
                innovation = Max(parent.innovation, other.innovation);

                VaryColor(parent, other);
            }

            MutateEnable();
            Mutate();
        }
예제 #3
0
        protected void ConnectInnovNbNetwork()
        {
            if (Neurons == null)
            {
                Neurons = new Dictionary <int, Neuron>();
            }
            else
            {
                Neurons.Clear();
            }

            foreach (var neuron in NeuronLst)
            {
                if (!Neurons.ContainsKey(neuron.innovNb))
                {
                    Neurons.Add(neuron.innovNb, neuron);
                }
                else if (Neurons[neuron.innovNb] != neuron)
                {
                    throw new Exception("AAAAaAAAaaaaa: " + neuron.innovNb);
                }
            }
        }