private NeatGenome.NeatGenome generateHomogeneousGenomeES(INetwork network, bool normalizeWeights, bool adaptiveNetwork, bool modulatoryNet) { List<PointF> hiddenNeuronPositions = new List<PointF>(); IActivationFunction activationFunction = HyperNEATParameters.substrateActivationFunction; ConnectionGeneList connections = new ConnectionGeneList();//(int)((InputCount * HiddenCount) + (HiddenCount * OutputCount))); List<PointF> outputNeuronPositions = getNeuronGroupByType(1); List<PointF> inputNeuronPositions = getNeuronGroupByType(0); EvolvableSubstrate se = new EvolvableSubstrate(); se.generateConnections(inputNeuronPositions, outputNeuronPositions, network, HyperNEATParameters.initialRes, (float)HyperNEATParameters.varianceThreshold, (float)HyperNEATParameters.bandingThreshold, (int)HyperNEATParameters.ESIterations, (float)HyperNEATParameters.divisionThreshold, HyperNEATParameters.maximumRes, InputCount, OutputCount, -1.0f, -1.0f, 1.0f, 1.0f, ref connections, ref hiddenNeuronPositions); HiddenCount = (uint)hiddenNeuronPositions.Count; float[] coordinates = new float[5]; uint connectionCounter = (uint)connections.Count; NeuronGeneList neurons; // SharpNEAT requires that the neuron list be in this order: bias|input|output|hidden neurons = new NeuronGeneList((int)(InputCount + OutputCount + HiddenCount)); // set up the input nodes for (uint a = 0; a < InputCount; a++) { neurons.Add(new NeuronGene(a, NeuronType.Input, ActivationFunctionFactory.GetActivationFunction("NullFn"))); } // set up the output nodes for (uint a = 0; a < OutputCount; a++) { neurons.Add(new NeuronGene(a + InputCount, NeuronType.Output, activationFunction)); } // set up the hidden nodes for (uint a = 0; a < HiddenCount; a++) { neurons.Add(new NeuronGene(a + InputCount + OutputCount, NeuronType.Hidden, activationFunction)); } bool[] visited = new bool[neurons.Count]; List<uint> nodeList = new List<uint>(); bool[] connectedToInput = new bool[neurons.Count]; bool[] isOutput = new bool[neurons.Count]; bool danglingConnection = true; while (danglingConnection) { bool[] hasIncomming = new bool[neurons.Count]; foreach (ConnectionGene co in connections) { // if (co.SourceNeuronId != co.TargetNeuronId) // { hasIncomming[co.TargetNeuronId] = true; // } } for (int i = 0; i < InputCount; i++) hasIncomming[i] = true; bool[] hasOutgoing = new bool[neurons.Count]; foreach (ConnectionGene co in connections) { // if (co.TargetNeuronId != co.SourceNeuronId) // { if (co.TargetNeuronId != co.SourceNeuronId) //neurons that only connect to themselfs don't count { hasOutgoing[co.SourceNeuronId] = true; } // } } //Keep output neurons for (int i = 0; i < OutputCount; i++) hasOutgoing[i + InputCount] = true; danglingConnection = false; //Check if there are still dangling connections foreach (ConnectionGene co in connections) { if (!hasOutgoing[co.TargetNeuronId] || !hasIncomming[co.SourceNeuronId]) { danglingConnection = true; break; } } connections.RemoveAll(delegate(ConnectionGene m) { return (!hasIncomming[m.SourceNeuronId]); }); connections.RemoveAll(delegate(ConnectionGene m) { return (!hasOutgoing[m.TargetNeuronId]); }); } if (normalizeWeights) { normalizeWeightConnections(ref connections, neurons.Count); } SharpNeatLib.NeatGenome.NeatGenome gn = new SharpNeatLib.NeatGenome.NeatGenome(0, neurons, connections, (int)(InputCount), (int)(OutputCount)); // SharpNeatLib.NeatGenome.NeatGenome sng = new SharpNeatLib.NeatGenome.NeatGenome(0, neurons, connections, (int)(totalInputCount), (int)(totalOutputCount)); gn.networkAdaptable = adaptiveNetwork; gn.networkModulatory = modulatoryNet; return gn; }
private NeatGenome.NeatGenome generateHomogeneousGenomeES(INetwork network, bool normalizeWeights, bool adaptiveNetwork, bool modulatoryNet) { List <PointF> hiddenNeuronPositions = new List <PointF>(); IActivationFunction activationFunction = HyperNEATParameters.substrateActivationFunction; ConnectionGeneList connections = new ConnectionGeneList();//(int)((InputCount * HiddenCount) + (HiddenCount * OutputCount))); List <PointF> outputNeuronPositions = getNeuronGroupByType(1); List <PointF> inputNeuronPositions = getNeuronGroupByType(0); EvolvableSubstrate se = new EvolvableSubstrate(); se.generateConnections(inputNeuronPositions, outputNeuronPositions, network, HyperNEATParameters.initialRes, (float)HyperNEATParameters.varianceThreshold, (float)HyperNEATParameters.bandingThreshold, (int)HyperNEATParameters.ESIterations, (float)HyperNEATParameters.divisionThreshold, HyperNEATParameters.maximumRes, InputCount, OutputCount, -1.0f, -1.0f, 1.0f, 1.0f, ref connections, ref hiddenNeuronPositions); HiddenCount = (uint)hiddenNeuronPositions.Count; float[] coordinates = new float[5]; uint connectionCounter = (uint)connections.Count; NeuronGeneList neurons; // SharpNEAT requires that the neuron list be in this order: bias|input|output|hidden neurons = new NeuronGeneList((int)(InputCount + OutputCount + HiddenCount)); // set up the input nodes for (uint a = 0; a < InputCount; a++) { neurons.Add(new NeuronGene(a, NeuronType.Input, ActivationFunctionFactory.GetActivationFunction("NullFn"))); } // set up the output nodes for (uint a = 0; a < OutputCount; a++) { neurons.Add(new NeuronGene(a + InputCount, NeuronType.Output, activationFunction)); } // set up the hidden nodes for (uint a = 0; a < HiddenCount; a++) { neurons.Add(new NeuronGene(a + InputCount + OutputCount, NeuronType.Hidden, activationFunction)); } bool[] visited = new bool[neurons.Count]; List <uint> nodeList = new List <uint>(); bool[] connectedToInput = new bool[neurons.Count]; bool[] isOutput = new bool[neurons.Count]; bool danglingConnection = true; while (danglingConnection) { bool[] hasIncomming = new bool[neurons.Count]; foreach (ConnectionGene co in connections) { // if (co.SourceNeuronId != co.TargetNeuronId) // { hasIncomming[co.TargetNeuronId] = true; // } } for (int i = 0; i < InputCount; i++) { hasIncomming[i] = true; } bool[] hasOutgoing = new bool[neurons.Count]; foreach (ConnectionGene co in connections) { // if (co.TargetNeuronId != co.SourceNeuronId) // { if (co.TargetNeuronId != co.SourceNeuronId) //neurons that only connect to themselfs don't count { hasOutgoing[co.SourceNeuronId] = true; } // } } //Keep output neurons for (int i = 0; i < OutputCount; i++) { hasOutgoing[i + InputCount] = true; } danglingConnection = false; //Check if there are still dangling connections foreach (ConnectionGene co in connections) { if (!hasOutgoing[co.TargetNeuronId] || !hasIncomming[co.SourceNeuronId]) { danglingConnection = true; break; } } connections.RemoveAll(delegate(ConnectionGene m) { return(!hasIncomming[m.SourceNeuronId]); }); connections.RemoveAll(delegate(ConnectionGene m) { return(!hasOutgoing[m.TargetNeuronId]); }); } if (normalizeWeights) { normalizeWeightConnections(ref connections, neurons.Count); } SharpNeatLib.NeatGenome.NeatGenome gn = new SharpNeatLib.NeatGenome.NeatGenome(0, neurons, connections, (int)(InputCount), (int)(OutputCount)); // SharpNeatLib.NeatGenome.NeatGenome sng = new SharpNeatLib.NeatGenome.NeatGenome(0, neurons, connections, (int)(totalInputCount), (int)(totalOutputCount)); gn.networkAdaptable = adaptiveNetwork; gn.networkModulatory = modulatoryNet; return(gn); }