Beispiel #1
0
 public NetworkGenome(int id, int age, int parent1, int parent2, int species, double fitness, double novelty, double realFitness, double genotypic_Diversity)
 {
     this.Id                  = id;
     this.Age                 = age;
     this.Parent1             = parent1;
     this.Parent2             = parent2;
     this.Species             = species;
     this.Fitness             = fitness;
     this.RealFitness         = realFitness;
     this.Genotypic_Diversity = genotypic_Diversity;
     this.GenomeDiversity     = new Diversity();
     this.BehaviorType        = new Behavior();
     this.NoveltyMeasure      = new ComputeNovelty();
     this.Novelty             = novelty;
     this.Nodes               = new List <NodeGene>();
     this.Links               = new List <LinkGene>();
     // this.Complexity = this.Links.Count;
     this.MutatableNodes = Enumerable.Where <NodeGene>((IEnumerable <NodeGene>) this.Nodes, (Func <NodeGene, bool>)(nodes =>
     {
         if (!nodes.Mutated && !nodes.Fixed)
         {
             return(nodes.Type == NodeType.Hidden);
         }
         return(false);
     }));
     this.MutatableLinks = Enumerable.Where <LinkGene>((IEnumerable <LinkGene>) this.Links, (Func <LinkGene, bool>)(links =>
     {
         if (!links.Mutated)
         {
             return(!links.Fixed);
         }
         return(false);
     }));
 }
Beispiel #2
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);
        }