public List <Cozum> rastgeleCozumOlustur() { List <Cozum> ilkRastgeleCozum = new List <Cozum>(); Random rastgele = new Random(); while (ilkRastgeleCozum.Count < cozumSayisi) { Cozum cozum = new Cozum(new List <int>(), 0); while (cozum.Kromozom.Count < sehirSayisi) { int rastint = rastgele.Next(sehirSayisi); int sira = tumSehirListesi[rastint].Sira; if (!cozum.Kromozom.Contains(sira)) { cozum.Kromozom.Add(sira); } } ilkRastgeleCozum.Add(cozum); } return(ilkRastgeleCozum); }
public int uygunlukFonk(Cozum cozum) { for (int i_kromozom = 0; i_kromozom < cozum.Kromozom.Count; i_kromozom++) { int ilce = cozum.Kromozom[i_kromozom]; int oncekiIlce = cozum.Kromozom[i_kromozom == 0 ? i_kromozom : i_kromozom - 1]; Sehir suankiSehir = tumSehirListesi.Where(c => c.Sira == ilce).FirstOrDefault(); Sehir oncekiSehir = tumSehirListesi.Where(c => c.Sira == oncekiIlce).FirstOrDefault(); double aradakiMesafe = Geography.CalculateDistance(suankiSehir.Enlem, suankiSehir.Boylam, oncekiSehir.Enlem, oncekiSehir.Boylam); // uygunluk fonksıyorunu hesaplanırken tabu da o durum varsa o cozum ceza puanıyle uzaklastırılıyor for (int i = 0; i < tabuListemiz.Count; i++) { Tabu temp = tabuListemiz[i]; if (temp.kimden == oncekiSehir.Sira && temp.kime == suankiSehir.Sira) { aradakiMesafe += 1000 * 100; } } cozum.Uygunluk += (int)aradakiMesafe / 1000; } return(cozum.Uygunluk); }
//tabu arama private void button1_Click(object sender, EventArgs e) { //ilk çözüm rastgele olusturuldu suankiCozumListesi = rastgeleCozumOlustur(); foreach (Cozum cozum in suankiCozumListesi) { //uygunluk degerlerı kontrol edıldı cozum.Uygunluk = uygunlukFonk(cozum); } listBox1.Items.Clear(); String sonucekraniyazisi = "Tabu Arama ile Çözüm"; listBox1.Items.Add(sonucekraniyazisi); //tüm çözümlerin uygunlukları hesaplanır for (int i_nesil = 0; i_nesil < iterasyonSayisi; i_nesil++) { //en az mesafe benım ıcın en uygun cozum var minUygunluk = suankiCozumListesi.Min(obj => obj.Uygunluk); Cozum buNeslinEnIyibireyi = suankiCozumListesi.Where(obj => obj.Uygunluk == minUygunluk).FirstOrDefault(); // en iyi çözümü uzun hafızaya aldım eniyiler.Add(buNeslinEnIyibireyi); //tabu arama yontemı ıle ılgılı ıslemler swapla methodunda bulunmakta suankiCozumListesi = swapla(buNeslinEnIyibireyi); StringBuilder sb = new StringBuilder(); for (int i = 0; i < buNeslinEnIyibireyi.Kromozom.Count; i++) { sb.Append(buNeslinEnIyibireyi.Kromozom[i].ToString() + "-"); } listBox1.Items.Add(String.Format("{0}. iterasyon en iyisi \n: {1}, \nToplam Yol: {2}", i_nesil + 1, sb, buNeslinEnIyibireyi.Uygunluk)); } }
//tavlama benzetimi private void button2_Click(object sender, EventArgs e) { yeniCozumListesi = new List <Cozum>(); // ılk cozum hızlı basladı suankiCozumListesi = rastgeleCozumOlustur(); foreach (Cozum cozum in suankiCozumListesi) { //ılk cozumun uygunlukları hesaplandı cozum.Uygunluk = uygunlukFonk(cozum); } var minUygunluk = suankiCozumListesi.Min(obj => obj.Uygunluk); // en uygun bırey seçildi Cozum buNeslinEnIyibireyi = suankiCozumListesi.Where(obj => obj.Uygunluk == minUygunluk).FirstOrDefault(); listBox1.Items.Clear(); String sonucekraniyazisi = "Tavlama Benzetimi ile Çözüm"; listBox1.Items.Add(sonucekraniyazisi); listBox1.Items.Add("Başlangıç Çözüm Mesafesi: " + buNeslinEnIyibireyi.Uygunluk); Random rastgele = new Random(); // Sistem soğuana kadar döngüye sok while (temp > 1) { minUygunluk = suankiCozumListesi.Min(obj => obj.Uygunluk); buNeslinEnIyibireyi = suankiCozumListesi.Where(obj => obj.Uygunluk == minUygunluk).FirstOrDefault(); List <int> gelenOrjinalKromozom = new List <int>(buNeslinEnIyibireyi.Kromozom); int rastint1 = rastgele.Next(sehirSayisi); int rastint2 = rastgele.Next(sehirSayisi); int geciciBir = gelenOrjinalKromozom[rastint1]; int geciciiki = gelenOrjinalKromozom[rastint2]; gelenOrjinalKromozom[rastint1] = geciciiki; gelenOrjinalKromozom[rastint2] = geciciBir; //rastgele genler değiştirilerek yenı cozum bulundu Cozum yeniCozum = new Cozum(gelenOrjinalKromozom, 0); //yenı cozumun uygunlugu hesaplandı yeniCozum.Uygunluk = uygunlukFonk(yeniCozum); // il bulunan en iyi Çözüm enerji alın int currentEnergy = buNeslinEnIyibireyi.Uygunluk; // sonradan rastgele degıstırılerek bulunan en ıyı cozum enerjısı hesaplandı int neighbourEnergy = yeniCozum.Uygunluk; // Komşuyu kabul edip edemeyeceğimize karar verin //butun olay bu methodda oluyor if (acceptanceProbability(currentEnergy, neighbourEnergy, temp) > rastgele.NextDouble()) { buNeslinEnIyibireyi.Kromozom = gelenOrjinalKromozom; buNeslinEnIyibireyi.Uygunluk = yeniCozum.Uygunluk; } // Soğuk sistem temp *= 1 - coolingRate; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < buNeslinEnIyibireyi.Kromozom.Count; i++) { sb.Append(buNeslinEnIyibireyi.Kromozom[i].ToString() + "-"); } listBox1.Items.Add("Son Çözüm Mesafesi: " + buNeslinEnIyibireyi.Uygunluk); listBox1.Items.Add("Tur Detayı: " + sb); }
public List <Cozum> swapla(Cozum buNeslinEnIyibireyi) { List <Cozum> ilkRastgeleCozum = new List <Cozum>(); //en ıyı bireyımı kısa hafızaya aldım ilkRastgeleCozum.Add(buNeslinEnIyibireyi); for (int i = 0; i < buNeslinEnIyibireyi.Kromozom.Count - 1; i++) { List <int> gelenOrjinalKromozom = new List <int>(buNeslinEnIyibireyi.Kromozom); int geciciBir = gelenOrjinalKromozom[i]; int geciciiki = gelenOrjinalKromozom[i + 1]; gelenOrjinalKromozom[i] = geciciiki; gelenOrjinalKromozom[i + 1] = geciciBir; // en iyi bireyimin yan yana cozumlerinin yerini değiştirdim tek tek Cozum yeniCozum = new Cozum(gelenOrjinalKromozom, 0); //bu swaplanmış olan bıreyın uygunlugu hesaplanıyor yeniCozum.Uygunluk = uygunlukFonk(yeniCozum); //eger yenı buldugum oncekınden iyiyse if (yeniCozum.Uygunluk < buNeslinEnIyibireyi.Uygunluk) { //daha iyiye sebep olan kriteri tabuye eklıyorum // ekleme işleminde fifo uygulanıyor. (first in first out, ilk giren ilk çıkar) Tabu tabu = new Tabu(geciciiki, geciciBir); try { tabuListemiz[3] = tabuListemiz[2]; } catch (Exception) {} try { tabuListemiz[2] = tabuListemiz[1]; } catch (Exception) { } try { tabuListemiz[1] = tabuListemiz[0]; } catch (Exception) { } try { tabuListemiz[0] = tabu; } catch (Exception) { } } //daha ıyı cozumu de kısa hafızaya alıyorum ilkRastgeleCozum.Add(yeniCozum); } /* if (eniyiler.Count != 0) * { * Cozum enSonCozum = eniyiler[eniyiler.Count - 1]; * * if (buNeslinEnIyibireyi.Uygunluk < enSonCozum.Uygunluk) * { * } * } */ return(ilkRastgeleCozum); }