public Population(int inCount, int outCount, bool bias) { if (bias) { inCount++; } for (int i = 0; i < Amount; i++) { Genom genom = new Genom(inCount, outCount); for (int k = 0; k < inCount; k++) { if (k == inCount - 1 && bias) { genom.Inputs[k].OldValue = 1; continue; } for (int j = 0; j < outCount; j++) { genom.AddLink(genom.Inputs[k], genom.Outputs[j], rnd.NextDouble() * 2 - 1); } } AllNets.Add(genom); } Speciate(); }
public Genom Mate(Genom other, Random rnd) { Genom child = new Genom(Inputs.Count, Outputs.Count); bool thisGeneBetter = Fitness > other.Fitness; List <Link> bestGenes = thisGeneBetter ? LocalLinks : other.LocalLinks; List <Link> worstGenes = !thisGeneBetter ? LocalLinks : other.LocalLinks; if (Fitness == other.Fitness) { worstGenes.ForEach(g => { if (!bestGenes.Contains(g)) { bestGenes.Add(g); } }); } foreach (Link link in bestGenes) { Node input = new Node(link.Input.Id); if (!child.LocalNodes.Contains(input)) { child.Hidden.Add(input); child.LocalNodes.Add(input); } else { input = child.LocalNodes.Find(n => n.Equals(input)); } Node output = new Node(link.Output.Id); if (!child.LocalNodes.Contains(output)) { child.Hidden.Add(output); child.LocalNodes.Add(output); } else { output = child.LocalNodes.Find(n => n.Equals(output)); } double weight = link.Output.Ancestors[link.Input]; if (rnd.Next(2) == 0 && worstGenes.Contains(link)) { Link worseLink = worstGenes.Find(l => l.Equals(link)); weight = worseLink.Output.Ancestors[worseLink.Input]; } child.AddLink(input, output, weight); } return(child); }