示例#1
0
        public Population(int inCount, int outCount, bool bias)
        {
            if (bias)
            {
                inCount++;
            }

            for (int i = 0; i < Amount; i++)
            {
                Genom genom = new Genom(inCount, outCount);
                for (int k = 0; k < inCount; k++)
                {
                    if (k == inCount - 1 && bias)
                    {
                        genom.Inputs[k].OldValue = 1;
                        continue;
                    }

                    for (int j = 0; j < outCount; j++)
                    {
                        genom.AddLink(genom.Inputs[k], genom.Outputs[j], rnd.NextDouble() * 2 - 1);
                    }
                }

                AllNets.Add(genom);
            }

            Speciate();
        }
示例#2
0
        public Genom Mate(Genom other, Random rnd)
        {
            Genom child = new Genom(Inputs.Count, Outputs.Count);

            bool        thisGeneBetter = Fitness > other.Fitness;
            List <Link> bestGenes      = thisGeneBetter ? LocalLinks : other.LocalLinks;
            List <Link> worstGenes     = !thisGeneBetter ? LocalLinks : other.LocalLinks;

            if (Fitness == other.Fitness)
            {
                worstGenes.ForEach(g =>
                {
                    if (!bestGenes.Contains(g))
                    {
                        bestGenes.Add(g);
                    }
                });
            }

            foreach (Link link in bestGenes)
            {
                Node input = new Node(link.Input.Id);
                if (!child.LocalNodes.Contains(input))
                {
                    child.Hidden.Add(input);
                    child.LocalNodes.Add(input);
                }
                else
                {
                    input = child.LocalNodes.Find(n => n.Equals(input));
                }

                Node output = new Node(link.Output.Id);
                if (!child.LocalNodes.Contains(output))
                {
                    child.Hidden.Add(output);
                    child.LocalNodes.Add(output);
                }
                else
                {
                    output = child.LocalNodes.Find(n => n.Equals(output));
                }

                double weight = link.Output.Ancestors[link.Input];
                if (rnd.Next(2) == 0 && worstGenes.Contains(link))
                {
                    Link worseLink = worstGenes.Find(l => l.Equals(link));
                    weight = worseLink.Output.Ancestors[worseLink.Input];
                }

                child.AddLink(input, output, weight);
            }

            return(child);
        }