2011-03-09 4 views
0

J'ai besoin d'une implémentation en C# pour trouver des candidats dans une population, c'est ce que j'ai jusqu'ici mais je ne sais pas si c'est correct.Échantillonnage universel stochastique

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

Je suppose d'abord vous devez définir ce que cela signifie pour « trouver des personnes candidates » correctes. –

+0

bien candidats seraient des individus qui sont des candidats potentiels à la recombinaison en fonction de leur score de condition physique. –

+0

Maintenant, je ne sais pas ce que cela signifie, mais si cela signifie quelque chose de spécifique, peut-être que vous pouvez écrire un sous-programme de test qui vérifie que le code renvoie un résultat correct. –

Répondre

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