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); }
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); }
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; }