Exemplo n.º 1
0
        public void AddNeuron()
        {
            if (!AllSynapses.Any())
            {
                AddSynapse();
                return;
            }
            //Debug.Log("Poczatek add neuron");
            int     tmp    = RandomGenerator.Next(AllSynapses.Count);
            Synapse oldSyn = AllSynapses.ToList()[tmp].Value;

            AllSynapses.Remove(oldSyn.InnovationNo);
            oldSyn.InputNeuron.OutputSynapses.Remove(oldSyn);
            oldSyn.OutputNeuron.InputSynapses.Remove(oldSyn);
            Neuron neuron = new Neuron(NeuronInnovationNo);


            Synapse newSyn1 = new Synapse(oldSyn.InputNeuron, neuron, SynapseInnovationNo);

            newSyn1.Weight = 1;
            Synapse newSyn2 = new Synapse(neuron, oldSyn.OutputNeuron, SynapseInnovationNo);

            newSyn2.Weight = oldSyn.Weight;

            HiddenLayers.Add(neuron.InnovationNo, neuron);
            AllSynapses.Add(newSyn1.InnovationNo, newSyn1);
            AllSynapses.Add(newSyn2.InnovationNo, newSyn2);
        }
Exemplo n.º 2
0
        public float Distance(NEAT partner)
        {
            if (partner == null)
            {
                Debug.Log("NULL partner");
                Debug.Break();
            }
            //var synapseIenumerator = AllSynapses.GetEnumerator();
            //var partnerSynapseIenumerator = partner.AllSynapses.GetEnumerator();
            //synapseIenumerator.MoveNext();
            float result = 0;

            if (AllSynapses.Any() || partner.AllSynapses.Any())
            {
                int   disjointGenes    = 0;
                int   excessGenes      = 0;
                float weightDifference = 0;
                float N = Math.Max(AllSynapses.Count, partner.AllSynapses.Count);
                disjointGenes = 2 * AllSynapses.Keys.Union(partner.AllSynapses.Keys).Count() - AllSynapses.Count - partner.AllSynapses.Count;
                foreach (var synapseInnovationNo in AllSynapses.Keys.Intersect(partner.AllSynapses.Keys))
                {
                    weightDifference += Math.Abs((float)(AllSynapses[synapseInnovationNo].Weight - partner.AllSynapses[synapseInnovationNo].Weight));
                    //if (Math.Abs((float)(AllSynapses[synapseInnovationNo].Weight - partner.AllSynapses[synapseInnovationNo].Weight)) > Constants.Con.synapse_difference_threshold)
                    //    disjointGenes++;
                }

                result += (Constants.Con.c1 * excessGenes + Constants.Con.c2 * disjointGenes + Constants.Con.c3 * weightDifference) / N;
            }
            //if(HiddenLayers.Any() || partner.HiddenLayers.Any())      OutputLayer.Count > 0 always
            {
                int   disjointGenes    = 0;
                int   excessGenes      = 0;
                float weightDifference = 0;
                float N = Math.Max(HiddenLayers.Count, partner.HiddenLayers.Count) + OutputLayer.Count;
                foreach (var neuronPair in OutputLayer.Zip(partner.OutputLayer))
                {
                    weightDifference += Mathf.Abs((float)(neuronPair.Key.Bias - neuronPair.Value.Bias));
                    //if (Mathf.Abs((float)(neuronPair.Key.Bias - neuronPair.Value.Bias)) > Constants.Con.bias_difference_threshold)
                    //    disjointGenes++;
                }

                disjointGenes = 2 * HiddenLayers.Keys.Union(partner.HiddenLayers.Keys).Count() - HiddenLayers.Count - partner.HiddenLayers.Count;
                foreach (var neuronInnovationNo in HiddenLayers.Keys.Intersect(partner.HiddenLayers.Keys))
                {
                    weightDifference += Math.Abs((float)(HiddenLayers[neuronInnovationNo].Bias - partner.HiddenLayers[neuronInnovationNo].Bias));
                    //if (Math.Abs((float)(HiddenLayers[neuronInnovationNo].Bias - partner.HiddenLayers[neuronInnovationNo].Bias)) > Constants.Con.bias_difference_threshold)
                    //    disjointGenes++;
                }
                result += (Constants.Con.c1 * excessGenes + Constants.Con.c2 * disjointGenes + Constants.Con.c3 * weightDifference) / N;
            }


            return(result);
            //if (result < Constants.Con.delta_t)
            //    return true;
            //return false;
        }
