//public void ElitizimUygula(bool elitizimeniyi)
        //{
        //    //iyi sonuçlar vermeyince kullanılmadı testlerde bir başarı görülmedi
        //    if (elitizimeniyi)
        //        ElitizimEniyi();
        //    else
        //        ElitizimCesitlilik();
        //}

        public void ElitizimEniyi()
        {
            //kromozom sayısını başlangıç populasyonuna düşürür,
            //kromozomları sıralar ve en kötü olanları siler

            //kromozomlar sıraya konuyor
            bool degisti = true;
            int  sayac   = 0;

            while (degisti)//bubble sort sıralaması yapıyor
            {
                degisti = false;
                for (int i = 0; i < _kromozomlist.Count - 1 - sayac; i++)
                {
                    if (_kromozomlist[i].fitness > _kromozomlist[i + 1].fitness)
                    {
                        Kromozom gecici = _kromozomlist[i];
                        _kromozomlist[i]     = _kromozomlist[i + 1];
                        _kromozomlist[i + 1] = gecici;
                        degisti = true;
                    }
                }
                sayac++;
            }

            //sıraya konduktan sonra başka daha iyi bireyler olduğundan sondan başlayarak silme yapılıyor
            while (_kromozomlist.Count > _buyukluk)
            {
                _kromozomlist.RemoveAt(_kromozomlist.Count - 1);
            }
        }
        public Populasyon(int buyukluk, IlkAtamaYontem ilkatamayontem)
        {
            this._buyukluk = buyukluk;
            this._iay      = ilkatamayontem;
            //         Islemler.CezaPuanlariniBelirle();

            _kromozomlist = new List <Kromozom>();
            int sayac  = 0;
            int sayac2 = 0;

            for (int i = 1; _kromozomlist.Count < this._buyukluk; i++)
            {
                Kromozom k = new Kromozom(this._iay);
                if (k.atanamayanhastalar.Count == 0)
                {
                    sayac++;
                    _kromozomlist.Add(k);
                }
                sayac2++;
                Islemler.ilkatamaKromozomSayisi = _kromozomlist.Count();
                if (sayac2 >= Islemler.ilkAtamaMaxDenemeSayisi)
                {
                    // MessageBox.Show(Islemler.atamamesaj);
                    // _kromozomlist = null;
                    Islemler.ilkatamabasarili = false;
                    return;
                }
            }
            //Thread atama = new Thread(new ThreadStart(IlkAtamaThread));
            //atama.Start();
        }
 public IyiKromozomlar(int nesil, Kromozom kromozom)
 {
     this.nesil      = nesil;
     this.kromozom   = kromozom;
     this.kromozomID = kromozom.kromozomId;
     this.fitness    = kromozom.fitness;
 }
