public NeuralNetwork (AdjacencyGraph <INeuron, Connection> network, ICollection <INeuron> inputNeurons, ICollection <INeuron> outputNeurons) { _network = network; _outputNeurons = outputNeurons; _inputNeurons = inputNeurons; AlphaVertex = new EmptyNeuron("Alpha"); _network.AddVertex(AlphaVertex); foreach (var inputNeuron in _inputNeurons) { _network.AddEdge(new Connection(AlphaVertex, inputNeuron, 0d)); } OmegaVertex = new EmptyNeuron("Omega"); _network.AddVertex(OmegaVertex); foreach (var outputNeuron in _outputNeurons) { _network.AddEdge(new Connection(outputNeuron, OmegaVertex, 0d)); } _algorithm = new BreadthFirstSearchAlgorithm <INeuron, Connection>(_network); _algorithm.ExamineEdge += AddSignal; _algorithm.SetRootVertex(AlphaVertex); }
public NeuralNetwork Interbreed(NeuralNetwork redNetwork, NeuralNetwork blueNetwork) { _logger.Info("Interbreeding started"); redNetwork.GetConnections(redNetwork.AlphaVertex) .OrderBy(x => random.Next()) .ForEach(redQueue.Enqueue); blueNetwork.GetConnections(blueNetwork.AlphaVertex) .OrderBy(x => random.Next()) .ForEach(blueQueue.Enqueue); alpha = new EmptyNeuron("Alpha"); omega = new EmptyNeuron("Omega"); resultNetwork = new AdjacencyGraph <INeuron, Connection>(); resultNetwork.AddVertex(alpha); resultNetwork.AddVertex(omega); while (redQueue.Count > 0 && blueQueue.Count > 0) { var za = redQueue.Dequeue(); var yb = blueQueue.Dequeue(); var a = za.Target; var b = yb.Target; if (IsNotMarked(a) && IsNotMarked(b)) { var product = Interbreed(a, b); newNeurons.Add(Tuple.Create(a, b, product)); Mark(a, b); } var newConnections = Translate(za).Concat(Translate(yb)).ToList(); AddNewConnections(newConnections); AddRandomSubsetToQueue(redNetwork.GetConnections(a), redQueue); AddRandomSubsetToQueue(blueNetwork.GetConnections(b), blueQueue); } var res = new NeuralNetwork(resultNetwork, alpha, omega); if (res.IsCompliant(inputSize, outputSize)) { _logger.Info("Interbreeding was finished succesfully"); return(res); } _logger.Info("Interbreeding was not succesfull"); return(Interbreed(redNetwork, blueNetwork)); }