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