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); })); }
//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); }