private void buttonOblicz_Click(object sender, EventArgs e)
        {
            //deklarowanie ziemnnych
            string[]  pola;
            decimal[] potegi;
            pola   = new [] { textBoxX1.Text, textBoxY1.Text, textBoxX2.Text, textBoxY2.Text, textBoxX3.Text, textBoxY3.Text, textBoxX4.Text, textBoxY4.Text, textBoxC1.Text };
            potegi = new[] { numericUpDown1.Value, numericUpDown2.Value, numericUpDown3.Value, numericUpDown4.Value, numericUpDown5.Value, numericUpDown6.Value, numericUpDown7.Value, numericUpDown8.Value };
            zamknijKontrolki(false);
            populacjaDoOdczytu = new List <Populacja>();
            int    poputacja, liczbaChromosomów, zakresOd, zakresDo, liczbaBitowa, iloscBitow;
            double dokladnosc;
            string dokladnoscText;

            //zczytanie wartosci z pól
            poputacja         = Convert.ToInt32(textBoxILPOP.Text);
            liczbaChromosomów = Convert.ToInt32(textBoxILCH.Text);
            zakresOd          = Convert.ToInt32(textBoxOd.Text);
            zakresDo          = Convert.ToInt32(textBoxDo.Text);
            dokladnoscText    = textBox1.Text;
            liczbaBitowa      = Funkcja.liczbaBitowa(zakresOd, zakresDo);
            liczbChrom        = liczbaChromosomów;
            //Tworzenie losowej populacji
            Random rzut = new Random();
            string liczbaXBin = "", liczbaYBin = "";

            double[] liczbyX    = new double[liczbaChromosomów];
            double[] liczbyY    = new double[liczbaChromosomów];
            string[] chromosomy = new string[liczbaChromosomów];
            double[] wyniki     = new double[liczbaChromosomów];
            dokladnosc = Funkcja.przeliczDokladnosc(dokladnoscText);
            iloscBitow = Funkcja.obliczIloscBitow(dokladnosc);
            string[] TabPomX  = new string[liczbaChromosomów];
            string[] TabPomY  = new string[liczbaChromosomów];
            int[]    TabPomXx = new int[liczbaChromosomów];
            int[]    TabPomYy = new int[liczbaChromosomów];

            for (int idCH = 0; idCH < liczbaChromosomów; idCH++)
            {
                for (int i = 0; i < iloscBitow; i++)
                {
                    liczbaXBin += rzut.Next(0, 2);
                    liczbaYBin += rzut.Next(0, 2);
                }
                TabPomX[idCH]    = liczbaXBin;
                TabPomY[idCH]    = liczbaYBin;
                TabPomXx[idCH]   = Convert.ToInt32(TabPomX[idCH], 2);
                TabPomYy[idCH]   = Convert.ToInt32(TabPomY[idCH], 2);
                chromosomy[idCH] = liczbaXBin + liczbaYBin;

                //x = a +((d * x)/(2^n - 1))
                liczbyX[idCH] = zakresOd + ((liczbaBitowa * Convert.ToInt32(liczbaXBin, 2)) / ((Math.Pow(2, iloscBitow) - 1)));
                liczbyY[idCH] = zakresOd + ((liczbaBitowa * Convert.ToInt32(liczbaYBin, 2)) / ((Math.Pow(2, iloscBitow) - 1)));
                liczbaYBin    = "";
                liczbaXBin    = "";
            }

            //Obliczenie wartosci makymalnej i wypisanie jej na wykres
            string liczbaXBinMax = "", liczbaYBinMax = "";

            for (int i = 0; i < iloscBitow; i++)
            {
                liczbaXBinMax += "1";
                liczbaYBinMax += "1";
            }

            int[] TabPomXxx = new int[liczbaChromosomów];
            int[] TabPomYyy = new int[liczbaChromosomów];
            for (int i = 0; i < liczbaChromosomów; i++)
            {
                TabPomXxx[i] = Convert.ToInt32(liczbaXBinMax, 2);
            }
            for (int i = 0; i < liczbaChromosomów; i++)
            {
                TabPomYyy[i] = Convert.ToInt32(liczbaYBinMax, 2);
            }
            double najwiekszaWartoscFunkcji = Funkcja.obliczFunkcje(TabPomXxx[0], TabPomYyy[0], pola, potegi);

            val2.Clear();
            for (int i = 0; i < liczbaChromosomów; i++)
            {
                val2.Add(najwiekszaWartoscFunkcji);
            }
            labelNajWWartosc.Visible = true;
            labelNajWWartosc.Text    = $"Wykres funkcji przystosowania: {najwiekszaWartoscFunkcji.ToString()}";

            //Obieg populacji
            for (int idPopulacji = 0; idPopulacji < poputacja; idPopulacji++)
            {
                //wyliczenie wartosci osobików w populacji
                wyniki = new double[liczbaChromosomów];
                for (int idCH = 0; idCH < liczbaChromosomów; idCH++)
                {
                    wyniki[idCH] = Funkcja.obliczFunkcje(TabPomXx[idCH], TabPomYy[idCH], pola, potegi);
                }

                //wyliczenie przystosowania osobników w populacji
                double mianownik = 0;
                for (int i = 0; i < liczbaChromosomów; i++)
                {
                    mianownik += wyniki[i];
                }
                double[] wycinkiKola = new double[liczbaChromosomów];
                for (int i = 0; i < liczbaChromosomów; i++)
                {
                    wycinkiKola[i] = (wyniki[i] / mianownik) * 100.0;
                }

                //wyliczenie zakresów przystosowania osobników
                List <Przedzialy> zakresWycinka = new List <Przedzialy>();
                double            first = 0, last = 0;
                for (int i = 0; i < liczbaChromosomów; i++)
                {
                    last += wycinkiKola[i];
                    zakresWycinka.Add(new Przedzialy {
                        min = first, max = last
                    });
                    first += wycinkiKola[i] + 0.01;
                }

                //zapisanie informacji o populacji
                populacjaDoOdczytu.Add(new Populacja {
                    numerPopulacji = idPopulacji, X = liczbyX, Y = liczbyY, chromosom = chromosomy, wartosc = wyniki
                });

                //Losowanie chromosomów ruletką
                int      losoweLiczby;
                string   poomocnik = "";
                string[] wybraneChromosomy = new string[liczbaChromosomów];
                for (int i = 0; i < liczbaChromosomów; i++)
                {
                    losoweLiczby = rzut.Next(0, 101);
                    for (int j = 0; j < liczbaChromosomów; j++)
                    {
                        if (losoweLiczby >= zakresWycinka[j].min && losoweLiczby <= zakresWycinka[j].max)
                        {
                            poomocnik = chromosomy[j];
                            break;
                        }
                    }
                    wybraneChromosomy[i] = poomocnik;
                }

                //mutacja wybranych fomosomów przy szansie podanej od użytkownika
                double szansaMutacji = 0.0;
                for (int i = 0; i < wybraneChromosomy.Length; i++)
                {
                    szansaMutacji = rzut.NextDouble();
                    if (szansaMutacji <= Convert.ToDouble(numericUpDownMutacja.Value))
                    {
                        wybraneChromosomy[i] = OperatoryAlgorytmuGenetycznego.mutacje(wybraneChromosomy[i]);
                    }
                }

                //Tworzenie losowych par rodziców.
                rzut.Shuffle(wybraneChromosomy);
                List <Rodzice> para = new List <Rodzice>();
                for (int i = 0; i < wybraneChromosomy.Length; i += 2)
                {
                    para.Add(new Rodzice {
                        rodzic1 = wybraneChromosomy[i], rodzic2 = wybraneChromosomy[i + 1]
                    });
                }

                //Krzyżowanie rodziców
                List <Dzieci> potomkowie = new List <Dzieci>();
                for (int i = 0; i < para.Count; i++)
                {
                    potomkowie.Add(OperatoryAlgorytmuGenetycznego.krzyzowanie(para[i].rodzic1, para[i].rodzic2, iloscBitow));
                }

                //Zapisanie szans na wylosowanie osobnika w populacji
                koloRuletkowe.Add(new KolaRuletokowe {
                    nrPopulacji = idPopulacji, wycinki = wycinkiKola, chromosomy = chromosomy
                });

                //wyciągnięcie wyrazów x i y z potomków
                liczbyY = new double[liczbaChromosomów];
                liczbyX = new double[liczbaChromosomów];
                for (int i = 0, idTab = 0; i < potomkowie.Count; i++, idTab += 2)
                {
                    //x y z potomka pierwszego
                    liczbaXBin = "";
                    liczbaYBin = "";
                    for (int j = 0; j < potomkowie[i].dziecko1.Length; j++)
                    {
                        string pomocne = potomkowie[i].dziecko1;
                        if (j <= potomkowie[i].punktPrzeciecia)
                        {
                            liczbaXBin += pomocne[j];
                        }
                        else
                        {
                            liczbaYBin += pomocne[j];
                        }
                    }
                    TabPomXx[idTab] = Convert.ToInt32(liczbaXBin, 2);
                    TabPomYy[idTab] = Convert.ToInt32(liczbaYBin, 2);
                    liczbyY[idTab]  = zakresOd + ((liczbaBitowa * Convert.ToInt32(liczbaYBin, 2)) / ((Math.Pow(2, iloscBitow) - 1)));
                    liczbyX[idTab]  = zakresOd + ((liczbaBitowa * Convert.ToInt32(liczbaXBin, 2)) / ((Math.Pow(2, iloscBitow) - 1)));

                    //x y z potomka drugiego
                    liczbaXBin = "";
                    liczbaYBin = "";
                    for (int j = 0; j < potomkowie[i].dziecko2.Length; j++)
                    {
                        string pomocne = potomkowie[i].dziecko2;
                        if (j <= potomkowie[i].punktPrzeciecia)
                        {
                            liczbaXBin += pomocne[j];
                        }
                        else
                        {
                            liczbaYBin += pomocne[j];
                        }
                    }
                    TabPomXx[idTab + 1] = Convert.ToInt32(liczbaXBin, 2);
                    TabPomYy[idTab + 1] = Convert.ToInt32(liczbaYBin, 2);
                    liczbyX[idTab + 1]  = zakresOd + ((liczbaBitowa * Convert.ToInt32(liczbaXBin, 2)) / ((Math.Pow(2, iloscBitow) - 1)));
                    liczbyY[idTab + 1]  = zakresOd + ((liczbaBitowa * Convert.ToInt32(liczbaYBin, 2)) / ((Math.Pow(2, iloscBitow) - 1)));
                }

                //tworzenie nowej populacji z potomków
                int licznikTablicy = 0;
                chromosomy = new string[liczbaChromosomów];
                foreach (var element in potomkowie)
                {
                    chromosomy[licznikTablicy] = element.dziecko1;
                    licznikTablicy++;
                    chromosomy[licznikTablicy] = element.dziecko2;
                    licznikTablicy++;
                }
            }

            //koniec wykresu
            comboBox1.Enabled = true;
            label1.Text       = "Wybierz Populacje";
            //zapis danych do kontrolek
            foreach (var item in populacjaDoOdczytu)
            {
                comboBox1.Items.Add(item.numerPopulacji);
            }

            //ustawienie parametów wykresu
            series2 = new SeriesCollection {
                new LineSeries
                {
                    Title           = "Watrosci",
                    LineSmoothness  = 0,
                    StrokeThickness = 3,
                    Values          = val1,
                },
                new LineSeries
                {
                    Title           = "Największa wartosc",
                    LineSmoothness  = 0,
                    StrokeThickness = 3,
                    Values          = val2,
                }
            };
        }
        //*************************************************************************************



        //akcje po wybraniu wartości z listy
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            //deklaracja i ustawianie parametów
            int wybraneID           = comboBox1.SelectedIndex;
            SeriesCollection series = new SeriesCollection();
            int    licznika         = 0;
            string zmPomA           = "";

            label24.Visible          = true;
            pieChart1.Visible        = true;
            labelNajWOsobnik.Visible = true;

            //dodanie danych do koła wykresowego.
            for (int i = 0; i < koloRuletkowe.Count; i++)
            {
                if (wybraneID == i)
                {
                    for (int j = 0; j < koloRuletkowe[i].wycinki.Length; j++)
                    {
                        series.Add(new PieSeries()
                        {
                            Title = koloRuletkowe[i].chromosomy[j], Values = new ChartValues <double> {
                                koloRuletkowe[i].wycinki[j]
                            }, DataLabels = true, LabelPoint = labelPoint
                        });
                        pieChart1.Series = series;
                    }
                    for (int id = 0; id < populacjaDoOdczytu[i].chromosom.Length; id++)
                    {
                        zmPomA = populacjaDoOdczytu[i].chromosom[id].ToString();
                        for (int k = 0; k < zmPomA.Length; k++)
                        {
                            if (zmPomA[k] == '1')
                            {
                                licznika++;
                            }
                        }
                        licznika = 0;
                        zmPomA   = "";
                    }
                }
            }

            //Znajdowanie najlepszego osobnika w populacji
            double najlepszaWartosc = 0;
            string najlepszyosobnik = "";

            for (int idPop = 0; idPop < populacjaDoOdczytu.Count; idPop++)
            {
                if (wybraneID == idPop)
                {
                    for (int idElementu = 0; idElementu < populacjaDoOdczytu[idPop].chromosom.Length; idElementu++)
                    {
                        if (najlepszaWartosc < populacjaDoOdczytu[idPop].wartosc[idElementu])
                        {
                            najlepszaWartosc = populacjaDoOdczytu[idPop].wartosc[idElementu];
                            najlepszyosobnik = populacjaDoOdczytu[idPop].chromosom[idElementu];
                        }
                    }
                }
            }
            labelNajWOsobnik.Text = $"Najlepszy osobnik to: {najlepszyosobnik} \nO wartość: {najlepszaWartosc}";
            najlepszyOsobnik      = najlepszyosobnik;

            //wproawadzenie wartosci do wykresu
            val1.Clear();
            labelLegendCh.Text = "";

            string pomocniczaLegenda = "";
            int    licznik           = 1;

            for (int i = 0; i < populacjaDoOdczytu.Count; i++)
            {
                if (i == wybraneID)
                {
                    for (int j = 0; j < populacjaDoOdczytu[i].chromosom.Length; j++)
                    {
                        // val1.Add(populacjaDoOdczytu[i].wartosc[j]);
                        pomocniczaLegenda  += $"{populacjaDoOdczytu[i].chromosom[j]} ";
                        labelLegendCh.Text += $"Id {j} chromosom: {populacjaDoOdczytu[i].chromosom[j]} \n";
                        licznik++;
                    }
                }
            }

            //to do końca ma budować tworzyć wykres
            string[] rozdzieloneWartosciPopulacji = new string[licznik];
            rozdzieloneWartosciPopulacji = legenda(pomocniczaLegenda, licznik);
            WartosciXY wartosciXY = wartosci(rozdzieloneWartosciPopulacji, licznik);

            double[]  wyniki = new double[liczbChrom];
            string[]  pola;
            decimal[] potegi;
            pola   = new[] { textBoxX1.Text, textBoxY1.Text, textBoxX2.Text, textBoxY2.Text, textBoxX3.Text, textBoxY3.Text, textBoxX4.Text, textBoxY4.Text, textBoxC1.Text };
            potegi = new[] { numericUpDown1.Value, numericUpDown2.Value, numericUpDown3.Value, numericUpDown4.Value, numericUpDown5.Value, numericUpDown6.Value, numericUpDown7.Value, numericUpDown8.Value };
            for (int idCH = 0; idCH < liczbChrom; idCH++)
            {
                wyniki[idCH] = Funkcja.obliczFunkcje(wartosciXY.wartosciX[idCH], wartosciXY.wartosciY[idCH], pola, potegi);
            }
            for (int i = 0; i < wyniki.Length; i++)
            {
                val1.Add(wyniki[i]);
            }

            cartesianChart1.Series = series2;
            //dotąd
        }