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 }