private static void Randomize(IGeneticOptimizeable gen, double min, double max)
        {
            var w = gen.optimizeableValues;

            for (var i = 0; i < w.Count; i++)
            {
                w[i] = rnd.NextDouble() * (max - min) + min;
            }
            gen.optimizeableValues = w;
        }
        public void Mutate(IGeneticOptimizeable gen)
        {
            var w = gen.optimizeableValues;

            for (var i = 0; i < w.Count; i++)
            {
                if (rnd.NextDouble() < mutateProbability)
                {
                    w[i] += rnd.NextDouble() * 2 - 1;
                }
            }
            gen.optimizeableValues = w;
        }
        public void Crossover(IGeneticOptimizeable mom, IGeneticOptimizeable dad)
        {
            var momW = mom.optimizeableValues;
            var dadW = dad.optimizeableValues;
            var n    = rnd.Next(momW.Count);

            for (var i = 0; i < momW.Count; i++)
            {
                if (i < n)
                {
                    momW[i] = dadW[i];
                }
                else
                {
                    dadW[i] = momW[i];
                }
            }
            mom.optimizeableValues = momW;
            dad.optimizeableValues = dadW;
        }