public Chromosome MutateAddNode( Func <int, int> chooseEdgeGeneTypeIndex, NodeGene newNodeGene ) => Change((e, n) => { var enabledEdges = EdgeGenes.Where(edge => edge.Value.IsEnabled).Select(edge => edge.Key).ToImmutableList(); if (enabledEdges.Count == 0) { return; } var edgeGeneType = enabledEdges.ElementAt(chooseEdgeGeneTypeIndex(enabledEdges.Count)); var edgeGene = EdgeGenes[edgeGeneType]; e[edgeGeneType] = edgeGene.Disable(); var newNodeGeneType = new NodeGeneType(NodeGeneType.InnovationIdByParents(edgeGeneType.From, edgeGeneType.To, newNodeGene)); n[newNodeGeneType] = newNodeGene; e[new EdgeGeneType(edgeGeneType.From, newNodeGeneType)] = new EdgeGene(1, true); e[new EdgeGeneType(newNodeGeneType, edgeGeneType.To)] = new EdgeGene(edgeGene.Weight, true); });
private static void TestCPPN() { var n1 = new NodeGeneType(NodeGeneType.RandomInnovationId()); var n2 = new NodeGeneType(NodeGeneType.RandomInnovationId()); var n3 = new NodeGeneType(NodeGeneType.RandomInnovationId()); var n4 = new NodeGeneType(NodeGeneType.RandomInnovationId()); var chromosome = Chromosome.Build((e, n) => { n.Add(n1, new NodeGene(FunctionType.Identity, AggregationType.Sum, NodeType.Input)); n.Add(n2, new NodeGene(FunctionType.Identity, AggregationType.Sum, NodeType.Input)); n.Add(n3, new NodeGene(FunctionType.Sin, AggregationType.Sum, NodeType.Inner)); n.Add(n4, new NodeGene(FunctionType.Identity, AggregationType.Sum, NodeType.Output)); e.Add(new EdgeGeneType(n1, n3), new EdgeGene(1, true)); e.Add(new EdgeGeneType(n2, n3), new EdgeGene(1, true)); e.Add(new EdgeGeneType(n1, n4), new EdgeGene(1, true)); e.Add(new EdgeGeneType(n3, n4), new EdgeGene(1, true)); }); var a = chromosome .MutateAddNode(n => n / 2, new NodeGene(FunctionType.Log, AggregationType.Sum, NodeType.Inner)) .MutateAddNode(n => n / 3, new NodeGene(FunctionType.Log, AggregationType.Sum, NodeType.Inner)) .MutateChangeEnabled(n => n / 4) .MutateChangeWeight(n => n / 3, 1); var b = chromosome .MutateAddNode(n => n / 2, new NodeGene(FunctionType.Exponent, AggregationType.Sum, NodeType.Inner)) .MutateAddNode(n => n / 2, new NodeGene(FunctionType.Heaviside, AggregationType.Sum, NodeType.Inner)); var c = Chromosome.Crossover(a, b, (na, nb) => new NodeGene(na.FunctionType, na.AggregationType, na.NodeType), (ea, eb) => new EdgeGene((ea.Weight + eb.Weight) / 2, true) ); var cppn = new CPPN(a, ImmutableArray.Create(n1, n2), ImmutableArray.Create(n4)); Console.WriteLine(cppn.Calculate(ImmutableArray.Create(1.0, 1.0))[0]); // n4 = n3 + n1 // n3 = Sin(n1 + n2) // }
public static string InnovationIdByParents(NodeGeneType a, NodeGeneType b, NodeGene nodeGene) => Hash(a.InnovationId + b.InnovationId + nodeGene.GetHashCode());
public EdgeGeneType(NodeGeneType from, NodeGeneType to) { From = from; To = to; }