public static void evalNet(Object input) { evalPack e = (evalPack)input; if (e.g == null || (!HyperNEATParameters.reevaluateEveryGeneration && e.g.EvaluationCount != 0)) { sem.Release(); return; } sem2.WaitOne(); INetwork network = e.g.Decode(e.Activation); sem2.Release(); if (network == null) { // Future genomes may not decode - handle the possibility. e.g.Fitness = EvolutionAlgorithm.MIN_GENOME_FITNESS; e.g.RealFitness = e.g.Fitness; } else { BehaviorType behavior; e.g.Fitness = Math.Max(e.NetworkEvaluator.threadSafeEvaluateNetwork(network, sem2, out behavior, e.ThreadNumber), EvolutionAlgorithm.MIN_GENOME_FITNESS); e.g.Behavior = behavior; e.g.RealFitness = e.g.Fitness; } // Reset these genome level statistics. e.g.TotalFitness += e.g.Fitness; e.g.EvaluationCount += 1; sem.Release(); }
public void EvaluatePopulation(Population pop, EvolutionAlgorithm ea) { int count = pop.GenomeList.Count; evalPack e; IGenome g; int i; for (i = 0; i < count; i++) { //Console.WriteLine(i); sem.WaitOne(); g = pop.GenomeList[i]; e = new evalPack(networkEvaluator, activationFn, g, i % HyperNEATParameters.numThreads, (int)ea.Generation); ThreadPool.QueueUserWorkItem(new WaitCallback(evalNet), e); // Update master evaluation counter. evaluationCount++; } //Console.WriteLine("waiting for last threads.."); for (int j = 0; j < HyperNEATParameters.numThreads; j++) { sem.WaitOne(); // Console.WriteLine("waiting"); } for (int j = 0; j < HyperNEATParameters.numThreads; j++) { //Console.WriteLine("releasing"); sem.Release(); } //Console.WriteLine("generation done..."); //calulate novelty scores... if (ea.NeatParameters.noveltySearch) { if (ea.NeatParameters.noveltySearch) { ea.CalculateNovelty(); } } }