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); }
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); }