Genetik Algoritma Uygulamasi

Bu makale iceriginde Suleyman Demirel Universitesi – Bilgisayar Muhendisligi bolumu’nun Yapay Zeka dersi icin gelistirilen Genetik Algoritma uygulamasinin .Net ortaminda Windows Forms Application ozelligi ile yapilmis bir ornegini paylasiyor olacagim. Visual studio ortaminda windows forms application kullanarak yapacagimiz bu uygulamada ekran goruntusunu asagidaki gibi tasarlayabilirsiniz. Hemen ardindan islemlerin bir iterasyonluk adimini sizinle paylastiktan sonra, Button icerisine kodlarimizi yaziyor olacagiz.
Ornek olarak bu fonksiyonu inceleyelim. Ilk iterasyon icin islemleri adim adim yaziyor olacagim. Bu iterasyonu gerceklestirebilmemiz icin islemleri <0,31> arasinda yapiyor olacagiz.
Genetik Algoritma Uygulamasi
Bu sekilde iterasyonun ikinci adimina gecerken cozulmus olan ornekte sizin hazirlayacaginiz bir algoritma ile programinizi yazabilirsiniz. Simdi ise, kendi yazmis oldugumuz uygulamayi sizinle paylasalim. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace GenetikAlgoritma { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public int<,>
BireyListesi = new int<4, 3>
; public int Birey1_X1, Birey1_X2, Birey2_X1, Birey2_X2, Birey3_X1, Birey3_X2, Birey4_X1, Birey4_X2; public double[] Dizi = new double<4>
; public double kucuksayi; public double buyuksayi; public int kal = 0; public int bal = 0; public int Iterasyon = 0; public double<,>
YeniDizi = new double<4, 4>
; public string GeniAl2, GeniAl1; public string Bit1Birlestir, Bit2Birlestir, Bit3Birlestir, Bit4Birlestir; public double<,>
Bireyler1 = new double<4, 4>
; private void button1_Click(object sender, EventArgs e) { Random BitlereDegerUret = new Random(); for (int i = 0; i < BireyListesi.GetLength(0); i++) { for (int j = 0; j < BireyListesi.GetLength(1); j++) { int sayi = BitlereDegerUret.Next(0, 31); BireyListesi
= sayi ; } } listBox1.Items.Clear(); listBox1.Items.Add("Birey 1 icin X1 : " + BireyListesi<0, 0>
+ " , X2 : " + BireyListesi<0, 1>
+ " dir."); listBox1.Items.Add("Birey 2 icin X1 : " + BireyListesi<1, 0>
+ " , X2 : " + BireyListesi<1, 1>
+ " dir."); listBox1.Items.Add("Birey 3 icin X1 : " + BireyListesi<2, 0>
+ " , X2 : " + BireyListesi<2, 1>
+ " dir."); listBox1.Items.Add("Birey 4 icin X1 : " + BireyListesi<3, 0>
+ " , X2 : " + BireyListesi<3, 1>
+ " dir."); listBox1.Items.Add("------------------------------------------------"); listBox1.Items.Add("Birey 1 icin X1 : " + UretilenRastgeleBitiIkilikSayiyaCevir(BireyListesi<0, 0>
) + " , X2 : " + UretilenRastgeleBitiIkilikSayiyaCevir(BireyListesi<0, 1>
) + " dir."); listBox1.Items.Add("Birey 2 icin X1 : " + UretilenRastgeleBitiIkilikSayiyaCevir(BireyListesi<1, 0>
) + " , X2 : " + UretilenRastgeleBitiIkilikSayiyaCevir(BireyListesi<1, 1>
) + " dir."); listBox1.Items.Add("Birey 3 icin X1 : " + UretilenRastgeleBitiIkilikSayiyaCevir(BireyListesi<2, 0>
) + " , X2 : " + UretilenRastgeleBitiIkilikSayiyaCevir(BireyListesi<2, 1>
) + " dir."); listBox1.Items.Add("Birey 4 icin X1 : " + UretilenRastgeleBitiIkilikSayiyaCevir(BireyListesi<3, 0>
) + " , X2 : " + UretilenRastgeleBitiIkilikSayiyaCevir(BireyListesi<3, 1>
) + " dir."); listBox1.Items.Add("------------------------------------------------"); Birey1_X1 = BireyListesi<0, 0>
; Birey1_X2 = BireyListesi<0, 1>
; BireyListesi<0, 2>
= FonksiyondaYerineKoy(Birey1_X1, Birey1_X2); Birey2_X1 = BireyListesi<1, 0>
; Birey2_X2 = BireyListesi<1, 1>
; BireyListesi<1, 2>
= FonksiyondaYerineKoy(Birey2_X1, Birey2_X2); Birey3_X1 = BireyListesi<2, 0>
; Birey3_X2 = BireyListesi<2, 1>
; BireyListesi<2, 2>
= FonksiyondaYerineKoy(Birey3_X1, Birey3_X2); Birey4_X1 = BireyListesi<3, 0>
; Birey4_X2 = BireyListesi<3, 1>
; BireyListesi<3, 2>
= FonksiyondaYerineKoy(Birey4_X1, Birey4_X2); listBox1.Items.Add("Birey 1 icin F(X) = " + Convert.ToString(FonksiyondaYerineKoy(Birey1_X1, Birey1_X2))); listBox1.Items.Add("Birey 2 icin F(X) = " + Convert.ToString(FonksiyondaYerineKoy(Birey2_X1, Birey2_X2))); listBox1.Items.Add("Birey 3 icin F(X) = " + Convert.ToString(FonksiyondaYerineKoy(Birey3_X1, Birey3_X2))); listBox1.Items.Add("Birey 4 icin F(X) = " + Convert.ToString(FonksiyondaYerineKoy(Birey4_X1, Birey4_X2))); listBox1.Items.Add("------------------------------------------------"); BireylerinUygunlukDegerleri(FonksiyondaYerineKoy(Birey1_X1, Birey1_X2), FonksiyondaYerineKoy(Birey2_X1, Birey2_X2), FonksiyondaYerineKoy(Birey3_X1, Birey3_X2), FonksiyondaYerineKoy(Birey4_X1, Birey4_X2)); listBox1.Items.Add("Birey 1 X1 = " + Birey1_X1 + " X2 = " + Birey1_X2 + " F(X) = " + FonksiyondaYerineKoy(Birey1_X1, Birey1_X2) + " % " + Dizi<0>
); listBox1.Items.Add("Birey 2 X1 = " + Birey2_X1 + " X2 = " + Birey2_X2 + " F(X) = " + FonksiyondaYerineKoy(Birey2_X1, Birey2_X2) + " % " + Dizi<1>
); listBox1.Items.Add("Birey 3 X1 = " + Birey3_X1 + " X2 = " + Birey3_X2 + " F(X) = " + FonksiyondaYerineKoy(Birey3_X1, Birey3_X2) + " % " + Dizi<2>
); listBox1.Items.Add("Birey 4 X1 = " + Birey4_X1 + " X2 = " + Birey4_X2 + " F(X) = " + FonksiyondaYerineKoy(Birey4_X1, Birey4_X2) + " % " + Dizi<3>
); listBox1.Items.Add("------------------------------------------------"); DortBoyutluDiziyeCevir(); DortBoyutluDiziIcinDonusumBaslasin(); listBox1.Items.Add("------------------------------------------------"); BitleriCIftlestirmeyeBasla(); for (int i = 0; i < BireyListesi.GetLength(0); i++) { for (int j = 0; j < BireyListesi.GetLength(1)-1; j++) { BireyListesi
= Convert.ToInt32(UretilenRastgeleBitiIkilikSayiyaCevir(BireyListesi
)); } } } public string UretilenRastgeleBitiIkilikSayiyaCevir(int SayiAl ) { int kalan; String sayi=""; while (SayiAl>1 || SayiAl<-1) { kalan=Math.Abs(SayiAl%2); SayiAl=SayiAl/2; sayi=kalan+sayi; } sayi = SayiAl + sayi; if (sayi.Length == 1) { sayi = "0000" + sayi; } else if (sayi.Length ==2) { sayi = "000" + sayi; } else if (sayi.Length == 3) { sayi = "00" + sayi; } else if (sayi.Length == 4) { sayi = "0" + sayi; } string sonuc = sayi; return sonuc; } public void BireylerinUygunlukDegerleri(int Birey1, int Birey2, int Birey3, int Birey4) { int ToplamFonksiyon = Birey1 + Birey2 + Birey3 + Birey4; double Birey1_Yeni = - (Convert.ToDouble(Birey1) / Convert.ToDouble(ToplamFonksiyon)); double Birey2_Yeni = - (Convert.ToDouble(Birey2) / Convert.ToDouble(ToplamFonksiyon)); double Birey3_Yeni = - (Convert.ToDouble(Birey3) / Convert.ToDouble(ToplamFonksiyon)); double Birey4_Yeni = - (Convert.ToDouble(Birey4) / Convert.ToDouble(ToplamFonksiyon)); yenibireytum<0,3>
=Dizi<0>
= Math.Round(Birey1_Yeni, 2); yenibireytum<1,3>
=Dizi<1>
= Math.Round(Birey2_Yeni, 2); yenibireytum<2,3>
=Dizi<2>
= Math.Round(Birey3_Yeni, 2); yenibireytum<3,3>
=Dizi<3>
= Math.Round(Birey4_Yeni, 2); BuyukKucukBireyArastirmasi(); } public void BuyukKucukBireyArastirmasi() { kucuksayi = Dizi<0>
; buyuksayi = Dizi<0>
; for (int i = 0; i < Dizi.Length; i++) { if (Dizi
< kucuksayi) { kucuksayi = Dizi
; kal = i; } if (Dizi
> buyuksayi) { buyuksayi = Dizi
; bal = i; } } listBox1.Items.Add("------------------------------------------------"); listBox1.Items.Add("F(X)'lerin En Kucugu ; " + kucuksayi.ToString()); listBox1.Items.Add("F(X)'lerin En Buyugu ; " + buyuksayi.ToString()); listBox1.Items.Add("------------------------------------------------"); kucuksayi = buyuksayi; Dizi
; for (int i = 0; i < Dizi.Length; i++) { Console.WriteLine(Dizi
); } Console.WriteLine(); } public void DortBoyutluDiziyeCevir() { YeniDizi<0, 0>
= BireyListesi<0, 0>
; YeniDizi<0, 1>
= BireyListesi<0, 1>
; YeniDizi<0, 2>
= BireyListesi<0, 2>
; YeniDizi<0, 3>
= Dizi<0>
; YeniDizi<1, 0>
= BireyListesi<1, 0>
; YeniDizi<1, 1>
= BireyListesi<1, 1>
; YeniDizi<1, 2>
= BireyListesi<1, 2>
; YeniDizi<1, 3>
= Dizi<1>
; YeniDizi<2, 0>
= BireyListesi<2, 0>
; YeniDizi<2, 1>
= BireyListesi<2, 1>
; YeniDizi<2, 2>
= BireyListesi<2, 2>
; YeniDizi<2, 3>
= Dizi<2>
; YeniDizi<3, 0>
= BireyListesi<3, 0>
; YeniDizi<3, 1>
= BireyListesi<3, 1>
; YeniDizi<3, 2>
= BireyListesi<3, 2>
; YeniDizi<3, 3>
= Dizi<3>
; } public void DortBoyutluDiziIcinDonusumBaslasin() for (int m = 0; m < YeniDizi.GetLength(0); m++) { for (int k = 0; k < YeniDizi.GetLength(0); k++) { if (YeniDizi
== YeniDizi
) { for (int i = 0; i < YeniDizi.GetLength(0); i++) { for (int j = 0; j < YeniDizi.GetLength(1); j++) { YeniDizi
= YeniDizi
; } } } } } listBox1.Items.Add("Birey 1 : X1 = " + YeniDizi<0, 0>
+ " X2 = " + YeniDizi<0, 1>
+ " F(x) = " + YeniDizi<0, 2>
+ " % " + YeniDizi<0, 3>
); listBox1.Items.Add("Birey 2 : X1 = " + YeniDizi<1, 0>
+ " X2 = " + YeniDizi<1, 1>
+ " F(x) = " + YeniDizi<1, 2>
+ " % " + YeniDizi<1, 3>
); listBox1.Items.Add("Birey 3 : X1 = " + YeniDizi<2, 0>
+ " X2 = " + YeniDizi<2, 1>
+ " F(x) = " + YeniDizi<2, 2>
+ " % " + YeniDizi<2, 3>
); listBox1.Items.Add("Birey 4 : X1 = " + YeniDizi<3, 0>
+ " X2 = " + YeniDizi<3, 1>
+ " F(x) = " + YeniDizi<3, 2>
+ " % " + YeniDizi<3, 3>
); } public int FonksiyondaYerineKoy(int x1 , int x2) { int bir = Convert.ToInt32(textBox1.Text); int iki = Convert.ToInt32(textBox2.Text); int uc = Convert.ToInt32(textBox3.Text); int dort = Convert.ToInt32(textBox4.Text); int sonuc = bir * x1 * x1 + iki * x1 * x2 + uc * x2 * x2 + dort; return sonuc; } public int<,>
yenibireyonluk = new Int32<2, 2>
; public object<,>
yenibireytum = new object<4, 4>
; public int alal; public void BitleriCIftlestirmeyeBasla() { Random ParcalamaSayisi = new Random(); int Parca = ParcalamaSayisi.Next(1, 4); for (int i = 0; i < YeniDizi.GetLength(1)-2; i++) { for (int k = 0; k < 2; k++) { string YeniBit1 = Convert.ToString(UretilenRastgeleBitiIkilikSayiyaCevir(Convert.ToInt32(YeniDizi<0, i>
))); string YeniBit2 = Convert.ToString(UretilenRastgeleBitiIkilikSayiyaCevir(Convert.ToInt32(YeniDizi<1, i>
))); if (YeniBit1.Length == 1) { YeniBit1 = "0000" + YeniBit1; } else if (YeniBit1.Length == 2) { YeniBit1 = "000" + YeniBit1; } else if (YeniBit1.Length == 3) { YeniBit1 = "00" + YeniBit1; } else if (YeniBit1.Length == 4) { YeniBit1 = "0" + YeniBit1; } if (YeniBit2.Length == 1) { YeniBit2 = "0000" + YeniBit2; } else if (YeniBit2.Length == 2) { YeniBit2 = "000" + YeniBit2; } else if (YeniBit2.Length == 3) { YeniBit2 = "00" + YeniBit2; } else if (YeniBit2.Length == 4) { YeniBit2 = "0" + YeniBit2; } GeniAl1 = YeniBit1.Substring(Parca, 5 - Parca); GeniAl2 = YeniBit2.Substring(Parca, 5 - Parca); Bit1Birlestir = YeniBit1.Substring(0, Parca) + GeniAl2; Bit2Birlestir = YeniBit2.Substring(0, Parca) + GeniAl1; yenibireytum
= Bit1Birlestir; yenibireytum
= Bit2Birlestir; yenibireytum
= FonksiyondaYerineKoy(Convert.ToInt32(YeniBitleriOndalikSayiyaCevir(Bit1Birlestir)), Convert.ToInt32(YeniBitleriOndalikSayiyaCevir(Bit2Birlestir))); yenibireyonluk<0, i>
= FonksiyondaYerineKoy(Convert.ToInt32(YeniBitleriOndalikSayiyaCevir(Bit1Birlestir)), Convert.ToInt32(YeniBitleriOndalikSayiyaCevir(Bit2Birlestir))); alal = yenibireyonluk<0, i>
; Bireyler1
= Convert.ToInt32(Bit1Birlestir); Bireyler1
= Convert.ToInt32(Bit2Birlestir); Bireyler1
= alal; Bireyler1
= Dizi
; } listBox1.Items.Add("Ciftlesme 1 : X1 = " + Bit1Birlestir + " = " + YeniBitleriOndalikSayiyaCevir(Bit1Birlestir) + " X2 = " + Bit2Birlestir + " = " + YeniBitleriOndalikSayiyaCevir(Bit2Birlestir)); listBox1.Items.Add("Birey " + (i + 1) + " icin F(X) = " + Convert.ToString(FonksiyondaYerineKoy(Convert.ToInt32(YeniBitleriOndalikSayiyaCevir(Bit1Birlestir)), Convert.ToInt32(YeniBitleriOndalikSayiyaCevir(Bit2Birlestir))))); } int Parca_ = ParcalamaSayisi.Next(1, 4); for (int i = 0; i < YeniDizi.GetLength(1) - 2; i++) { for (int k = 2; k < 4; k++) { string YeniBit3 = Convert.ToString(UretilenRastgeleBitiIkilikSayiyaCevir(Convert.ToInt32(YeniDizi<2, i>
))); string YeniBit4 = Convert.ToString(UretilenRastgeleBitiIkilikSayiyaCevir(Convert.ToInt32(YeniDizi<3, i>
))); if (YeniBit3.Length == 1) { YeniBit3 = "0000" + YeniBit3; } else if (YeniBit3.Length == 2) { YeniBit3 = "000" + YeniBit3; } else if (YeniBit3.Length == 3) { YeniBit3 = "00" + YeniBit3; } else if (YeniBit3.Length == 4) { YeniBit3 = "0" + YeniBit3; } if (YeniBit4.Length == 1) { YeniBit4 = "0000" + YeniBit4; } else if (YeniBit4.Length == 2) { YeniBit4 = "000" + YeniBit4; } else if (YeniBit4.Length == 3) { YeniBit4 = "00" + YeniBit4; } else if (YeniBit4.Length == 4) { YeniBit4 = "0" + YeniBit4; } GeniAl1 = YeniBit3.Substring(Parca_, 5 - Parca_); GeniAl2 = YeniBit4.Substring(Parca_, 5 - Parca_); Bit3Birlestir = YeniBit3.Substring(0, Parca_) + GeniAl2; Bit4Birlestir = YeniBit4.Substring(0, Parca_) + GeniAl1; yenibireytum
= Bit3Birlestir; yenibireytum
= Bit4Birlestir; yenibireytum
= FonksiyondaYerineKoy(Convert.ToInt32(YeniBitleriOndalikSayiyaCevir(Bit3Birlestir)), Convert.ToInt32(YeniBitleriOndalikSayiyaCevir(Bit4Birlestir))); yenibireyonluk<1, i>
= (FonksiyondaYerineKoy(Convert.ToInt32(YeniBitleriOndalikSayiyaCevir(Bit3Birlestir)), Convert.ToInt32(YeniBitleriOndalikSayiyaCevir(Bit4Birlestir)))); alal = yenibireyonluk<1, i>
; Bireyler1
= Convert.ToInt32(Bit3Birlestir); Bireyler1
= Convert.ToInt32(Bit4Birlestir); Bireyler1
= alal; Bireyler1
= Dizi
; } listBox1.Items.Add("Ciftlesme 2 : X1 = " + Bit3Birlestir + " = " + YeniBitleriOndalikSayiyaCevir(Bit3Birlestir) + " X2 = " + Bit4Birlestir + " = " + YeniBitleriOndalikSayiyaCevir(Bit4Birlestir)); listBox1.Items.Add("Birey " + (i + 1) + " icin F(X) = " + Convert.ToString(FonksiyondaYerineKoy(Convert.ToInt32(YeniBitleriOndalikSayiyaCevir(Bit3Birlestir)), Convert.ToInt32(YeniBitleriOndalikSayiyaCevir(Bit4Birlestir))))); } BireylerinUygunlukDegerleri(yenibireyonluk<0, 0>
, yenibireyonluk<0, 1>
, yenibireyonluk<1, 0>
, yenibireyonluk<1, 1>
); MutasyonOlustur(); } public string YeniBitleriOndalikSayiyaCevir(string SayiAl) { int ikilik_taban = 0, cevrilen_sayi = 0; double onluk_taban = 0; ikilik_taban = int.Parse(SayiAl); cevrilen_sayi = ikilik_taban; for (double i = 0; i < ikilik_taban.ToString().Trim().Length; i++) { onluk_taban += (cevrilen_sayi % 10) * Math.Pow(2, i); cevrilen_sayi /= 10; } return Convert.ToString(onluk_taban); } public void MutasyonOlustur() { Random Mutasyon = new Random(); int SatirMutasyon = Mutasyon.Next(0,3); int SutunMutasyon = Mutasyon.Next(1, 5); String MutasyonBiti; String Degisim; MutasyonBiti = Convert.ToString(yenibireytum
); Degisim = MutasyonBiti.Substring(SutunMutasyon-1, 1); Degisim = (Degisim == "0") ? "1" : "0"; yenibireytum
= MutasyonBiti.Substring(0, SutunMutasyon-1) + Degisim + MutasyonBiti.Substring(SutunMutasyon, 5 - SutunMutasyon); MutasyonBiti = Convert.ToString(yenibireytum
); Degisim = MutasyonBiti.Substring(SutunMutasyon-1, 1); Degisim = (Degisim == "0") ? "1" : "0"; yenibireytum
= MutasyonBiti.Substring(0, SutunMutasyon-1) + Degisim + MutasyonBiti.Substring(SutunMutasyon, 5 - SutunMutasyon); yenibireytum
= (FonksiyondaYerineKoy(Convert.ToInt32(yenibireytum
), Convert.ToInt32(yenibireytum
))); Console.WriteLine(Convert.ToString(yenibireytum
) + " " + Convert.ToString(yenibireytum
) + " " + Convert.ToString(yenibireytum
)); listBox1.Items.Add("mutasyon satiri= " + SatirMutasyon+" mutasyon sutunu= "+ SutunMutasyon); listBox1.Items.Add("mutasyondaSonra x1=" + yenibireytum<0, 0>
+ " x2= " + yenibireytum<0, 1>
+ " f(x)= " + yenibireytum<0, 2>
+ " %= " + yenibireytum<0, 3>
); listBox1.Items.Add("mutasyondaSonra x1=" + yenibireytum<1, 0>
+ " x2= " + yenibireytum<1, 1>
+ " f(x)= " + yenibireytum<1, 2>
+ " %= " + yenibireytum<1, 3>
); listBox1.Items.Add("mutasyondaSonra x1=" + yenibireytum<2, 0>
+ " x2= " + yenibireytum<2, 1>
+ " f(x)= " + yenibireytum<2, 2>
+ " %= " + yenibireytum<2, 3>
); listBox1.Items.Add("mutasyondaSonra x1=" + yenibireytum<3, 0>
+ " x2= " + yenibireytum<3, 1>
+ " f(x)= " + yenibireytum<3, 2>
+ " %= " + yenibireytum<3, 3>
); listBox1.Items.Add("--------------------------------"); Yenibireysecim(); } public void Yenibireysecim() { int cep = 0; int index = 0; int[] fx=new int<8>
; int[] YeniFxIndex=new int<4>
; int<,>
Gecici = new int<4, 3>
; for (int a = 0; a < 4; a++) { fx = BireyListesi
; fx<(a + 4)>
= Convert.ToInt32(yenibireytum
); } for (int i = 0; i < 4; i++) { cep = int.MaxValue; for (int j = 0; j < 8; j++) { if (fx
< cep && fx
> 0) { cep = fx
; index = j; } } YeniFxIndex
= index; fx
= -fx
; listBox1.Items.Add("8lidenIndex= "+YeniFxIndex
); } for (int k = 0; k < 4; k++) { for (int m = 0; m < 2; m++) { Gecici
= (4 > YeniFxIndex
) ? BireyListesi[YeniFxIndex
, m] : Convert.ToInt32(YeniBitleriOndalikSayiyaCevir(Convert.ToString(yenibireytum[(YeniFxIndex
-4), m]))); } Gecici
= (4 > YeniFxIndex
) ? BireyListesi[YeniFxIndex
, 2] : Convert.ToInt32(yenibireytum[(YeniFxIndex
- 4), 2]); } for (int s = 0; s < 4; s++) { for (int d = 0; d < 3; d++) { BireyListesi
= Gecici
; } listBox1.Items.Add("8lidenSeçilen= x1= "+BireyListesi
+" x2= "+BireyListesi
+ " f(x)= "+BireyListesi
); } listBox1.Items.Add("-------------------------------- "); Iterasyon++; if (Iterasyon < Convert.ToInt32(TxtIterasyon.Text)) { Dongu(); } } public void Dongu() { BireylerinUygunlukDegerleri(BireyListesi<0, 2>
, BireyListesi<1, 2>
, BireyListesi<2, 2>
, BireyListesi<3, 2>
);
DortBoyutluDiziyeCevir();
DortBoyutluDiziIcinDonusumBaslasin();
listBox1.Items.Add("------------------------------------------------");
BitleriCIftlestirmeyeBasla();
}
}
}
Yorumlar