/// <summary> /// Adds gene between two nodes. /// There cannot be two genes between same nodes. /// </summary> private void AddGene(Random rnd, ref int innovation, List <Gene> allGenes) { int latter; int first; do { first = rnd.Next(0, Nodes.Count); }while(Nodes[first].Type == NodeType.Output); Node input = Nodes[first]; Node output; int j = 0; do { latter = rnd.Next(0, Nodes.Count); output = Nodes[latter]; ++j; if (j > 10 && input.Layer >= output.Layer) { for (int i = 0; i < Nodes.Count; i++) { if (input.Layer < Nodes[i].Layer) { output = Nodes[i]; } } } } // SHOULD NOT PICK THE SAME LAYER while (input.Layer >= output.Layer); Gene gene = null; foreach (var item in allGenes) { if (item.In.Number == input.Number && item.Out.Number == output.Number) { gene = item.ShallowCopy(); gene.In = input; gene.Type = GeneType.Enabled; gene.Out = output; break; } } if (gene == null) { gene = new Gene(input, output, 0f, GeneType.Enabled, ++innovation); var g = gene.ShallowCopy(); g.Type = GeneType.AddGene; allGenes.Add(g); } if (Genes.ContainsValue(gene)) { return; } gene.Weight = gene.AssignRandomWeight(rnd); gene.In.OutgoingConnections.Add(gene); Genes.Add(gene.Innovation, gene); }
private void AddGeneFromThis(Gene curr1, Gene curr2, Dictionary <int, Node> dict, Random rnd, SortedList <int, Gene> genes) { var gene = curr1.ShallowCopy(); AddNodesToDictIfNotIn(dict, gene); // Layers are OK gene.Type = (curr1.CrossoverChildDisabled(rnd, curr2)) ? GeneType.Enabled : GeneType.Disabled; genes.Add(gene.Innovation, gene); }
private void AddGeneFromOther(Gene curr1, Gene curr2, Dictionary <int, Node> dict, Random rnd, SortedList <int, Gene> genes) { var gene = curr2.ShallowCopy(); AddNodesToDictIfNotIn(dict, gene); // Layers are not OK gene.Type = (curr2.CrossoverChildDisabled(rnd, curr1)) ? GeneType.Enabled : GeneType.Disabled; genes.Add(gene.Innovation, gene); // Correct Layers from more fit parent A.K.A. this genome gene.In.Layer = curr1.In.Layer; gene.Out.Layer = curr1.Out.Layer; }