public List <Birey> ToplumOlustur() { List <Birey> toplum = new List <Birey>(); Random rastgele = new Random(); while (toplum.Count < BireySayisi) { string harflerharfler = anaharfler; Birey islemyapilacakBirey = new Birey("", "", 0, 0, new List <Arac>()); //islemyapilacakBirey= toplum[toplum.Count]; while (islemyapilacakBirey.Kromozom.Length < anaharfler.Length) { int rastint = rastgele.Next(harflerharfler.Length); Char harf = harflerharfler[rastint]; if (!islemyapilacakBirey.Kromozom.Contains(harf)) { islemyapilacakBirey.Kromozom += harf; harflerharfler = harflerharfler.Remove(rastint, 1); } } toplum.Add(islemyapilacakBirey); } return(toplum); }
private void button1_Click(object sender, EventArgs e) { //sonucekrani = new StringBuilder(); ilkToplum = ToplumOlustur(); listBox1.Items.Clear(); String sonucekraniyazisi = "İlk Toplum tüm bireyleri oluşturuldu."; //sonucekrani.AppendLine(String.Format("{0}", sonucekraniyazisi)); listBox1.Items.Add(sonucekraniyazisi); //ResultText.Text = sonucekrani.ToString(); //yeniToplum = ilkToplum; //sonucekraniyazisi = "İlk Toplum bireyleri işlem yapılab."; //sonucekrani.AppendLine(String.Format("{0}", sonucekraniyazisi)); //ResultText.Text = sonucekrani.ToString(); //her nesil için döngü gerçekleşecek ve döngünün en iyisi ekrana yazılacak // test amaçlı nesil bir defa denenecek for (int i_nesil = 0; i_nesil < NesilSayisi; i_nesil++) { //her bireyin uygunluğu hesaplanacak foreach (Birey birey in ilkToplum) { //List<Arac> bireyinAraclari = new List<Arac>(); //bireyinAraclari = AracListesi.ToList(); List <Arac> bireyinAraclari = AracListesi.CloneList().ToList(); //List<ICloneable> AracListesi = new List<ICloneable>(); //List<ICloneable> bireyinAraclari = new List<ICloneable>(AracListesi.Count); //AracListesi.ForEach((item) => //{ // bireyinAraclari.Add((ICloneable)item.Clone()); //}); //uygunluk hesaplanırken kromozomlar tek tek dolaşılarak hesaplanıcak for (int i_kromozom = 0; i_kromozom < birey.Kromozom.Length; i_kromozom++) { //her kromozom bir müşteri depodan başlayıp her kromozoma ait müşteriyi uzaklığı hesaplanıcak, sonra bir sonraki müşteriye //giderken ki mesafe hesaplanıcak. Uzaklık dışında eldeki araç miktarı en son kaç tane kullanılmışsa ona göre değerlendirilicek //örneğin bireyin tüm kromozomları dolaşılıp mesafeler ve ihtiyaç olan taşıma araç sayıları belirlendikten sonra // puanlama yapılacak. bu puanlama uygun değerini temsil eder. //puan hesaplanırken toplam ihtiyaç miktarını en çok yük alan araçı gönderirken rutun kaç tanesi yapabileceği tespit edilecek. Ardından //ikinci en çok yük alabilen aracın kaç tane yapabileceği tespit edilir ve tümünde sırasıyla kaç aracın devreye gireceği netleştiirilir. // her aracın yapacağı mesafeler hesaplanarak toplam miktar uygunluk değeri olarak alınır. Böylece toplam miktar en az olan bizim için en iyi ruttur. // örneğin toplam talep miktarı 3 araçla 4500 km yol gidilerek karşılayan bir rutlama ile 2 araçla 3800 km yol gidilebilecek şekilde daha iyi bir //rotalama yapılabilir. Char harf = birey.Kromozom[i_kromozom]; Char oncekiharf = birey.Kromozom[i_kromozom == 0 ? i_kromozom : i_kromozom - 1]; Musteri oncekiMusteri = MusteriListesi.Where(c => c.Adi == oncekiharf.ToString()).FirstOrDefault(); if (i_kromozom == 0) { oncekiMusteri = MusteriListesi[0]; } Musteri suankiMusteri = MusteriListesi.Where(c => c.Adi == harf.ToString()).FirstOrDefault(); //önce araba kapasitesinin yeterliliği kontrol edilecek yetmezse yeni arac harekete başlayacak sonra kapastesi azaltılacak arabanın int SiparisMiktari = suankiMusteri.SiparisMiktari; //Arac sontrue = new Arac(); //sontrue = bireyinAraclari.Where(c => c.Kullanildimi == false).FirstOrDefault(); int siradakaracindexi = bireyinAraclari.FindIndex(c => c.Kullanildimi == false); //siradakaracindexi += 1; //if eğer var olan araç kapasitesi yeterli gelir mi kontrolu. Mesafe burası ile önceki nokta arası hesaplanır try { if (bireyinAraclari[siradakaracindexi].Kapasite >= SiparisMiktari) { bireyinAraclari[siradakaracindexi].Kapasite -= SiparisMiktari; birey.AraclarinGuzergahi += harf; } else { //burda yeterli gelmediğinde diğer araca geçilmiştir. Dolayısıyla mesafe depodan bu noktaya göre yapılır bireyinAraclari[siradakaracindexi].Kullanildimi = true; siradakaracindexi++; bireyinAraclari[siradakaracindexi].Kapasite -= SiparisMiktari; //araç değiştiriği için ceza 2000 birey.Uygunluk += 2000; birey.AraclarinGuzergahi += " -- " + harf; } } catch (Exception) { } double aradakiMesafe = Geography.CalculateDistance(suankiMusteri.Enlem, suankiMusteri.Boylam, oncekiMusteri.Enlem, oncekiMusteri.Boylam); birey.Uygunluk += (int)aradakiMesafe / 1000; birey.ToplamYol += (int)aradakiMesafe / 1000; } birey.AraclarSirasi = bireyinAraclari; } //uygunluk hesaplamaları bitti en iyiler kontrol edilecek var minUygunluk = ilkToplum.Min(obj => obj.Uygunluk); Birey buneslineniyibireyi = ilkToplum.Where(obj => obj.Uygunluk == minUygunluk).FirstOrDefault(); int KullanilanAracSayisi = buneslineniyibireyi.AraclarSirasi.FindIndex(c => c.Kullanildimi == false); // sonucekrani.AppendLine(String.Format("{0} Neslin bireylerinin uygunluk değeri hesaplandı.", i_nesil + 1)); // sonucekrani.AppendLine(String.Format("{0} Neslin bireylerinin en iyi olan Birey \nKromozomu: {1}, \nUygunluk Değeri: {2}, \nKullandığı Araç Sayısı: {3}", i_nesil + 1, buneslineniyibireyi.Kromozom, buneslineniyibireyi.Uygunluk, KullanilanAracSayisi - 1)); listBox1.Items.Add(String.Format("{0}. Neslin en iyi Bireyinin \nGüzergahı: {1}, \nToplam Yol: {2}, \nKullandığı Araç Sayısı: {3}", i_nesil + 1, buneslineniyibireyi.AraclarinGuzergahi, buneslineniyibireyi.ToplamYol, KullanilanAracSayisi + 1)); // ResultText.Text = sonucekrani.ToString(); yeniToplum = new List <Birey>(); Birey b = (Birey)buneslineniyibireyi.Clone(); //elitizm yapılıyor en iyi birey saklanıyor yeniToplum.Add(b); yeniToplum.Add(b); //çaprazlama ile yeni topumun kalan tüm elemanları oluşturuluyor. // Sıralamaya dayalı çaprazlama yapılmaktadır. Random rnd = new Random(); for (int i_caprazlama = 0; i_caprazlama < BireySayisi - 2; i_caprazlama = i_caprazlama + 2) { Birey caprazlama_ilkbirey = ilkToplum[rnd.Next(BireySayisi)]; Birey caprazlama_ikincibirey = ilkToplum[rnd.Next(BireySayisi)]; Birey caprazlama_ilkfinalist; if (caprazlama_ilkbirey.Uygunluk < caprazlama_ikincibirey.Uygunluk) { caprazlama_ilkfinalist = caprazlama_ilkbirey; } else { caprazlama_ilkfinalist = caprazlama_ikincibirey; } Birey caprazlama_ucuncubirey = ilkToplum[rnd.Next(BireySayisi)]; Birey caprazlama_dortuncubirey = ilkToplum[rnd.Next(BireySayisi)]; Birey caprazlama_ikincifinalist; if (caprazlama_ucuncubirey.Uygunluk < caprazlama_dortuncubirey.Uygunluk) { caprazlama_ikincifinalist = caprazlama_ucuncubirey; } else { caprazlama_ikincifinalist = caprazlama_dortuncubirey; } int caprazlanacakKromozomBogumu = rnd.Next(1, anaharfler.Length - 1); String ilkparcailk = caprazlama_ilkfinalist.Kromozom.Substring(0, caprazlanacakKromozomBogumu); String kalanparcailk = caprazlama_ikincifinalist.Kromozom; for (int i_caprazlama_kromozom = 0; i_caprazlama_kromozom < kalanparcailk.Length; i_caprazlama_kromozom++) { Char harf = kalanparcailk[i_caprazlama_kromozom]; if (!ilkparcailk.Contains(harf)) { ilkparcailk += harf.ToString(); } } caprazlama_ilkfinalist.Kromozom = ilkparcailk; caprazlama_ilkfinalist.Uygunluk = 0; caprazlama_ilkfinalist.ToplamYol = 0; b = (Birey)caprazlama_ilkfinalist.Clone(); yeniToplum.Add(b); String ilkparcaikinci = caprazlama_ikincifinalist.Kromozom.Substring(0, caprazlanacakKromozomBogumu); String kalanparcaikinci = caprazlama_ilkfinalist.Kromozom; for (int i_caprazlama_kromozom = 0; i_caprazlama_kromozom < kalanparcaikinci.Length; i_caprazlama_kromozom++) { Char harf = kalanparcaikinci[i_caprazlama_kromozom]; if (!ilkparcaikinci.Contains(harf)) { ilkparcaikinci += harf.ToString(); } } caprazlama_ikincifinalist.Kromozom = ilkparcaikinci; caprazlama_ikincifinalist.Uygunluk = 0; caprazlama_ikincifinalist.ToplamYol = 0; b = (Birey)caprazlama_ikincifinalist.Clone(); yeniToplum.Add(b); } //mutasyonla bir birey kromozomları yer değiştiriliyor int mutasyonluBirey = rnd.Next(BireySayisi); String mutasyon_bireyin_kromozomu = yeniToplum[mutasyonluBirey].Kromozom; int mutasyonaugrayacakbirinciKromozom_int = rnd.Next(1, anaharfler.Length - 1); int mutasyonaugrayacakikinciKromozom_int = rnd.Next(1, anaharfler.Length - 1); //Char mutasyonaugrayacakbirinciKromozom = mutasyon_bireyin_kromozomu[mutasyonaugrayacakbirinciKromozom_int]; //Char mutasyonaugrayacakikinciKromozom = mutasyon_bireyin_kromozomu[mutasyonaugrayacakikinciKromozom_int]; yeniToplum[mutasyonluBirey].Kromozom = Geography.SwapCharacters(yeniToplum[mutasyonluBirey].Kromozom, mutasyonaugrayacakbirinciKromozom_int, mutasyonaugrayacakikinciKromozom_int); // yeniToplum[mutasyonluBirey].Kromozom= yeniToplum[mutasyonluBirey].Kromozom.Replace(mutasyonaugrayacakbirinciKromozom, mutasyonaugrayacakikinciKromozom); ilkToplum = yeniToplum.CloneList().ToList(); for (int i = 0; i < ilkToplum.Count; i++) { ilkToplum[i].Uygunluk = 0; ilkToplum[i].ToplamYol = 0; ilkToplum[i].AraclarinGuzergahi = ""; } } }