示例#1
0
        /**
         * Add a synapse between two random neurons
         * not currently connected
         * add a random weight to the synapse
         */
        private void addNewSynapse()
        {
            List <ZeroSynapse> currentSynapses = this.genome.getAllSynapses();
            int         attempts        = 0;
            ZeroSynapse possibleSynapse = null;

            do
            {
                if (attempts++ > 40)
                {
                    return;
                }

                int        from     = genome.getNeurons(true, true, false)[RandomUtil.integer(0, this.genome.getNeurons(true, true, false).Count - 1)];
                List <int> leftOver = this.genome.getNeurons(false, true, true);

                if (leftOver.Count == 0)
                {
                    continue;
                }

                int to = leftOver[RandomUtil.integer(0, leftOver.Count - 1)];
                possibleSynapse = new ZeroSynapse(from, to);
            } while (((possibleSynapse == null) || ((possibleSynapse.from == possibleSynapse.to) || (currentSynapses.Contains(possibleSynapse) || isRecurrent(possibleSynapse)))));

            genome.addSynapse(new Synapse(genome.neat.getNextInnovationNumber(), possibleSynapse.from, possibleSynapse.to, RandomUtil.integer(-1, 1), true), null, null);
        }
示例#2
0
        // REF: [GITHUB] SanderGielisse logic for looping
        // and testing unconnected neurons
        // (https://github.com/SanderGielisse/Mythan)
        private bool isRecurrent(ZeroSynapse with)
        {
            Genome tmpGenome = this.genome.clone();

            if ((with != null))
            {
                Synapse synapse = new Synapse((tmpGenome.getHighestInnovationNumber() + 1), with.from, with.to, 0, true);
                tmpGenome.addSynapse(synapse, null, null);
            }

            bool recc = false;

            foreach (int hiddenNeuron in tmpGenome.getHiddenNeurons())
            {
                if (this.isRecurrent(new List <int>(), ref tmpGenome, hiddenNeuron))
                {
                    recc = true;
                }
            }

            return(recc);
        }