Example #4
0
 public Kromozom(Kromozom modelKromozom)
 {
     //referansı pas edilen kromozomun kopyası ile yeni bir kromozom döner
     //çaprazlama işlemlerinde kullanılması için yazıldı
     //dönen kromozom modelkromozom ile aynı ama ID si Farklı olacaktır.
     _staticId++;
     this._kromozomId  = _staticId;                        //yeni kromozom id alındı
     this._rotaListesi = new List <Rota>();                //rota listesi oluştu
     this._iay         = modelKromozom.iay;                //ilk atama yöntem modelden alındı
     foreach (Rota kopyaRota in modelKromozom.rotaListesi) //kromozomdaki rotaların kopyasını alır
     {
         this._rotaListesi.Add(new Rota(kopyaRota));
     }
 }
        //public void KromozomSec(ref Kromozom kromozom1, ref Kromozom kromozom2)
        //{
        //    /*
        //     * Kullanılmadı
        //     * Basitçe birbinin aynı olmayan 2 adet kromozom seçer
        //     */
        //    CryptoRandom rnd = new CryptoRandom();
        //    int indis1 = rnd.Next(0, _buyukluk); //önceki nesilden seçmek içini, kromozomlist.count olursa yeni eklenen çocukları da dikkate alır
        //    int indis2 = -1;
        //    do
        //    {
        //        indis2 = rnd.Next(0, _buyukluk);
        //    } while (indis1 == indis2);//farklı 2 değer üretinceye kadar devam eder
        //    kromozom1 = _kromozomlist[indis1];
        //    kromozom2 = _kromozomlist[indis2];
        //}
        //public void CaprazlaRandom(int caprazlamaorani)
        //{
        //    //yazıldı ama bu kod kullanılmadı
        //    //caprazla ve ekle ile seçilen 2 kromozomu çaprazlayarak ekliyor.
        //    //100 den büyük bir değer gelirse 100 kabul edilir
        //    if (caprazlamaorani > 100) caprazlamaorani = 100;

        //    do
        //    {
        //        Kromozom k1 = null;
        //        Kromozom k2 = null;
        //        KromozomSec(ref k1, ref k2);
        //        CaprazlaveEkle(k1, k2);
        //    } while (kromozomListesi.Count <= (1 + (double)caprazlamaorani / 100) * _buyukluk);

        //}
        public void Caprazla2Grup(int caprazlamaorani)
        {
            //caprazla ve ekle ile seçilen 2 kromozomu çaprazlayarak ekliyor.
            //2 ayrı grup yapıyor ve bu gruplardan rastgele seçerek çaprazlıyor
            //çaprazlama oranı 100 den büyük gönderilirse değer 100 kabul edilir
            if (caprazlamaorani > 100)
            {
                caprazlamaorani = 100;
            }
            List <int> listeGenel = new List <int>(); //genel kromozom listesi
            List <int> liste1     = new List <int>(); //kromozomları 2 listeye bölecek
            List <int> liste2     = new List <int>();

            for (int i = 0; i < kromozomListesi.Count; i++)
            {
                listeGenel.Add(i);
            }

            int          dongusayisi = listeGenel.Count * caprazlamaorani / (100 * 2);//listedeki eleman sayısının yarısı
            CryptoRandom rnd         = new CryptoRandom();
            int          indis;

            for (int i = 0; i < dongusayisi; i++) //çaprazlama oranı 50 ise %25 elemanı liste1 atıyor, %25 i liste2 ye
            {
                indis = rnd.Next(0, listeGenel.Count);
                liste1.Add(listeGenel[indis]);
                listeGenel.Remove(indis);

                indis = rnd.Next(0, listeGenel.Count);
                liste2.Add(listeGenel[indis]);
                listeGenel.Remove(indis);
            }
            for (int i = 0; i < dongusayisi; i++)
            {
                Kromozom k1 = kromozomListesi[liste1[i]];
                Kromozom k2 = kromozomListesi[liste2[i]];
                CaprazlaveEkle(k1, k2);
            }
        }
