2011-03-09 85 views
0

我需要在C#中的一個sus實現用於找到人口中的候選人這是迄今爲止,但我不知道它是否正確。隨機通用抽樣

public void sus(IEnumerable<TimeTable>population) 
    { 
     var ag = population.Sum(i => normalize((double) i.Fitness, true)); 
     var mark = rnMutate.NextDouble(); 

     var index = 0; 
     foreach (var candidate in population) 
     { 
      var cu = population.Sum(i => normalize((double)i.Fitness, false))/ag * 5; 
      while (cu > mark + index) 
      { 
       Survivors.Add(candidate); 
       index++; 
      } 
     }    
    } 

    public double normalize(double fitness, bool natural) 
    { 
     if (natural) 
      return fitness; 

     return fitness == (double)FitnessLBound ? double.PositiveInfinity : 1/fitness; 
    } 
+0

我想首先你必須確定這是什麼意思爲「發現候選個人」是正確的。 – 2011-03-09 19:24:04

+0

好的候選人將是基於他們的健身評分可能是重組候選人的個體。 – 2011-03-09 19:46:38

+0

現在我不知道這意味着什麼,但是如果它確實意味着某個特定的東西,也許你可以編寫一個測試子程序來檢查代碼是否返回正確的結果。 – 2011-03-10 04:29:58

回答

0
private IEnumerable<TimeTable> StochasticSample(IEnumerable<TimeTable> population, int size) 
    { 
     var t = population.Sum(it => it.Fitness); 
     var temp = new List<TimeTable>(); 
     var ptr = rnMutate.NextDouble(); 
     var sum = 0M; 

     for (int i = 0; i < size; i++) 
     { 
      for (sum += ExpValue(i, t); sum > (decimal) ptr; ptr++) 
      { 
       temp.Add(population.ElementAt(i)); 
       --size; 
      } 
     } 
     return temp; 
    } 

    private decimal ExpValue(decimal fitness, decimal sum) 
    { 
     return decimal.Divide(fitness, sum); 
    }