public Node Clone() { Node node = new Node(); if (AiMath.PercentChance(mutationChance)) { node.bias = bias + AiMath.RandomRange(-0.1f, 0.1f); } else { node.bias = bias; } node.inovation = _inovation; return(node); }
public Axon Clone() { Axon axon = new Axon(); if (AiMath.PercentChance(mutationChance)) { axon.weight = weight + AiMath.RandomRange(-0.1f, 0.1f); } else { axon.weight = weight; } axon.A = A; axon.B = B; axon.inovation = inovation; return(axon); }
public DNA Mitosis() { DNA baby = new DNA(0, 0); baby.specie.RemoveMember(baby); baby.specie = null; baby.CloneInto(nodes, axons); if (AiMath.PercentChance(Node.mutationChance / 100f)) { nodes.Add(Node.NewNode()); } if (AiMath.PercentChance(Axon.mutationChance)) { SafeAxon(); } baby.GetSpecie(specie); baby.ID = inovation + "/" + baby.inovation; return(baby); }
public DNA Mate(DNA mother) { DNA baby = new DNA(0, 0); baby.specie.RemoveMember(baby); baby.specie = null; baby.CloneInto(nodes, axons); for (int n = 0; n < mother.nodes.Count; n++) { if (n < baby.nodes.Count) { Node fnode = nodes[n]; Node mnode = mother.nodes[n]; if (fnode.inovation == mnode.inovation) { if (AiMath.PercentChance(50f)) { baby.nodes[n] = mnode.Clone(); } else { baby.nodes[n] = fnode.Clone(); } } } else { baby.nodes.Add(mother.nodes[n]); } } for (int a = 0; a < mother.axons.Count; a++) { if (a < baby.axons.Count) { Axon faxon = axons[a]; Axon maxon = mother.axons[a]; if (faxon.inovation == maxon.inovation) { if (AiMath.PercentChance(50f)) { baby.axons[a] = maxon.Clone(); } else { baby.axons[a] = faxon.Clone(); } } } else { baby.axons.Add(mother.axons[a]); } } if (AiMath.PercentChance(Node.mutationChance / 100f)) { nodes.Add(Node.NewNode()); } if (AiMath.PercentChance(Axon.mutationChance)) { SafeAxon(); } baby.GetSpecie(specie); baby.ID = inovation + "-" + mother.inovation + "/" + baby.inovation; return(baby); }