2011-03-09 2 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

은 내가 먼저 당신이 올바른로 "후보 개인을 찾는"무엇을 의미하는지 정의 할 것 같아요. –

+0

잘 후보 개인은 체력 점수에 따라 재조합의 잠재적 인 후보자가 될 것입니다. –

+0

이제는 그게 무슨 뜻인지 모르겠지만, 뭔가 특별한 것을 의미하는 경우 코드가 올바른 결과를 반환하는지 확인하는 테스트 서브 루틴을 작성할 수 있습니다. –

답변

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); 
    }