public RouletteSelection(IEnumerable <T> infos, Func <T, K> selkey, Func <K, float> selfit) { MinFit = float.MaxValue; TotalSpaceSum = 0; foreach (var info in infos) { var space = new RouletteSpace <K>() { Id = selkey(info), }; space.Fit = selfit(space.Id); if (space.Fit < MinFit) { MinFit = space.Fit; } Wheel.Add(space); } if (!Wheel.Any()) { MinFit = 0f; MaxFit = 0f; AverageFit = 0f; return; } MaxFit = Wheel.Max(sp => sp.Fit); AverageFit = Wheel.Average(sp => sp.Fit); StdDevFit = Wheel.StdDev(sp => sp.Fit); var limit = AverageFit - StdDevFit / 10f; var goodlist = Wheel.Where(sp => sp.Fit >= limit); WheelAverageOrBetter = goodlist.Count() > 100 ? goodlist.ToArray() : Wheel.ToArray(); foreach (var one in Wheel) { one.Space = one.Fit - MinFit + 1; TotalSpaceSum += one.Space; } }
public RouletteSelection( IEnumerable <T> infos, Func <T, K> selkey, Func <K, float> selfit) { MinFit = float.MaxValue; TotalSpaceSum = 0; var newwheel = new List <RouletteSpace <K> >(); foreach (var info in infos) { var space = new RouletteSpace <K>() { Id = selkey(info), }; space.Fit = selfit(space.Id); if (space.Fit < MinFit) { MinFit = space.Fit; } newwheel.Add(space); } Wheel = newwheel; if (!Wheel.Any()) { MinFit = 0f; MaxFit = 0f; AverageFit = 0f; return; } var fits = Wheel.Select(sp => sp.Fit); MaxFit = fits.Max(); AverageFit = fits.Average(); AbsDevFit = fits.AbsDev(); StdDevFit = fits.StdDev(); if (AbsDevFit > 1.0) { var limit = AverageFit - MinAbsDevs * AbsDevFit; Wheel = Wheel.Where(sp => sp.Fit > limit); fits = Wheel.Select(sp => sp.Fit); MinFit = fits.Min(); MaxFit = fits.Max(); AverageFit = fits.Average(); AbsDevFit = fits.AbsDev(); StdDevFit = fits.StdDev(); } // Make positive, and offset bottom // with Average var offset = MinFit - (AverageFit - MinFit); foreach (var one in Wheel) { one.Space = Math.Pow(one.Fit - offset, Elitism); TotalSpaceSum += one.Space; } }
public RouletteSelection( IEnumerable <T> infos, Func <T, K> selkey, Func <K, float> selfit) { TotalSpaceSum = 0; var newwheel = new ConcurrentBag <RouletteSpace <K> >(); foreach (var info in infos) { var space = new RouletteSpace <K>() { Id = selkey(info), }; space.Fit = selfit(space.Id); newwheel.Add(space); } Wheel = newwheel; if (!Wheel.Any()) { MinFit = 0f; MaxFit = 0f; AverageFit = 0f; return; } var i = 1.0; var selection = Wheel .Select(sp => sp); var selcount = selection.Count(); if (selcount > IncludeTop) { selection = selection .Skip(selcount - IncludeTop) .Take(IncludeTop); } Wheel = new ConcurrentBag <RouletteSpace <K> >(selection); var fits = Wheel.Select(sp => sp.Fit); MinFit = fits.Min(); MaxFit = fits.Max(); AverageFit = fits.Average(); AbsDevFit = fits.AbsDev(); StdDevFit = fits.StdDev(); foreach (var one in Wheel.OrderBy(sp => sp.Fit)) { one.Space = i; i *= Elitism; TotalSpaceSum += one.Space; } }