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