Esempio n. 1
0
        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;
            }
        }
Esempio n. 2
0
        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;
            }
        }
Esempio n. 3
0
        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;
            }
        }