Example #6
0
        private void button7_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
            listBox2.Items.Clear();
            listBox3.Items.Clear();
            DateTime zaman = DateTime.Now;

            //          listBox1.Items.Add(zaman);
            Kromozom.IDSifirla();
            IlkAtamaYontem ia = IlkAtamaYontem.firstfit;

            if (comboBox1.Text == "firstfit")
            {
                ia = IlkAtamaYontem.firstfit;
            }
            else if (comboBox1.Text == "bestfitperiod")
            {
                ia = IlkAtamaYontem.bestfitperiod;
            }
            else if (comboBox1.Text == "bestfitteam")
            {
                ia = IlkAtamaYontem.bestfitteam;
            }

            int kromozomsayisi = 0;

            try
            {
                kromozomsayisi = Int32.Parse(kromozomsayisiTxt.Text);
            }
            catch
            {
                MessageBox.Show("Kromozom sayısı değeri sayı olmalıdır");
                return;
            }

            int caprazlamaorani = 0;

            try
            {
                caprazlamaorani = Int32.Parse(caprazlamasayisiTxt.Text);
            }
            catch
            {
                MessageBox.Show("Çaprazlama oranı sayı olmalıdır");
                return;
            }

            int iterasyonsayisi = 0;

            try
            {
                iterasyonsayisi = Int32.Parse(iterasyonsayisiTxt.Text);
            }
            catch
            {
                MessageBox.Show("İterasyon sayısı degeri sayı olmalıdır");
                return;
            }

            ga = new GenetikAlgoritma(ia, kromozomsayisi, caprazlamaorani, 5, iterasyonsayisi, true);

            ga.Calistir(listBox1);

            if (Islemler.ilkatamabasarili == false)
            {
                MessageBox.Show("Daha iyi bir rota için farklı bir atama yöntemi kullanın\nSorun devam ederse;\nEkip sayısını artırabilirsiniz\nHasta gereksinimlerini kontrol edin\nHasta zaman periyodlarını kontrol edin");
                Islemler.ilkatamabasarili = true;
            }
            else
            {
                MessageBox.Show("Atamalar tamamlandı");
            }

            zaman = DateTime.Now;
            //        listBox1.Items.Add(zaman);

            //   NesilDegistir(iterasyonsayisi-1,listBox2,listBox3);

            ////nesil değiştir yazıldıktan sonra bloklandı
            //listBox2.Items.Clear();
            //listBox3.Items.Clear();
            //string rotalar = "Genel Fitness:";
            //rotalar += ga.populasyon.kromozomListesi[0].fitness.ToString();
            //listBox2.Items.Add(rotalar);
            //foreach (Rota myrota in ga.populasyon.kromozomListesi[0].rotaListesi)
            //{
            //    listBox3.Items.Add("--- " + myrota.ekip.ekipID.ToString() + " ---");

            //    rotalar = "rota fit:" + myrota.rotaceza.ToString();
            //    rotalar += " ekp:" + myrota.ekip.ekipID.ToString();
            //    rotalar += " Güz:";
            //    foreach (Gen mygen in myrota.ziyaretSirasi)
            //    {
            //        rotalar += "-" + mygen.hasta.hastaID.ToString();
            //        rotalar += "(" + mygen.atandigiTimeWindow.t1.ToString() + ":" + mygen.atandigiTimeWindow.t2.ToString() + ";" + mygen.genCeza.ToString() + ")";
            //        if (mygen.hasta.hastaID != 0) listBox3.Items.Add(mygen.hasta.hastaID);
            //    }
            //    listBox2.Items.Add(rotalar);
            //}
        }
