Example #1
0
        void ensureSingleConnectedStructure(ConnectionGeneList connections, List <PointF> hiddenNeurons, Dictionary <long, PointF> conSourcePoints, Dictionary <long, PointF> conTargetPoints)
        {
            List <List <long> > allChains = new List <List <long> >();
            int maxChain = 0;

            foreach (var con in connections)
            {
                bool        isInChain = false;
                List <long> nChain    = null;
                foreach (List <long> chain in allChains)
                {
                    maxChain = Math.Max(chain.Count, maxChain);

                    if (chain.Contains(con.SourceNeuronId) || chain.Contains(con.TargetNeuronId))
                    {
                        nChain    = chain;
                        isInChain = true;
                        break;
                    }
                }

                if (!isInChain)
                {
                    nChain = new List <long>();
                    allChains.Add(nChain);
                }

                if (!nChain.Contains(con.SourceNeuronId))
                {
                    nChain.Add(con.SourceNeuronId);
                }

                if (!nChain.Contains(con.TargetNeuronId))
                {
                    nChain.Add(con.TargetNeuronId);
                }
            }


            List <long> finalChain = allChains.Find(chain => chain.Count == maxChain);

            if (finalChain != null && finalChain.Count != 0)
            {
                List <ConnectionGene> markDelete = new List <ConnectionGene>();

                foreach (var conn in connections)
                {
                    bool delete = false;
                    //if we don't have you in our chain, get rid of the object
                    if (!finalChain.Contains(conn.SourceNeuronId))
                    {
                        hiddenNeurons.Remove(conSourcePoints[conn.InnovationId]);
                        delete = true;
                    }

                    if (!finalChain.Contains(conn.TargetNeuronId))
                    {
                        hiddenNeurons.Remove(conTargetPoints[conn.InnovationId]);
                        delete = true;
                    }

                    if (delete)
                    {
                        markDelete.Add(conn);
                    }
                }
                markDelete.ForEach(x => connections.Remove(x));
                //connections.RemoveAll(x => !(finalChain.Contains(x.SourceNeuronId) || finalChain.Contains(x.TargetNeuronId)));
                //hiddenNeurons.RemoveAll(hn =>
            }

            connections.ForEach(con =>
            {
                //readjust connection source/target depending on hiddenNeuron array
                PointF point       = conSourcePoints[con.InnovationId];
                con.SourceNeuronId = hiddenNeurons.FindIndex(hp => hp.X == point.X && hp.Y == point.Y);

                if (con.SourceNeuronId == -1)
                {
                    Console.WriteLine("Adjusted con src- " + con.SourceNeuronId + " tgt- " + con.TargetNeuronId);
                }

                point = conTargetPoints[con.InnovationId];
                con.TargetNeuronId = hiddenNeurons.FindIndex(hp => hp.X == point.X && hp.Y == point.Y);

                if (con.TargetNeuronId == -1)
                {
                    Console.WriteLine("Adjusted con src- " + con.SourceNeuronId + " tgt- " + con.TargetNeuronId);
                }
            });
        }
Example #2
0
        void ensureSingleConnectedStructure(ConnectionGeneList connections, List<PointF> hiddenNeurons, Dictionary<long, PointF> conSourcePoints, Dictionary<long, PointF> conTargetPoints)
        {
            List<List<long>> allChains = new List<List<long>>();
            int maxChain = 0;

            foreach (var con in connections)
            {
                bool isInChain = false;
                List<long> nChain = null;
                foreach (List<long> chain in allChains)
                {
                    maxChain = Math.Max(chain.Count, maxChain);

                    if (chain.Contains(con.SourceNeuronId) || chain.Contains(con.TargetNeuronId))
                    {
                        nChain = chain;
                        isInChain = true;
                        break;
                    }
                }

                if (!isInChain)
                {
                    nChain = new List<long>();
                    allChains.Add(nChain);
                }

                if (!nChain.Contains(con.SourceNeuronId))
                    nChain.Add(con.SourceNeuronId);

                if (!nChain.Contains(con.TargetNeuronId))
                    nChain.Add(con.TargetNeuronId);

            }

            List<long> finalChain = allChains.Find(chain => chain.Count == maxChain);
            if (finalChain != null && finalChain.Count != 0)
            {
                List<ConnectionGene> markDelete = new List<ConnectionGene>();

                foreach (var conn in connections)
                {
                    bool delete = false;
                    //if we don't have you in our chain, get rid of the object
                    if (!finalChain.Contains(conn.SourceNeuronId))
                    {
                        hiddenNeurons.Remove(conSourcePoints[conn.InnovationId]);
                        delete = true;
                    }

                    if (!finalChain.Contains(conn.TargetNeuronId))
                    {
                        hiddenNeurons.Remove(conTargetPoints[conn.InnovationId]);
                        delete = true;
                    }

                    if (delete)
                        markDelete.Add(conn);
                }
                markDelete.ForEach(x => connections.Remove(x));
                //connections.RemoveAll(x => !(finalChain.Contains(x.SourceNeuronId) || finalChain.Contains(x.TargetNeuronId)));
                //hiddenNeurons.RemoveAll(hn =>
            }

            connections.ForEach(con =>
            {
                //readjust connection source/target depending on hiddenNeuron array
                PointF point = conSourcePoints[con.InnovationId];
                con.SourceNeuronId = hiddenNeurons.FindIndex(hp => hp.X == point.X && hp.Y == point.Y);

                if (con.SourceNeuronId == -1)
                    Console.WriteLine("Adjusted con src- " + con.SourceNeuronId + " tgt- " + con.TargetNeuronId);

                point = conTargetPoints[con.InnovationId];
                con.TargetNeuronId = hiddenNeurons.FindIndex(hp => hp.X == point.X && hp.Y == point.Y);

                if (con.TargetNeuronId == -1)
                    Console.WriteLine("Adjusted con src- " + con.SourceNeuronId + " tgt- " + con.TargetNeuronId);

            });
        }