Advertisement
Guest User

why so null

a guest
May 29th, 2016
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.51 KB | None | 0 0
  1. using System;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using EmiterPlacer.WavePropagation.Core;
  5.  
  6. namespace EmiterPlacer.Placement.GeneticOptimizer.Evaluators
  7. {
  8.     public class ThresholdCutoffEvaluator: IPopulationEvaluator
  9.     {
  10.         private Env2D[] _enviromentPool;
  11.         public float SignalLevelThreshold { get; set; }
  12.         public void EvaluatePopulation(Placement[] population, Env2D environment, int maxEmiters)
  13.         {
  14.             this.InitEnvPool(environment);
  15.             if (this.SignalLevelThreshold > 1)
  16.             {
  17.                 throw new Exception("Signal level over 1 cannot be possibly reached!");
  18.             }
  19.             var pl = 0;
  20.             var groupSize = population.Length/100 + 1;
  21.             var tasks = new Task[100];
  22.             for (int i = 0; i < 99; i++)
  23.             {
  24.                 tasks[i] = Task.Factory.StartNew(() => this.EvaluatePlacements(population.Skip(i*groupSize).Take(groupSize).ToArray(), _enviromentPool[i], maxEmiters));
  25.                 Console.WriteLine("Evaluation, task: " + i);
  26.             }
  27.             tasks[99] = Task.Factory.StartNew(() => this.EvaluatePlacements(population.Skip(99 * groupSize).Take(population.Length - 99 * groupSize).ToArray(), _enviromentPool[99], maxEmiters));
  28.             Console.WriteLine("Evaluation, task: " + 99);
  29.             Task.WaitAll(tasks);
  30.  
  31.         }
  32.  
  33.         private void InitEnvPool(Env2D environment)
  34.         {
  35.             _enviromentPool = new Env2D[100];
  36.             for(var i = 0 ; i < _enviromentPool.Length; i++)
  37.             {
  38.                 _enviromentPool[i] = new Env2D(environment);
  39.             }
  40.         }
  41.  
  42.         private void EvaluatePlacements(Placement[] population, Env2D environment, int maxEmiters)
  43.         {
  44.             foreach (var placement in population)
  45.             {
  46.                 EvaluatePlacement(placement,environment,maxEmiters);
  47.             }
  48.         }
  49.  
  50.         private void EvaluatePlacement(Placement placement, Env2D environment, int maxEmiters)
  51.         {
  52.             if (placement.Fitness == null) //do not recalculate if nothing changed
  53.             {
  54.                 var elementsInReach = environment.PercentageCoveredForEmitterPositions(SignalLevelThreshold, placement.EmiterPositions);
  55.                 var numOfEmiters = placement.NumOfEmiters;
  56.                 placement.Fitness = elementsInReach;
  57.                 placement.Fitness += Math.Abs(elementsInReach - 1) < 0.0001 ? (float)(maxEmiters - numOfEmiters) / maxEmiters : 0;
  58.             }
  59.         }
  60.     }
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement