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; }
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); }
//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); }
public void GenerateLinks(LinkGen linkGen) { linkGen(this.sub); this.net = DecodedNetworks.DecodeGenome(this.sub); }