/// <summary>
        /// 
        /// </summary>
        /// <param name="F"></param>
        /// <param name="theta"></param>
        /// <param name="vectorLength"></param>
        /// <param name="iterationNumber"></param>
        public static void CompactGeneticAlgorithm(targetFunctionDelegate F, double theta, int vectorLength, int iterationNumber)
        {

            int bestYetResult = 0;
            int[] bestYetVector;

            double[] p = InitialProbabilityVector(vectorLength);
            int[] x1 = Population.RandomIndividual(p);
            int[] x2 = Population.RandomIndividual(p);

            int x1Result = F(x1);
            int x2Result = F(x2);

            int[] betterX, worseX;
            int betterResult = 0;
            using (TextWriter tw = new StreamWriter("wynikiCGA.csv", false))
            {
                for (int i = 0; i < iterationNumber; i++)
                {
                    betterX = (x1Result <= x2Result) ? x2 : x1;
                    worseX = (x1Result <= x2Result) ? x1 : x2;
                    betterResult = (x1Result <= x2Result) ? x2Result : x1Result;
                    if (betterResult > bestYetResult)
                    {
                        bestYetVector = betterX;
                        bestYetResult = betterResult;
                    }


                    tw.WriteLine(String.Format("{0}\t{1}", i, x1Result));


                    for (int k = 0; k < vectorLength; k++)
                    {
                        if (betterX[k] == 1 && worseX[k] == 0)
                            p[k] += theta;
                        if (betterX[k] == 0 && worseX[k] == 1)
                            p[k] -= theta;
                    }

                    x1 = Population.RandomIndividual(p);
                    x2 = Population.RandomIndividual(p);

                    x1Result = F(x1);
                    x2Result = F(x2);
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="F"></param>
        /// <param name="populationCount"></param>
        /// <param name="M"></param>
        public static void SimpleGeneticAlgorithm(targetFunctionDelegate F, int populationCount, int M)
        {
            double[] p = InitialProbabilityVector(populationCount);
            int[][] population = new int[populationCount][];
            int[] results = new int[populationCount];
            for (int i = 0; i < populationCount; i++)
            {
                population[i] = Population.RandomIndividual(p);
                results[i] = F(population[i]);
            }

            for (int i = 0; i < 1000; i++)
            {
                //BlockSelection(population, M);
                //UniformCrossover(population);
            }
        
        }