예제 #1
0
        public static void Xor(object target)
        {
            NetworkGenome genome = target as NetworkGenome;

            double[]        inputs         = new double[2];
            bool            flag1          = true;
            DecodedNetworks decodedNetwork = DecodedNetworks.DecodeGenome(genome);

            inputs[0] = 0.0;
            inputs[1] = 0.0;
            decodedNetwork.SetInputs(inputs);
            decodedNetwork.ActivateNetwork(6);
            double[] outputs1 = decodedNetwork.GetOutputs();
            genome.Fitness  = 0.0;
            genome.Fitness += Math.Min(1.0, Math.Max(0.0, 1.0 - outputs1[0]));
            bool flag2 = flag1 && outputs1[0] < 0.5;

            decodedNetwork.Flush();
            inputs[0] = 1.0;
            inputs[1] = 1.0;
            decodedNetwork.SetInputs(inputs);
            decodedNetwork.ActivateNetwork(6);
            double[] outputs2 = decodedNetwork.GetOutputs();
            genome.Fitness += Math.Min(1.0, Math.Max(0.0, 1.0 - outputs2[0]));
            bool flag3 = flag2 && outputs2[0] < 0.5;

            decodedNetwork.Flush();
            inputs[0] = 0.0;
            inputs[1] = 1.0;
            decodedNetwork.SetInputs(inputs);
            decodedNetwork.ActivateNetwork(6);
            double[] outputs3 = decodedNetwork.GetOutputs();
            genome.Fitness += Math.Min(1.0, Math.Max(0.0, outputs3[0]));
            bool flag4 = flag3 && outputs3[0] >= 0.5;

            decodedNetwork.Flush();
            inputs[0] = 1.0;
            inputs[1] = 0.0;
            decodedNetwork.SetInputs(inputs);
            decodedNetwork.ActivateNetwork(6);
            double[] outputs4 = decodedNetwork.GetOutputs();
            genome.Fitness += Math.Min(1.0, Math.Max(0.0, outputs4[0]));
            bool flag5 = flag4 && outputs4[0] >= 0.5;

            decodedNetwork.Flush();
            if (!flag5)
            {
                return;
            }
            genome.Fitness = 4.0;
        }
예제 #2
0
        public static bool NormalXor(List <NetworkGenome> genomes, bool test)
        {
            double[] inputs = new double[2];
            bool     flag1  = false;

            foreach (NetworkGenome genome in genomes)
            {
                bool            flag2          = true;
                DecodedNetworks decodedNetwork = DecodedNetworks.DecodeGenome(genome);
                inputs[0] = 0.0;
                inputs[1] = 0.0;
                decodedNetwork.SetInputs(inputs);
                decodedNetwork.ActivateNetwork(6);
                double[] outputs1 = decodedNetwork.GetOutputs();
                genome.Fitness  = 0.0;
                genome.Fitness += Math.Min(1.0, Math.Max(0.0, 1.0 - outputs1[0]));
                bool flag3 = flag2 && outputs1[0] < 0.5;
                decodedNetwork.Flush();
                inputs[0] = 1.0;
                inputs[1] = 1.0;
                decodedNetwork.SetInputs(inputs);
                decodedNetwork.ActivateNetwork(6);
                double[] outputs2 = decodedNetwork.GetOutputs();
                genome.Fitness += Math.Min(1.0, Math.Max(0.0, 1.0 - outputs2[0]));
                bool flag4 = flag3 && outputs2[0] < 0.5;
                decodedNetwork.Flush();
                inputs[0] = 0.0;
                inputs[1] = 1.0;
                decodedNetwork.SetInputs(inputs);
                decodedNetwork.ActivateNetwork(6);
                double[] outputs3 = decodedNetwork.GetOutputs();
                genome.Fitness += Math.Min(1.0, Math.Max(0.0, outputs3[0]));
                bool flag5 = flag4 && outputs3[0] >= 0.5;
                decodedNetwork.Flush();
                inputs[0] = 1.0;
                inputs[1] = 0.0;
                decodedNetwork.SetInputs(inputs);
                decodedNetwork.ActivateNetwork(6);
                double[] outputs4 = decodedNetwork.GetOutputs();
                genome.Fitness += Math.Min(1.0, Math.Max(0.0, outputs4[0]));
                bool flag6 = flag5 && outputs4[0] >= 0.5;
                decodedNetwork.Flush();
                if (flag6)
                {
                    genome.Fitness = 4.0;
                }
                flag1 = flag1 || flag6;
            }
            return(flag1);
        }
