Exemple #1
0
        public void test()
        {
            var random = new RandomImplementation(23);
            INeatConfiguration configuration = new DefaultNeatConfiguration(500);
            var nodeInovator       = new InnovationGenerator(1);
            var connectionInovator = new InnovationGenerator(1);

            var problemDomain = new ProblemDomain(
                inputs:
                new double[, ]
            {
                { 0, 0, 1 },
                { 0, 1, 1 },
                { 1, 0, 1 },
                { 1, 1, 1 }
            },
                outputs:
                new double[, ]
            {
                { 0 },
                { 1 },
                { 1 },
                { 0 }
            });
            var genome = CreateOriginalGenome(nodeInovator, connectionInovator, problemDomain);

            var genomeProvider = new XORNNProvider(nodeInovator, connectionInovator, random, genome);

            var crossFunction = new NeatCrossFunction(random, configuration);

            var weightMutation        = new ApplyWeightMutation(random, configuration);
            var addNodeMutation       = new AddNodeMutation(nodeInovator, connectionInovator, random);
            var addConnectionMutation = new AddConnectionMutation(connectionInovator, random, configuration);

            var evaluator = new XORNNEvaluator(configuration, genomeProvider, nodeInovator, connectionInovator, addConnectionMutation, addNodeMutation, weightMutation, crossFunction, random, problemDomain);


            for (int i = 0; i < 1000; i++)
            {
                evaluator.EvaluateGeneration();
                Console.WriteLine($"Best Fitness: {evaluator.FittestGenome.Fitness}");
            }

            Assert.That(evaluator.FittestGenome.Fitness > 90);
        }
Exemple #2
0
        private static Genome CreateOriginalGenome(InnovationGenerator nodeInovator, InnovationGenerator connectionInovator, ProblemDomain problemDomain)
        {
            var grandGenome = new Genome();

            grandGenome.Nodes = new Dictionary <int, Node>();
            for (int i = 0; i < problemDomain.Inputs.GetLength(1); i++)
            {
                var node = new Node {
                    Id = nodeInovator.GetNextInnovation(), NodeType = SoNEAT.Models.NodeType.Sensor
                };
                grandGenome.Nodes.Add(node.Id, node);
            }

            for (int i = 0; i < problemDomain.Outputs.GetLength(1); i++)
            {
                var node = new Node {
                    Id = nodeInovator.GetNextInnovation(), NodeType = SoNEAT.Models.NodeType.Output
                };
                grandGenome.Nodes.Add(node.Id, node);
            }

            grandGenome.Connections = new Dictionary <int, SoNEAT.Models.Connection>();
            foreach (var inNode in grandGenome.Nodes.Values.Where(n => n.NodeType == SoNEAT.Models.NodeType.Sensor))
            {
                foreach (var outNode in grandGenome.Nodes.Values.Where(n => n.NodeType == SoNEAT.Models.NodeType.Output))
                {
                    var connection = new Connection()
                    {
                        Id        = connectionInovator.GetNextInnovation(),
                        InNodeId  = inNode.Id,
                        OutNodeId = outNode.Id,
                        IsEnabled = true,
                        Weight    = 1.0
                    };
                    grandGenome.Connections.Add(connection.Id, connection);
                }
            }

            return(grandGenome);
        }
Exemple #3
0
 public XORNNEvaluator(INeatConfiguration neatConfiguration, IGenesisGenomeProvider genomeProvider, IInnovationPointGenerator nodeInnovationGenerator, IInnovationPointGenerator connectionInnovationGenerator, IMutation addConnectionMutation, IMutation addNodeMutation, IMutation weightMutation, ICrossFunctionStrategy crossFunctionStrategy, IRandom random, ProblemDomain problemDomain) : base(neatConfiguration, genomeProvider, nodeInnovationGenerator, connectionInnovationGenerator, addConnectionMutation, addNodeMutation, weightMutation, crossFunctionStrategy, random)
 {
     _problemDomain = problemDomain;
 }