static void Main(string[] args)
            {
                int          nrPokolenia  = 0;
                LiczbyBazowe liczbyBazowe = new LiczbyBazowe();

                liczbyBazowe.LosujBaze();

                Populacja populacja = new Populacja();

                populacja.LosujPopulacje();
                //wylosowanie populacji rodzicielskiej

                populacja.ObliczFenotypy();
                populacja.ObliczDostosowanie();

                Console.WriteLine("Nr pokolenia Srednia wartosc funkcji dostosowania");
                Console.Write("{0, 3}          ", nrPokolenia);
                populacja.PokazDostosowanieSrednie();
                while (nrPokolenia < Parametry.lp)
                {
                    nrPokolenia++;
                    populacja.Turniej(3);
                    populacja.KrzyzowanieNieLosowe();
                    populacja.Mutacje();
                    populacja.ObliczFenotypy();
                    populacja.ObliczDostosowanie();
                    Console.Write("{0, 3}          ", nrPokolenia);
                    populacja.PokazDostosowanieSrednie();
                }
                populacja.PokazChromosomyPopulacji();
                populacja.PokazFenotypyPopulacji();
                populacja.PokazDostosowaniePopulacji();

                Console.ReadKey();
            }
        public void Mutacje()
        {  //metoda losuje chromosomy do mutacji
           //i mutuje losowe geny w wylosowanych chromosomach

            Random Generator = new Random(LiczbyBazowe.PobierzBazowa());

            //tworzy generator liczb losowych oparty o kolejną
            //liczbę bazową

            double[] losowe = new double[Parametry.pula];
            for (int i = 0; i < Parametry.pula; i++)
            {
                losowe[i] = Generator.Next(100) / 100.0;
            }

            //proces krzyżowania genów w parach
            int miejsceMutacji;

            for (int i = 0; i < Parametry.pula; i++)
            {
                if (losowe[i] < Parametry.pm)
                {
                    miejsceMutacji = Generator.Next(Parametry.N);
                    if (populacja[i, miejsceMutacji] == 0)
                    {
                        populacja[i, miejsceMutacji] = 1;
                    }
                    else
                    {
                        populacja[i, miejsceMutacji] = 0;
                    }
                }
            }
        }
        public void Ruletka()
        {   //selekcja chromosomów w populacji metodą koła ruletki
            Byte[,] nowePokolenie = new Byte[Parametry.pula, Parametry.N];
            //tablica pomocnicza chromosomów dla ruletki

            double[] tablicaNI = new double[Parametry.pula];
            //tablica pomocnicza ruletki

            double sumaDostosowanie = 0;

            foreach (double dostosowanie in tablicaDostosowanie)
            {
                sumaDostosowanie += dostosowanie;
            }

            for (int i = 0; i < Parametry.pula; i++)
            {
                tablicaNI[i] = tablicaDostosowanie[i]
                               / sumaDostosowanie * power;
            }

            int[] losowe = new int[Parametry.pula];
            //tabela 'losowe' przechowuje liczby losowe z przedziału 0...Power()
            Random Generator = new Random(LiczbyBazowe.PobierzBazowa());

            for (int i = 0; i < Parametry.pula; i++)
            {
                losowe[i] = Generator.Next(power);
            }

            double[] ruletka = new double[Parametry.pula];
            //tablica pozycji wycinków ruletki

            double pozycja = 0;

            for (int i = 0; i < Parametry.pula; i++)
            {
                pozycja   += tablicaNI[i];
                ruletka[i] = pozycja;
            }

            for (int i = 0; i < Parametry.pula; i++)
            {
                int j = 0;
                while (losowe[i] > ruletka[j])
                {
                    j++;
                }
                for (int k = 0; k < Parametry.N; k++)
                {
                    nowePokolenie[i, k] = populacja[j, k];
                }
            }

            populacja = nowePokolenie;
        }
        //tablica wartości funkcji dostosowania dla populacji chromosomw

        public void LosujPopulacje()
        {   //metoda losuje nową populację chromosomów
            //i umieszcza je w lokalnej tablicy 'populacja'
            for (int pozycja = 0; pozycja < Parametry.pula; pozycja++)
            {
                Random Generator = new Random(LiczbyBazowe.PobierzBazowa());
                for (int j = 0; j < Parametry.N; j++)
                {
                    populacja[pozycja, j] = (Byte)Generator.Next(2);
                }
            }
        }
        void Krzyzowanie()
        {
            Random Generator = new Random(LiczbyBazowe.PobierzBazowa());
            //tworzy generator liczb losowych oparty o kolejną
            //liczbę bazową

            //losowanie par osobników do krzyżowania
            int liczbaPar = Parametry.pula / 2;

            int[] losowePary = new int[liczbaPar];
            for (int i = 0; i < liczbaPar; i++)
            {
                losowePary[i] = Generator.Next(100);
            }

            //losowanie miejsc krzyżowania dla par
            int[] losoweMiejsca = new int[liczbaPar];
            for (int i = 0; i < liczbaPar; i++)
            {
                losoweMiejsca[i] = Generator.Next(Parametry.N - 2);
            }

            //proces krzyżowania genów w parach
            int  pierwszy = 0; //indeks pierwszego osobnika w każdej parze
            byte bufor;

            for (int para = 0; para < liczbaPar; para++)
            {
                if (losowePary[para] < Parametry.pk * 100)
                {
                    for (int i = losoweMiejsca[para]; i < Parametry.N; i++)
                    {
                        bufor = populacja[pierwszy, i];
                        populacja[pierwszy, i]     = populacja[pierwszy + 1, i];
                        populacja[pierwszy + 1, i] = bufor;
                    }
                }
                pierwszy += 2;
            }
        }