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 = "";
                }
            }
        }