예제 #3
0
        //based on phillip modified
        static bool HyperNEATKeepaway(List <NetworkGenome> genomes, bool test)
        {
            if (!test)
            {
                int evaluations = 0;
                Dictionary <int, int> evalCount = new Dictionary <int, int>();
                List <int>            keys      = new List <int>(mapping.Keys);
                for (int i = 0; i < genomes.Count; i++)
                {
                    possibleValues.Add(i);
                }

                for (int i = 0; i < keys.Count; i++)
                {
                    if (!genomes.Any(gen => gen.Id == keys[i]))
                    {
                        mapping.Remove(keys[i]);
                    }
                    else
                    {
                        possibleValues.Remove(mapping[keys[i]]);
                    }
                }

                for (int i = 0; i < genomes.Count; i++)
                {
                    genomes[i].Fitness = 0;
                    for (int l = 0; l < maxVec.Length; l++)
                    {
                        genomes[i].BehaviorType.bVector[l] = 0;
                    }
                    if (!mapping.ContainsKey(genomes[i].Id))
                    {
                        DecodedNetworks net = sub.GenerateNetwork(MapWeights, DecodedNetworks.DecodeGenome(genomes[i]));

                        if (createdNetworks.Count < genomes.Count)
                        {
                            createdNetworks.Add(net.Clone() as DecodedNetworks);
                            mapping.Add(genomes[i].Id, i);
                        }
                        else
                        {
                            createdNetworks[possibleValues[0]].CopyLinks(net);
                            mapping.Add(genomes[i].Id, possibleValues[0]);
                            possibleValues.RemoveAt(0);
                        }
                    }
                }

                for (int i = 0; i < genomes.Count; i++)
                {
                    //receives the fitness value and behavioral characterisation values from
                    //Fitness Evaluation function.
                    double[] fitness = new double[4];

                    for (int j = 0; j < config.Episodes; j++)
                    {
                        fitness = Evaluate(createdNetworks[mapping[genomes[i].Id]]);
                        genomes[i].RealFitness += fitness[0];
                        for (int v = 0; v < fitness.Length; v++)
                        {
                            genomes[i].BehaviorType.bVector[v] += fitness[v];
                        }
                    }
                    genomes[i].RealFitness /= config.Episodes;
                    for (int v = 0; v < fitness.Length; v++)
                    {
                        genomes[i].BehaviorType.bVector[v] /= config.Episodes;
                    }
                    evalCount[genomes[i].Id] = config.Episodes;
                    evaluations += config.Episodes;
                }


                List <double> lists = new List <double>();

                genomes.Sort((a, b) => b.Fitness.CompareTo(a.Fitness));
                double Max0 = 0; double Max1 = 0; double Max2 = 0; double fit = 0;

                for (int i = 0; i < genomes.Count; i++)
                {
                    maxVec[0] = genomes[i].RealFitness;
                    for (int v = 1; v < maxVec.Length; v++)
                    {
                        if (genomes[i].BehaviorType.bVector[v] > maxVec[v])
                        {
                            maxVec[v] = genomes[i].BehaviorType.bVector[v];
                        }
                    }
                }

                //double fitnormaliser = 11;
                for (int j = 0; j < genomes.Count; j++)
                {
                    genomes[j].RealFitness             /= fitnormaliser;
                    genomes[j].BehaviorType.bVector[0] /= fitnormaliser;
                    for (int v = 1; v < maxVec.Length; v++)
                    {
                        genomes[j].BehaviorType.bVector[v] /= maxVec[v];
                    }
                }

                foreach (NetworkGenome genome in genomes)
                {
                    genome.Novelty             = genome.NoveltyMeasure.computeNovelty(genome, genomes);
                    genome.Genotypic_Diversity = genome.GenomeDiversity.DiversityDistance(genomes, genome) / 110;
                    switch (config.SearchMethod)
                    {
                    case 1:
                    {
                        genome.Fitness = genome.RealFitness;        //Objective based Search
                        break;
                    }

                    case 2:
                    {
                        genome.Fitness = genome.Novelty;         //Novelty Search
                        break;
                    }

                    case 3:
                    {
                        genome.Fitness = genome.RealFitness * config.scalariser + genome.Novelty * (1 - config.scalariser);
                        break;         //Hybrid (Novelty + Objective based Search)
                    }

                    case 4:
                    {
                        genome.Fitness = genome.Genotypic_Diversity;         //Genotypic Diversity Search
                        break;
                    }

                    case 5:
                    {
                        genome.Fitness = genome.RealFitness * config.scalariser + genome.Genotypic_Diversity * (1 - config.scalariser);
                        break;         //Hybrid (Objective + Genotypic Diversity)
                    }

                    default:
                    {
                        genome.Fitness = genome.RealFitness;
                        break;
                    }
                    }
                }

                ComputeNovelty.addToArchive(genomes); //add the best N genomes to archive

                return(false);
            }
            else
            {
                for (int i = 0; i < genomes.Count; i++)
                {
                    if (genomes.FindIndex(g => genomes[i].Id == g.Id) < i)
                    {
                        continue;
                    }
                    genomes[i].Fitness = 0;

                    {
                        DecodedNetworks net     = sub.GenerateNetwork(MapWeights, DecodedNetworks.DecodeGenome(genomes[i]));
                        double[]        fitness = new double[4];
                        for (int j = 0; j < config.Episodes; j++)
                        {
                            fitness = Evaluate(createdNetworks[mapping[genomes[i].Id]]);
                            genomes[i].RealFitness += fitness[0];
                            for (int v = 0; v < fitness.Length; v++)
                            {
                                genomes[i].BehaviorType.bVector[v] += fitness[v];
                            }
                        }
                        genomes[i].RealFitness /= config.Episodes;
                        for (int v = 0; v < fitness.Length; v++)
                        {
                            genomes[i].BehaviorType.bVector[v] /= config.Episodes;
                        }
                    }
                }
                //double fitnormaliser = 11;
                for (int i = 0; i < genomes.Count; i++)
                {
                    maxVec[0] = genomes[i].RealFitness;
                    for (int v = 1; v < maxVec.Length; v++)
                    {
                        if (genomes[i].BehaviorType.bVector[v] > maxVec[v])
                        {
                            maxVec[v] = genomes[i].BehaviorType.bVector[v];
                        }
                    }
                }
                for (int j = 0; j < genomes.Count; j++)
                {
                    genomes[j].RealFitness             /= fitnormaliser;
                    genomes[j].BehaviorType.bVector[0] /= fitnormaliser;
                    for (int v = 1; v < maxVec.Length; v++)
                    {
                        genomes[j].BehaviorType.bVector[v] /= maxVec[v];
                    }
                }

                foreach (NetworkGenome genome in genomes)
                {
                    genome.Novelty             = genome.NoveltyMeasure.computeNovelty(genome, genomes);
                    genome.Genotypic_Diversity = genome.GenomeDiversity.DiversityDistance(genomes, genome) / 110;
                    switch (config.SearchMethod)
                    {
                    case 1:
                    {
                        genome.Fitness = genome.RealFitness;        //Objective based Search
                        break;
                    }

                    case 2:
                    {
                        genome.Fitness = genome.Novelty;         //Novelty Search
                        break;
                    }

                    case 3:
                    {
                        genome.Fitness = genome.RealFitness * config.scalariser + genome.Novelty * (1 - config.scalariser);
                        break;         //Hybrid (Novelty + Objective based Search)
                    }

                    case 4:
                    {
                        genome.Fitness = genome.Genotypic_Diversity;         //Genotypic Diversity Search
                        break;
                    }

                    case 5:
                    {
                        genome.Fitness = genome.RealFitness * config.scalariser + genome.Genotypic_Diversity * (1 - config.scalariser);
                        break;         //Hybrid (Objective + Genotypic Diversity)
                    }

                    default:
                    {
                        genome.Fitness = genome.RealFitness;
                        break;
                    }
                    }
                }
                ComputeNovelty.addToArchive(genomes); //add the N genomes to archive
            }

            return(false);
        }
예제 #4
0
 public void GenerateLinks(LinkGen linkGen)
 {
     linkGen(this.sub);
     this.net = DecodedNetworks.DecodeGenome(this.sub);
 }