Example #7
0
        private void button4_Click(object sender, EventArgs e)
        {
            //Islemler.CezaPuanlariniBelirle();
            //int a = Islemler.CezaPuanlari[Cezalar.hataliSkill];

            //MessageBox.Show(a.ToString());
            //return;

            listBox1.Items.Clear();
            IlkAtamaYontem atamayontem         = IlkAtamaYontem.bestfitteam;
            int            populasyonbuyuklugu = 100;

            //  listBox1.Items.Add(atamayontem.ToString());
            List <Kromozom> populasyon = new List <Kromozom>();

            DateTime zaman = DateTime.Now;
            //  listBox1.Items.Add(zaman.ToString());
            int sayac = 0;

            for (int i = 1; populasyon.Count < populasyonbuyuklugu; i++)
            {
                Kromozom k = new Kromozom(atamayontem);
                if (k.atanamayanhastalar.Count == 0)
                {
                    sayac++;
                    populasyon.Add(k);
                    for (int j = 0; j < k.rotaListesi.Count; j++)
                    {
                        string yazdir = sayac.ToString() + " " + "K";
                        yazdir += i.ToString() + "->";
                        yazdir += "R" + j.ToString() + ":";
                        for (int l = 0; l < k.rotaListesi[j].ziyaretSirasi.Count; l++)
                        {
                            yazdir += " -- " + k.rotaListesi[j].ziyaretSirasi[l].hasta.hastaID.ToString();
                            yazdir += "[";
                            yazdir += k.rotaListesi[j].ziyaretSirasi[l].atandigiTimeWindow.t1.ToString();
                            yazdir += "-";
                            yazdir += k.rotaListesi[j].ziyaretSirasi[l].atandigiTimeWindow.t2.ToString();
                            yazdir += "]";
                        }
                        listBox1.Items.Add(yazdir);
                    }
                }
            }
            zaman = DateTime.Now;
            //  listBox1.Items.Add(zaman.ToString());


            return;

            Rota r1 = new Rota();

            r1.ekip = Islemler.ekipListGun[0];

            foreach (Hasta myhasta in Islemler.hastaListGun)
            {
                if (myhasta.hastaID == 0)
                {
                    continue;
                }
                r1.AtamaYap(myhasta);
            }
            foreach (Gen mygen in r1.ziyaretSirasi)
            {
                string deger = mygen.hasta.hastaID.ToString();
                deger += ">>";
                deger += mygen.atandigiTimeWindow.t1.ToString();
                deger += "-";
                deger += mygen.atandigiTimeWindow.t2.ToString();
                deger += ".........." + mygen.hasta.timeWindow.t1 + "-" + mygen.hasta.timeWindow.t2;
                // listBox1.Items.Add(deger);
            }
        }
        private void button7_Click(object sender, EventArgs e)
        {
            secim_ga_gredy = 1;
            listBox1.Items.Clear();
            listBox2.Items.Clear();
            listBox3.Items.Clear();
            Islemler.atanamayanHastalarListesi.Clear();
            DateTime zaman = DateTime.Now;

            label9.Text = zaman.ToString();

            Kromozom.IDSifirla();
            IlkAtamaYontem ia = IlkAtamaYontem.firstfit;

            if (comboBox1.Text == "firstfit")
            {
                ia = IlkAtamaYontem.firstfit;
            }
            else if (comboBox1.Text == "bestfitperiod")
            {
                ia = IlkAtamaYontem.bestfitperiod;
            }
            else if (comboBox1.Text == "bestfitteam")
            {
                ia = IlkAtamaYontem.bestfitteam;
            }

            int kromozomsayisi = 0;

            try
            {
                kromozomsayisi = Int32.Parse(kromozomsayisiTxt.Text);
            }
            catch
            {
                MessageBox.Show("Kromozom sayısı değeri sayı olmalıdır");
                return;
            }

            int caprazlamaorani = 0;

            try
            {
                caprazlamaorani = Int32.Parse(caprazlamasayisiTxt.Text);
            }
            catch
            {
                MessageBox.Show("Çaprazlama oranı sayı olmalıdır");
                return;
            }

            int iterasyonsayisi = 0;

            try
            {
                iterasyonsayisi = Int32.Parse(iterasyonsayisiTxt.Text);
            }
            catch
            {
                MessageBox.Show("İterasyon sayısı degeri sayı olmalıdır");
                return;
            }

            bool elitizmeniyi = true;
            //if (comboBox3.SelectedIndex==0)//ilk deper en iyi seçimine karşılık geliyor
            //    elitizmeniyi = true;
            //else
            //    elitizmeniyi = false;

            string caprazlasecim = comboBox3.Text;

            ga = new GenetikAlgoritma(ia, kromozomsayisi, caprazlamaorani, caprazlasecim, 5, iterasyonsayisi, elitizmeniyi);

            ga.Calistir(listBox1);

            zaman = DateTime.Now;

            if (Islemler.ilkatamabasarili == false)
            {
                string mesaj = "İstenen Kromozom sayısı:" + ga.populasyon.populasyonBuyukluk.ToString();
                mesaj += "\n" + "İlk atamada oluşturulan Kromozom sayısı:" + Islemler.ilkatamaKromozomSayisi.ToString();
                mesaj += "\nDaha iyi bir rota için farklı bir atama yöntemi kullanın\nSorun devam ederse;\nEkip sayısını artırabilirsiniz\nHasta gereksinimlerini kontrol edin\nHasta zaman periyodlarını kontrol edin";
                MessageBox.Show(mesaj);
                Islemler.ilkatamabasarili = true;

                //atamalar yapılamadı atanamayan hastaları yazdır
            }
            else
            {
                MessageBox.Show("Atamalar tamamlandı");
            }



            if (ga.populasyon.kromozomListesi.Count == 0)
            {
                return;
            }

            label6.Text = listBox1.Items[listBox1.Items.Count - 1].ToString();
            label7.Text = listBox1.Items[0].ToString();
            //        listBox1.Items.Add(zaman);

            //   NesilDegistir(iterasyonsayisi-1,listBox2,listBox3);

            ////nesil değiştir yazıldıktan sonra bloklandı
            //listBox2.Items.Clear();
            //listBox3.Items.Clear();
            //string rotalar = "Genel Fitness:";
            //rotalar += ga.populasyon.kromozomListesi[0].fitness.ToString();
            //listBox2.Items.Add(rotalar);
            //foreach (Rota myrota in ga.populasyon.kromozomListesi[0].rotaListesi)
            //{
            //    listBox3.Items.Add("--- " + myrota.ekip.ekipID.ToString() + " ---");

            //    rotalar = "rota fit:" + myrota.rotaceza.ToString();
            //    rotalar += " ekp:" + myrota.ekip.ekipID.ToString();
            //    rotalar += " Güz:";
            //    foreach (Gen mygen in myrota.ziyaretSirasi)
            //    {
            //        rotalar += "-" + mygen.hasta.hastaID.ToString();
            //        rotalar += "(" + mygen.atandigiTimeWindow.t1.ToString() + ":" + mygen.atandigiTimeWindow.t2.ToString() + ";" + mygen.genCeza.ToString() + ")";
            //        if (mygen.hasta.hastaID != 0) listBox3.Items.Add(mygen.hasta.hastaID);
            //    }
            //    listBox2.Items.Add(rotalar);
            //}

            label8.Text = zaman.ToString();
        }
        public bool Tamir(Kromozom myKromozom, int sabitRota)
        {
            //***Kromozom sınıfına yazıldı o çağrılıyor. Bu yüzden burası kullaılmıyor.***

            //kromozom tamiri için kullanıacaktır
            //kromozomdaki fazla olan hastaID leri bularak silecek,
            //eksik olanları ise ilk atama yöntemine göre rastgele ekleyecektir
            //sabitrota ile pas edilen rotadan silme işlemi yapılmayacaktır. bu rora yeni eklenen rotadır

            //kromozomdaki fazla hastalar bulunurak siliniyor
            //sabit rotadan silme yapılmayacak
            int[] hastaAtamaSayisi = new int[Islemler.hastaListGun.Count]; //hastaların atanma sayısını bulmak için, 0. hasta harriç, 0. hasta Sağlık merkezi
            foreach (Rota myrota in myKromozom.rotaListesi)
            {
                foreach (Gen mygen in myrota.ziyaretSirasi)                         //
                {
                    hastaAtamaSayisi[Islemler.hastaListGun.IndexOf(mygen.hasta)]++; //mygen.hasta.hastaID için herbir hastaID sinin ne kadar sayıda kullanıldığını sayar
                }
            }
            List <int> fazlaAtama = new List <int>();         //fazla atanan hastaların indisleri
            List <int> eksikAtama = new List <int>();         //eksik atanan hastaların indisleri
            for (int i = 1; i < hastaAtamaSayisi.Length; i++) //0. indiste Sağlık merkezi olduğundan 1 den başladı
            {
                if (hastaAtamaSayisi[i] > 1)                  //1 den büyük değer var ise,  değer=2 ise fazla atanmıştır
                {
                    fazlaAtama.Add(Islemler.hastaListGun[i].hastaID);
                }
                else if (hastaAtamaSayisi[i] < 1)//1 den küçük bbir değer varsa , değer=0 ise çaprazlama ile hasta kaybolmuştur
                {
                    eksikAtama.Add(Islemler.hastaListGun[i].hastaID);
                }
            }

            //fazla olan hastaları bulup o genleri rotalardan silen kodlar
            //döngü yapısı değiştirilebilir
            //fazla atama içinde hastalar arandı istenirse tersi de yapılabilir, rota içinde fazla atamalar aranabilir
            for (int i = 0; i < fazlaAtama.Count; i++)
            {
                for (int j = 0; j < myKromozom.rotaListesi.Count; j++)
                {
                    if (j == sabitRota)
                    {
                        continue;                                                               //sabitrota çapralama ile kromozoma dahil edildi bu rota silinmemmeli
                    }
                    for (int k = 1; k < myKromozom.rotaListesi[j].ziyaretSirasi.Count - 1; k++) //0. ve sonuncu genler sağlık merkezi
                    {
                        if (fazlaAtama[i] == myKromozom.rotaListesi[j].ziyaretSirasi[k].hasta.hastaID)
                        {
                            myKromozom.rotaListesi[j].ziyaretSirasi.RemoveAt(k);//fazla olan hastaya ait gen silindi
                        }
                    }
                }
            }

            //Eksik olan hastaların rotalara atanması işlemi yapılacak
            //atama sonunda atanamayan hasta listesinde hasta varsa bazı hastalar yerleşmemiş demektir
            //yerleşemeyen hastalar olması durumunda kromozomun tamiri mümkün olmamkıştır
            //tamir edilemeyen durumlarda geriye false değer döner
            myKromozom.ListedenAtamaYap(eksikAtama);//eksik olan mhastaların kromozoma atanmasını sağlar
            if (myKromozom.atanamayanhastalar.Count > 0)
            {
                return(false);//atanamayan hasta varsa eksik olan hastalardan bazıları yerleşmemiştir
            }
            return(true);
        }
        public int CaprazlaveEkle(Kromozom birey1, Kromozom birey2)
        {
            /*
             * birey1 ve birey2' nin kopyasını çıkartıyor,
             * daha sonra her iki kromozomda rastgele seçilen karşılıklı rotaları r0-r0, r1-r1 gibi yer değiştiriyor
             * yer değiştirme sonunda eksik ve fazla genleri düzeltmek için tamir operatörü çalışıyor
             * eğer tamir başarılı ekleyebildiği kromozom sayısını geriye dönüyor 0-1-2 değerlerinden birisini dönebilir
             */

            Kromozom     kopya1      = new Kromozom(birey1); //birey1 in tam bir kopyası alındı, ama idler farklı
            Kromozom     kopya2      = new Kromozom(birey2);
            CryptoRandom rnd         = new CryptoRandom();
            int          randomindex = rnd.Next(0, kopya1.rotaListesi.Count); //karşılıklı değişecek olan rotaların indisi, karşılıklı rotalar aynı ekib bilgisini içerir

            Rota r1 = kopya1.rotaListesi[randomindex];                        //rotakarın referansları saklandı
            Rota r2 = kopya2.rotaListesi[randomindex];

            kopya1.rotaListesi.RemoveAt(randomindex); //kromozomdan ilgili rota önceki kromozomdan silindi
            kopya2.rotaListesi.RemoveAt(randomindex);

            /*
             * önce rotalar karşılıklı olarak yer değiştirecek
             * sonra rotalardaki fazla ve eksik genler bulunarak tamir yapılacak
             * eğer tamir edilemez ise bu kromozom kullanılmayacak
             */
            kopya1.rotaListesi.Insert(randomindex, r2); //rotalar karşılıklı olarak yer değiştirdi
            kopya2.rotaListesi.Insert(randomindex, r1);

            //burada tamir fonksiyonunun çalışması gerekli
            //tekrarlı ve eksik genler bulunarak düzeltme yapılacak
            int eklenenyenikromozomsayisi = 0;

            if (kopya1.Tamir(randomindex))//eğer tamir başarılı oluyorsa populasyona eklenebilir.
            {
                //mutasyon uygulanmayacağından dolayı kapattım, mutasyonun bir etkisi olmadı
                //değişik oranlar için mutasyon denemeleri yapıldı bazen daha kötü sonuçlar verdi
                //if (rnd.NextDouble() <= 0.03) //eğer mutasyon olayı gerçekleşirse mutayon uyguluyor
                //{
                //    if (kopya1.Mutasyon(3))
                //    {
                //        kromozomListesi.Add(kopya1);
                //        eklenenyenikromozomsayisi++;
                //    }
                //}
                //else //mutayon ihtimali gerçekleşmez ise uygulamaz
                {
                    kromozomListesi.Add(kopya1);
                    eklenenyenikromozomsayisi++;
                }
            }

            if (kopya2.Tamir(randomindex))
            {
                //mutasyon uygulanmayacağından dolayı kapattım, mutasyonun bir etkisi olmadı
                //if (rnd.NextDouble() <= 0.03) //eğer mutasyon olayı gerçekleşirse mutayon uyguluyor
                //{
                //    if (kopya2.Mutasyon(3))
                //    {
                //        kromozomListesi.Add(kopya2);
                //        eklenenyenikromozomsayisi++;
                //    }
                //}
                //else //mutayon ihtimali gerçekleşmez ise uygulamaz
                {
                    kromozomListesi.Add(kopya2);
                    eklenenyenikromozomsayisi++;
                }
            }
            return(eklenenyenikromozomsayisi);
        }
        public void Caprazla2Grup_Olasilikli(int caprazlamaorani)
        {
            //caprazla ve ekle ile seçilen 2 kromozomu çaprazlayarak ekliyor.
            //2 ayrı grup yapıyor ve bu gruplardan rastgele seçerek çaprazlıyor
            //çaprazlama oranı 100 den büyük gönderilirse değer 100 kabul edilir
            if (caprazlamaorani > 100)
            {
                caprazlamaorani = 100;
            }
            CryptoRandom rnd        = new CryptoRandom();
            List <int>   listeGenel = new List <int>(); //genel kromozom listesi
            List <int>   liste1     = new List <int>(); //kromozomları 2 listeye bölecek
            List <int>   liste2     = new List <int>();

            FitnessHesapla();
            for (int i = 0; i < kromozomListesi.Count; i++)
            {
                listeGenel.Add(i);
            }
            for (int i = 0; i < kromozomListesi.Count - 1; i++)
            {
                for (int j = i + 1; j < kromozomListesi.Count; j++)
                {
                    if (kromozomListesi[i].fitness < kromozomListesi[j].fitness)
                    {
                        Kromozom gecici = kromozomListesi[i];
                        kromozomListesi[i] = kromozomListesi[j];
                        kromozomListesi[j] = gecici;
                    }
                }
            }
            int silmesayisi = (100 - caprazlamaorani) * kromozomListesi.Count() / 100;

            for (int i = 0; i < silmesayisi; i++)
            {
                int silinecekindis = rnd.Next(0, silmesayisi);
                silinecekindis = rnd.Next(0, silinecekindis + 1);
                listeGenel.RemoveAt(silinecekindis);
            }

            //genel listeden 1- çaprazlama oranı kadar eleman sil

            int dongusayisi = listeGenel.Count * caprazlamaorani / (100 * 2);//listedeki eleman sayısının yarısı

            int indis;

            for (int i = 0; i < dongusayisi; i++) //çaprazlama oranı 50 ise %25 elemanı liste1 atıyor, %25 i liste2 ye
            {
                indis = rnd.Next(0, listeGenel.Count);
                liste1.Add(listeGenel[indis]);
                listeGenel.Remove(indis);

                indis = rnd.Next(0, listeGenel.Count);
                liste2.Add(listeGenel[indis]);
                listeGenel.Remove(indis);
            }
            for (int i = 0; i < dongusayisi; i++)
            {
                Kromozom k1 = kromozomListesi[liste1[i]];
                Kromozom k2 = kromozomListesi[liste2[i]];
                CaprazlaveEkle(k1, k2);
            }
        }