Exemplo n.º 3
0
        private void DelSynapse()
        {
            if (!AllSynapses.Any())
            {
                return;
            }
            int     tmp    = RandomGenerator.Next(AllSynapses.Count);
            Synapse oldSyn = AllSynapses.Values.ToList()[tmp];

            oldSyn.InputNeuron.OutputSynapses.Remove(oldSyn);
            oldSyn.OutputNeuron.InputSynapses.Remove(oldSyn);
            AllSynapses.Remove(oldSyn.InnovationNo);
        }
Exemplo n.º 4
0
        public void AddSynapse()
        {
            //Debug.Log("Poczatek add synapse");
            //get 2 random neurons and connect them
            int    ineur1 = RandomGenerator.Next(InputLayer.Count + HiddenLayers.Count);
            Neuron neuron1;

            if (ineur1 < InputLayer.Count)
            {
                neuron1 = InputLayer[ineur1];
            }
            else
            {
                neuron1 = HiddenLayers.Values.ToArray()[ineur1 - InputLayer.Count];
            }
            int    ineur2 = RandomGenerator.Next(OutputLayer.Count + HiddenLayers.Count);
            Neuron neuron2;

            if (ineur2 < OutputLayer.Count)
            {
                neuron2 = OutputLayer[ineur2];
            }
            else
            {
                neuron2 = HiddenLayers.Values.ToArray()[ineur2 - OutputLayer.Count];
                if (!recurrent && neuron1.ConnectionWouldMakeCycle(neuron2)) //lets not make cycles
                {
                    Neuron tmp = neuron1;
                    neuron1 = neuron2;
                    neuron2 = tmp;
                }
            }

            //check if it already exist
            if (neuron1 == neuron2)
            {
                return;
            }
            foreach (var synapse in AllSynapses)
            {
                if (synapse.Value.InputNeuron == neuron1 && synapse.Value.OutputNeuron == neuron2)
                {
                    return;
                }
            }


            Synapse syn = new Synapse(neuron1, neuron2, SynapseInnovationNo);

            AllSynapses.Add(syn.InnovationNo, syn);
        }
Exemplo n.º 5
0
        void AddSynapse(Synapse template)
        {
            if (AllSynapses.ContainsKey(template.InnovationNo))
            {
                Debug.Log("wtf??");
                Debug.Break();
            }
            Neuron neuron1 = null, neuron2 = null;

            if (template.InputNeuron.InnovationNo <= InputLayer.Count)
            {
                neuron1 = InputLayer[template.InputNeuron.InnovationNo - 1];
            }
            else
            {
                if (HiddenLayers.ContainsKey(template.InputNeuron.InnovationNo))
                {
                    neuron1 = HiddenLayers[template.InputNeuron.InnovationNo];
                }
                else
                {
                    neuron1 = new Neuron(template.InputNeuron);
                    HiddenLayers.Add(neuron1.InnovationNo, neuron1);
                }
            }
            if (template.OutputNeuron.InnovationNo <= InputLayer.Count + OutputLayer.Count)
            {
                neuron2 = OutputLayer[template.OutputNeuron.InnovationNo - InputLayer.Count - 1];
            }
            else
            {
                if (HiddenLayers.ContainsKey(template.OutputNeuron.InnovationNo))
                {
                    neuron2 = HiddenLayers[template.OutputNeuron.InnovationNo];
                }
                else
                {
                    neuron2 = new Neuron(template.OutputNeuron);
                    HiddenLayers.Add(neuron2.InnovationNo, neuron2);
                }
            }

            Synapse newSyn = new Synapse(neuron1, neuron2, template.InnovationNo);

            newSyn.Weight = template.Weight;
            AllSynapses.Add(newSyn.InnovationNo, newSyn);
            //Debug.Log("Koniec add synapse template");
        }
Exemplo n.º 6
0
        private void DelNeuron()
        {
            if (!HiddenLayers.Any())
            {
                return;
            }
            int    tmp    = RandomGenerator.Next(HiddenLayers.Count);
            Neuron oldNeu = HiddenLayers.Values.ToList()[tmp];

            foreach (var synapse in oldNeu.InputSynapses)
            {
                synapse.InputNeuron.OutputSynapses.Remove(synapse);
                AllSynapses.Remove(synapse.InnovationNo);
            }
            foreach (var synapse in oldNeu.OutputSynapses)
            {
                synapse.OutputNeuron.InputSynapses.Remove(synapse);
                AllSynapses.Remove(synapse.InnovationNo);
            }
            HiddenLayers.Remove(oldNeu.InnovationNo);
        }