Esempio n. 1
0
        public void addSynapse(Synapse synapse, Genome parent1, Genome parent2)
        {
            if (this.fitness != -1)
            {
                return;
            }

            if (this.synapses.ContainsKey(synapse.innovationNumber))
            {
                return;
            }

            synapse = synapse.clone();

            if (parent1 != null && parent2 != null)
            {
                if (parent1.hasSynapse(synapse.innovationNumber) && parent2.hasSynapse(synapse.innovationNumber))
                {
                    bool dis1 = !parent1.synapses[synapse.innovationNumber].enabled;
                    bool dis2 = !parent2.synapses[synapse.innovationNumber].enabled;

                    if ((dis1 && !dis2) || (!dis1 && dis2))
                    {
                        bool disabled = RandomUtil.success(Config.NEURON_DISABLE_CHANCE);
                        synapse.enabled = !disabled;
                    }
                }
            }

            this.synapses.Add(synapse.innovationNumber, synapse);
        }
Esempio n. 2
0
        private static Genome crossDominant(NeatManager neat, Genome dominant, Genome other)
        {
            if (dominant.synapses.Count == 0 || other.synapses.Count == 0)
            {
                return(null);
            }

            int similarityNeurons = -1;

            for (int i = 1; i < 100000; i++)
            {
                if (dominant.hasSynapse(i) && other.hasSynapse(i))
                {
                    similarityNeurons = i;
                }
            }

            if (similarityNeurons == -1)
            {
                throw new Exception("No similarity between Genomes");
            }

            Genome newGenome = new Genome(neat, null, dominant.inputNeurons.ToArray(), dominant.outputNeurons.ToArray());

            for (int i = 1; i <= dominant.getHighestInnovationNumber(); i++)
            {
                if (dominant.hasSynapse(i))
                {
                    int    innovationNumber, inputNeuron, outputNeuron;
                    double weigth;
                    bool   enabled;

                    if (other.hasSynapse(i))
                    {
                        Random r = new Random();

                        if (r.Next(0, 1) == 1)
                        {
                            innovationNumber = dominant.synapses[i].innovationNumber;
                            inputNeuron      = dominant.synapses[i].from;
                            outputNeuron     = dominant.synapses[i].to;
                            weigth           = dominant.synapses[i].weight;
                            enabled          = dominant.synapses[i].enabled;
                        }
                        else
                        {
                            innovationNumber = other.synapses[i].innovationNumber;
                            inputNeuron      = other.synapses[i].from;
                            outputNeuron     = other.synapses[i].to;
                            weigth           = other.synapses[i].weight;
                            enabled          = other.synapses[i].enabled;
                        }
                    }
                    else
                    {
                        innovationNumber = dominant.synapses[i].innovationNumber;
                        inputNeuron      = dominant.synapses[i].from;
                        outputNeuron     = dominant.synapses[i].to;
                        weigth           = dominant.synapses[i].weight;
                        enabled          = dominant.synapses[i].enabled;
                    }
                    newGenome.addSynapse(new Synapse(innovationNumber, inputNeuron, outputNeuron, weigth, enabled), dominant, other);
                }
            }

            newGenome.removeDuplicateSynapses();
            newGenome.mutate();

            return(newGenome);
        }