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());
Exemplo n.º 4
0
 public EdgeGeneType(NodeGeneType from, NodeGeneType to)
 {
     From = from;
     To   = to;
 }