/** * 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); }
// 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); }