コード例 #1
0
ファイル: NeuralNetwork.cs プロジェクト: frostiq/NES
        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);
        }
コード例 #2
0
ファイル: Interbreeder.cs プロジェクト: frostiq/NES
        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));
        }