Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Linq;
- using System.Threading.Tasks;
- using EmiterPlacer.WavePropagation.Core;
- namespace EmiterPlacer.Placement.GeneticOptimizer.Evaluators
- {
- public class ThresholdCutoffEvaluator: IPopulationEvaluator
- {
- private Env2D[] _enviromentPool;
- public float SignalLevelThreshold { get; set; }
- public void EvaluatePopulation(Placement[] population, Env2D environment, int maxEmiters)
- {
- this.InitEnvPool(environment);
- if (this.SignalLevelThreshold > 1)
- {
- throw new Exception("Signal level over 1 cannot be possibly reached!");
- }
- var pl = 0;
- var groupSize = population.Length/100 + 1;
- var tasks = new Task[100];
- for (int i = 0; i < 99; i++)
- {
- tasks[i] = Task.Factory.StartNew(() => this.EvaluatePlacements(population.Skip(i*groupSize).Take(groupSize).ToArray(), _enviromentPool[i], maxEmiters));
- Console.WriteLine("Evaluation, task: " + i);
- }
- tasks[99] = Task.Factory.StartNew(() => this.EvaluatePlacements(population.Skip(99 * groupSize).Take(population.Length - 99 * groupSize).ToArray(), _enviromentPool[99], maxEmiters));
- Console.WriteLine("Evaluation, task: " + 99);
- Task.WaitAll(tasks);
- }
- private void InitEnvPool(Env2D environment)
- {
- _enviromentPool = new Env2D[100];
- for(var i = 0 ; i < _enviromentPool.Length; i++)
- {
- _enviromentPool[i] = new Env2D(environment);
- }
- }
- private void EvaluatePlacements(Placement[] population, Env2D environment, int maxEmiters)
- {
- foreach (var placement in population)
- {
- EvaluatePlacement(placement,environment,maxEmiters);
- }
- }
- private void EvaluatePlacement(Placement placement, Env2D environment, int maxEmiters)
- {
- if (placement.Fitness == null) //do not recalculate if nothing changed
- {
- var elementsInReach = environment.PercentageCoveredForEmitterPositions(SignalLevelThreshold, placement.EmiterPositions);
- var numOfEmiters = placement.NumOfEmiters;
- placement.Fitness = elementsInReach;
- placement.Fitness += Math.Abs(elementsInReach - 1) < 0.0001 ? (float)(maxEmiters - numOfEmiters) / maxEmiters : 0;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement