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