Example #1
0
        private void AddNodes(ConnectGenes checkGenes, Genome p2)
        {
            NodeGenes inNode  = p2.nodeGenes.Find(x => x.node == checkGenes.inn);
            NodeGenes outNode = p2.nodeGenes.Find(x => x.node == checkGenes.outt);

            if (nodeGenes.FindAll(x => x.node == inNode.node).Count == 0)
            {
                nodeGenes.Add(new NodeGenes(inNode.node, inNode.nodeType));
            }

            if (nodeGenes.FindAll(x => x.node == outNode.node).Count == 0)
            {
                nodeGenes.Add(new NodeGenes(outNode.node, outNode.nodeType));
            }
        }
Example #2
0
        public static Genome Mate(Genome p1, Genome p2, ref Genome allInovations)
        {
            Genome newGenome = new Genome(p1.numSensors, p1.numOutput);

            newGenome.connectGenes = new List <ConnectGenes>();
            newGenome.nodeGenes    = new List <NodeGenes>();

            if (Random.value < crossOverRate)
            {
                int p1L = 0;
                int p2L = 0;

                bool p1End = false;
                bool p2End = false;

                while (true)
                {
                    if (p1L >= p1.connectGenes.Count)
                    {
                        p1End = true;
                    }

                    if (p2L >= p2.connectGenes.Count)
                    {
                        p2End = true;
                    }

                    if (p1End && p2End)
                    {
                        break;
                    }

                    ConnectGenes p2Connect = null;
                    ConnectGenes p1Connect = null;

                    if (!p2End)
                    {
                        p2Connect = new ConnectGenes(p2.connectGenes[p2L].inn, p2.connectGenes[p2L].outt, p2.connectGenes[p2L].weight, p2.connectGenes[p2L].enabled, p2.connectGenes[p2L].innov);
                    }
                    if (!p1End)
                    {
                        p1Connect = new ConnectGenes(p1.connectGenes[p1L].inn, p1.connectGenes[p1L].outt, p1.connectGenes[p1L].weight, p1.connectGenes[p1L].enabled, p1.connectGenes[p1L].innov);
                    }

                    if (p1End)
                    {
                        if (p1.fitness < p2.fitness)
                        {
                            newGenome.connectGenes.Add(p2Connect);
                            newGenome.AddNodes(p2.connectGenes[p2L], p2);
                        }
                        else if (p1.fitness > p2.fitness)
                        {
                        }
                        else
                        {
                            if (Random.value > .5f)
                            {
                                newGenome.connectGenes.Add(p2Connect);
                                newGenome.AddNodes(p2.connectGenes[p2L], p2);
                            }
                        }

                        p2L++;
                    }
                    else if (p2End)
                    {
                        if (p1.fitness > p2.fitness)
                        {
                            newGenome.connectGenes.Add(p1Connect);
                            newGenome.AddNodes(p1.connectGenes[p1L], p1);
                        }
                        else if (p1.fitness < p2.fitness)
                        {
                        }
                        else
                        {
                            if (Random.value > .5f)
                            {
                                newGenome.connectGenes.Add(p1Connect);
                                newGenome.AddNodes(p1.connectGenes[p1L], p1);
                            }
                        }

                        p1L++;
                    }
                    else if ((p1.connectGenes[p1L].innov > p2.connectGenes[p2L].innov))
                    {
                        if (p1.fitness < p2.fitness)
                        {
                            newGenome.connectGenes.Add(p2Connect);
                            newGenome.AddNodes(p2.connectGenes[p2L], p2);
                        }
                        else if (p1.fitness > p2.fitness)
                        {
                        }
                        else
                        {
                            if (Random.value > .5f)
                            {
                                newGenome.connectGenes.Add(p2Connect);
                                newGenome.AddNodes(p2.connectGenes[p2L], p2);
                            }
                        }

                        p2L++;
                    }
                    else if ((p1.connectGenes[p1L].innov < p2.connectGenes[p2L].innov))
                    {
                        if (p1.fitness > p2.fitness)
                        {
                            newGenome.connectGenes.Add(p1Connect);
                            newGenome.AddNodes(p1.connectGenes[p1L], p1);
                        }
                        else if (p1.fitness < p2.fitness)
                        {
                        }
                        else
                        {
                            if (Random.value > .5f)
                            {
                                newGenome.connectGenes.Add(p1Connect);
                                newGenome.AddNodes(p1.connectGenes[p1L], p1);
                            }
                        }

                        p1L++;
                    }
                    else if (p1.connectGenes[p1L].innov == p2.connectGenes[p2L].innov)
                    {
                        if (Random.value > .5f)
                        {
                            newGenome.connectGenes.Add(p1Connect);
                            newGenome.AddNodes(p1.connectGenes[p1L], p1);
                        }
                        else
                        {
                            newGenome.connectGenes.Add(p2Connect);
                            newGenome.AddNodes(p2.connectGenes[p2L], p2);
                        }

                        if ((!p1.connectGenes[p1L].enabled || !p2.connectGenes[p2L].enabled) && Random.value > .25f)
                        {
                            newGenome.connectGenes[newGenome.connectGenes.Count - 1].setEnabled(false);
                        }

                        p1L++;
                        p2L++;
                    }
                }

                newGenome.nodeGenes.Sort((x, y) => x.node.CompareTo(y.node));
                newGenome.connectGenes.Sort((x, y) => x.innov.CompareTo(y.innov));
                newGenome.innov = newGenome.connectGenes[newGenome.connectGenes.Count - 1].innov;
            }
            else if (Random.value < .5)
            {
                newGenome.connectGenes = new List <ConnectGenes>(p1.connectGenes);
                newGenome.nodeGenes    = new List <NodeGenes>(p1.nodeGenes);
                newGenome.innov        = p1.innov;
            }
            else
            {
                newGenome.connectGenes = new List <ConnectGenes>(p2.connectGenes);
                newGenome.nodeGenes    = new List <NodeGenes>(p2.nodeGenes);
                newGenome.innov        = p2.innov;
            }

            if (Random.value < mutationChance)
            {
                newGenome.Mutate(ref allInovations);
            }
            return(newGenome);
        }