Search code examples
stochastic

Stochastic universal sampling


I need a sus implementation in c# for finding candidate individuals in a population this is what i have so far but im not sure if it is correct.

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

Solution

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