public override void CreateBrain(BrainComponent brainComp, IMutatorConfig config) { var neatConfig = (NeatMutationConfig)config; // Add nodes for inputs and outputs foreach ((string namedInput, string _) in brainComp.InputMap) { // Note activation function on input nodes is not used. this.AddNamedNode(namedInput, NodeType.INPUT, ActivationFunctionType.SOFTSIGN); } foreach ((string namedOutput, string _) in brainComp.OutputMap) { this.AddNamedNode(namedOutput, NodeType.OUTPUT, (ActivationFunctionType)neatConfig.OutputActivationFunction); } // Increase connection innovation id as we loop int connInnovationId = 0; Random r = new Random(); double chanceToMakeConnection = 1d; foreach (var input in NodeGenes.FindAll((g) => g.NodeType == NodeType.INPUT || g.NodeType == NodeType.BIAS)) { foreach (var output in NodeGenes.FindAll((g) => g.NodeType == NodeType.OUTPUT)) { if (r.NextDouble() < chanceToMakeConnection) { // Add new connection gene ConnectionGenes.Add(new ConnectionGene(connInnovationId, input.InnovationId, output.InnovationId, r.Normal(0, 1.5))); connInnovationId++; } } } }
public override void CreateBrain(BrainComponent brainComponent, IMutatorConfig config) { Inputs = new(); Outputs = new(); foreach (string input in brainComponent.InputMap.Values) { Inputs.Add(input); } foreach (string output in brainComponent.OutputMap.Values) { Outputs.Add(output); } }
public abstract void CreateBrain(BrainComponent brainComponent, IMutatorConfig config);