示例#1
0
        public bool Mutasyon(int oran)
        {
            /*
             * Mutasyon denemelerinde ciddi bir etki göstermedi.
             * Sebep olarak zaten tamir olayı mutasyona benzer bir işlem gerçekleştiriyor
             * kromozomda mutasyon işlemi gerçekleştirecek
             * kaç gen silineceğine mutasyon oranı karar verecek, 50 gen için %1 ise 1 gen, %2 ise 1 gen, %5 ise 3 gen rastgele seçilerek silinecek
             * mutasyon işlemini sadece çocuk kromozomlara yapmayı deneyeceğiz
             * seçilen kromozomdan rastgele olarak bir gen seçerek  silecek ve tamir ile tekrar bu geni yerine koymaya çalışacak
             * eğer tamir başarılı olursa mutasyon başarılı olup kromozom populasyona eklenecek
             * eğer mutasyon sonunda genler tamir edilemez ise? normalde eski yerine eklenebilmesi gerekir populasyona eklenemeyecek
             */
            int          silinecekgensayisi = (int)Math.Ceiling(1.0 * (Islemler.hastaListGun.Count - 1) * oran / 100);
            CryptoRandom rnd = new CryptoRandom();

            while (silinecekgensayisi >= 1)
            {
                int  rotaId      = rnd.Next(0, rotaListesi.Count);
                Rota secilenrota = rotaListesi[rotaId];
                if (secilenrota.ziyaretSirasi.Count > 2)
                {
                    int secilengen = rnd.Next(1, secilenrota.ziyaretSirasi.Count - 1);
                    secilenrota.ziyaretSirasi.RemoveAt(secilengen);
                    silinecekgensayisi--;
                }
            }
            //silme işlemi tamamlandı artık kromozom tamire gönderilebilir
            if (Tamir(0))
            {
                return(true);         //tamir edebilmiş ise true döner, edememişse false dönecek. gödnerilen 0 değerinin bir önemi yok çünkü sadece ekleme yapacak
            }
            return(false);
        }
        //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);
            }
        }
示例#3
0
        private void HastaAtamasiYapBestFitPeriyod(List <int> myHastaList)
        {
            atanacakhastalar.Clear();

            if (myHastaList == null || myHastaList.Count == 0) //herhangi bir hasta listesi gelmemiş işe hepsi atanacak
            {
                foreach (Hasta hasta in Islemler.hastaListGun)
                {
                    if (hasta.hastaID == 0)
                    {
                        continue;                    // sağlık merkezini atama
                    }
                    int konum;
                    for (konum = 0; konum < atanacakhastalar.Count; konum++) //atama olasılığına göre liste yapıyor baştaki hastaların olasılığı daha yüksek
                    {
                        if (hasta.oncelik * hasta.bakimSuresi / (hasta.timeWindow.t2 - hasta.timeWindow.t1) > atanacakhastalar[konum].oncelik * atanacakhastalar[konum].bakimSuresi / (atanacakhastalar[konum].timeWindow.t2 - atanacakhastalar[konum].timeWindow.t1))
                        {
                            break;//konum uygun yere gelmiş ise for kırılır
                        }
                    }
                    atanacakhastalar.Insert(konum, hasta);//hasta atanma olasılığına göre uygun bir yere yerleştirildi
                }
            }
            //else //atanacak hastalistesi dışarıdan gödnerilmiş ise
            //    foreach (Hasta hasta in Islemler.hastaListGun)
            //    {
            //        if (hasta.hastaID == 0) continue;// sağlık merkezini atama
            //        int konum=0;//değer içerideki for döngüsünde değişiyor
            //        foreach(int hastaID in myHastaList)
            //            if(hastaID==hasta.hastaID)
            //                for (konum = 0; konum < atanacakhastalar.Count; konum++) //atama olasılığına göre liste yapıyor baştaki hastaların olasılığı daha yüksek
            //                {
            //                    if (hasta.oncelik * hasta.bakimSuresi / (hasta.timeWindow.t2 - hasta.timeWindow.t1) > atanacakhastalar[konum].oncelik * atanacakhastalar[konum].bakimSuresi / (atanacakhastalar[konum].timeWindow.t2 - atanacakhastalar[konum].timeWindow.t1))
            //                        break;//konum uygun yere gelmiş ise for kırılır
            //                }
            //        atanacakhastalar.Insert(konum, hasta);//hasta atanma olasılığına göre uygun bir yere yerleştirildi
            //    }
            else //atanacak hastalistesi dışarıdan gödnerilmiş ise
            {
                foreach (int hastaID in myHastaList)
                {
                    Hasta hasta = null;
                    for (int i = 0; i < Islemler.hastaListGun.Count; i++)
                    {
                        if (Islemler.hastaListGun[i].hastaID == hastaID)
                        {
                            hasta = Islemler.hastaListGun[i];
                            break;//hasta bilgisi bulundu
                        }
                    }
                    int konum;
                    for (konum = 0; konum < atanacakhastalar.Count; konum++) //atama olasılığına göre liste yapıyor baştaki hastaların olasılığı daha yüksek
                    {
                        if (hasta.oncelik * hasta.bakimSuresi / (hasta.timeWindow.t2 - hasta.timeWindow.t1) > atanacakhastalar[konum].oncelik * atanacakhastalar[konum].bakimSuresi / (atanacakhastalar[konum].timeWindow.t2 - atanacakhastalar[konum].timeWindow.t1))
                        {
                            break;//konum uygun yere gelmiş ise for kırılır
                        }
                    }
                    atanacakhastalar.Insert(konum, hasta);//hasta atanma olasılığına göre uygun bir yere yerleştirildi
                }
            }

            CryptoRandom rnd = new CryptoRandom();

            Rota atanacagirota;

            while (atanacakhastalar.Count != 0)
            {
                int rnd1     = rnd.Next(0, atanacakhastalar.Count); //0-count-1 aralığında üretir
                int rndhasta = rnd.Next(0, rnd1 + 1);               //liste başındaki bireylerin seçilme şansını arttırmak için ilk seçilen değer ile 0 arasında yeni bir konum

                Hasta secilenHasta = atanacakhastalar[rndhasta];

                List <int> atanabilecekrotalar = new List <int>();
                for (int i = 0; i < rotaListesi.Count; i++)
                {
                    atanabilecekrotalar.Add(i);
                }
                bool atadim = false;
                while (atanabilecekrotalar.Count != 0)
                {
                    int rndrota = rnd.Next(0, atanabilecekrotalar.Count);
                    atanacagirota = _rotaListesi[rndrota];                //atanması için rastgele rota seçildi
                    atadim        = atanacagirota.AtamaYap(secilenHasta); //hasta rotaya atanmış ise true döner
                    if (atadim)
                    {
                        break;                             //rotaya atanmış ise while ı kır
                    }
                    atanabilecekrotalar.RemoveAt(rndrota); //rotaya atanamadı ise o rotayı sil diğer rotlara bak
                }
                if (!atadim)                               //hasta herhangi bir rotaya atanmadıysa
                {
                    atanamayanhastalar.Add(secilenHasta);
                    return;                          //herhangi bir hasta rotaya atanamadıysa diğerlerine bakmak gereksiz
                }
                atanacakhastalar.RemoveAt(rndhasta); //seçilen hastayı tekrar atamasın diye listeden çıkar
            }
        }
示例#4
0
        private void HastaAtamasiYapBestFitEkip(List <int> myHastaList)
        {
            atanacakhastalar.Clear();
            if (myHastaList == null || myHastaList.Count == 0) //herhangi bir hasta listesi gelmemiş işe hepsi atanacak
            {
                foreach (Hasta hasta in Islemler.hastaListGun)
                {
                    if (hasta.hastaID == 0)
                    {
                        continue;                    // sağlık merkezini atama
                    }
                    atanacakhastalar.Add(hasta);
                }
            }
            else //atama yapılacak hasta listesi dışarıdan gönderildi ise sadece o hastalar için atama yapacak
            {
                foreach (Hasta hasta in Islemler.hastaListGun)
                {
                    if (hasta.hastaID == 0)
                    {
                        continue;                    // sağlık merkezini atama
                    }
                    foreach (int hastaID in myHastaList)
                    {
                        if (hastaID == hasta.hastaID)
                        {
                            atanacakhastalar.Add(hasta);
                        }
                    }
                }
            }

            //burada atanması gereken hasta listesi elde edildi, aşağıda bu listedeki hastaların ataması yapılacak

            CryptoRandom rnd   = new CryptoRandom();
            int          deger = 1;

            for (int s = 0; (atanacakhastalar.Count != 0 && s < hastaskilldongu); s++)
            {
                List <Hasta> altlist = new List <Hasta>();
                int          i       = 0;
                while (i < atanacakhastalar.Count)
                {
                    Hasta myhasta    = atanacakhastalar[i];
                    int   hastaskill = myhasta.skill;
                    if ((hastaskill & deger) == deger)//hasta skill değer ile AND yapıldı
                    {
                        altlist.Add(myhasta);
                        atanacakhastalar.RemoveAt(i);
                    }
                    else
                    {
                        i++;//kayıt silinirse bir geri geleceğinden sadece silmediğimizde artacak
                    }
                }
                deger *= 2;
                while (altlist.Count > 0)
                {
                    List <int> atanabilecekrotalar = new List <int>();
                    for (int j = 0; j < rotaListesi.Count; j++)
                    {
                        atanabilecekrotalar.Add(j);
                    }
                    bool atadim = false;

                    Rota  atanacagirota;
                    int   rndhasta     = rnd.Next(0, altlist.Count);//0-count-1 aralığında üretir
                    Hasta secilenHasta = altlist[rndhasta];
                    while (atanabilecekrotalar.Count != 0)
                    {
                        int rndrota = rnd.Next(0, atanabilecekrotalar.Count);
                        atanacagirota = _rotaListesi[rndrota];                //atanması için rastgele rota seçildi
                        atadim        = atanacagirota.AtamaYap(secilenHasta); //hasta rotaya atanmış ise true döner
                        if (atadim)
                        {
                            break;                             //rotaya atanmış ise while ı kır
                        }
                        atanabilecekrotalar.RemoveAt(rndrota); //rotaya atanamadı ise o rotayı sil diğer rotlara bak
                    }
                    if (!atadim)                               //hasta herhangi bir rotaya atanmadıysa
                    {
                        atanamayanhastalar.Add(secilenHasta);
                        return;                 //herhangi bir hasta rotaya atanamadıysa diğerlerine bakmak gereksiz
                    }
                    altlist.RemoveAt(rndhasta); //seçilen hastayı tekrar atamasın diye listeden çıkar
                }
            }
        }
示例#5
0
        private void HastaAtamasiYapFirsfit(List <int> myHastaList)
        {
            atanacakhastalar.Clear();
            if (myHastaList == null || myHastaList.Count == 0) //herhangi bir hasta listesi gelmemiş işe hepsi atanacak
            {
                foreach (Hasta hasta in Islemler.hastaListGun)
                {
                    if (hasta.hastaID == 0)
                    {
                        continue;                    // sağlık merkezini atama
                    }
                    atanacakhastalar.Add(hasta);
                }
            }
            else //atama yapılacak hasta listesi dışarıdan gönderildi ise sadece o hastalar için atama yapacak
            {
                foreach (Hasta hasta in Islemler.hastaListGun)
                {
                    if (hasta.hastaID == 0)
                    {
                        continue;                    // sağlık merkezini atama
                    }
                    for (int i = 0; i < myHastaList.Count; i++)
                    {
                        if (myHastaList[i] == hasta.hastaID)
                        {
                            atanacakhastalar.Add(hasta);
                        }
                    }
                }
            }

            //burada atanması gereken hasta listesi elde edildi, aşağıda bu listedeki hastaların ataması yapılacak
            CryptoRandom rnd = new CryptoRandom();

            Rota atanacagirota;

            while (atanacakhastalar.Count != 0)
            {
                int        rndhasta            = rnd.Next(0, atanacakhastalar.Count);//0-count-1 aralığında üretir
                Hasta      secilenHasta        = atanacakhastalar[rndhasta];
                List <int> atanabilecekrotalar = new List <int>();
                for (int i = 0; i < rotaListesi.Count; i++)
                {
                    atanabilecekrotalar.Add(i);
                }

                bool atadim = false;
                while (atanabilecekrotalar.Count != 0) //rastgele bir rotaı seçerek hastayı o rotaya atamaya çalışır
                {
                    int rndrota = rnd.Next(0, atanabilecekrotalar.Count);
                    atanacagirota = _rotaListesi[rndrota];                //atanması için rastgele rota seçildi
                    atadim        = atanacagirota.AtamaYap(secilenHasta); //hasta rotaya atanmış ise true döner
                    if (atadim)
                    {
                        break;                             //rotaya atanmış ise while ı kır
                    }
                    atanabilecekrotalar.RemoveAt(rndrota); //rotaya atanamadı ise o rotayı sil diğer rotlara bak
                }
                if (!atadim)                               //hasta herhangi bir rotaya atanmadıysa
                {
                    atanamayanhastalar.Add(secilenHasta);
                    return;                          //herhangi bir hasta rotaya atanamadıysa diğerlerine bakmak gereksiz
                }
                atanacakhastalar.RemoveAt(rndhasta); //seçilen hastayı tekrar atamasın diye listeden çıkar
            }
        }
        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);
            }
        }
示例#8
0
        private void HastaAtamasiYapBestFitPeriyod(List <int> myHastaList)
        {
            //atanacak hastalar bir list bu listede hastalar atanması gereken önceliğe göre yerleştirilmiş
            //liste oluşturulurken hastanın atanması istenen periyoda atanma olasılığına bakılıyor, önceliği yüksek olanlar daha öne gelebiliyor

            atanacakhastalar.Clear();

            if (myHastaList == null || myHastaList.Count == 0) //herhangi bir hasta listesi gelmemiş işe hepsi atanacak
            {
                foreach (Hasta hasta in Islemler.hastaListGun)
                {
                    if (hasta.hastaID == 0)
                    {
                        continue;                    // sağlık merkezini atama
                    }
                    int konum;
                    for (konum = 0; konum < atanacakhastalar.Count; konum++) //atama olasılığına göre liste yapıyor baştaki hastaların olasılığı daha yüksek
                    {
                        if (hasta.oncelik * hasta.bakimSuresi / (hasta.timeWindow.t2 - hasta.timeWindow.t1) > atanacakhastalar[konum].oncelik * atanacakhastalar[konum].bakimSuresi / (atanacakhastalar[konum].timeWindow.t2 - atanacakhastalar[konum].timeWindow.t1))
                        {
                            break;//konum uygun yere gelmiş ise for kırılır
                        }
                    }
                    atanacakhastalar.Insert(konum, hasta);//hasta atanma olasılığına göre uygun bir yere yerleştirildi
                }
            }
            else //atanacak hastalistesi dışarıdan gödnerilmiş ise
            {
                foreach (int hastaID in myHastaList)
                {
                    Hasta hasta = null;
                    for (int i = 0; i < Islemler.hastaListGun.Count; i++)
                    {
                        if (Islemler.hastaListGun[i].hastaID == hastaID)
                        {
                            hasta = Islemler.hastaListGun[i];
                            break;//hasta bilgisi bulundu
                        }
                    }
                    int konum;
                    for (konum = 0; konum < atanacakhastalar.Count; konum++) //atama olasılığına göre liste yapıyor baştaki hastaların olasılığı daha yüksek
                    {
                        //hastayı listedeki 1. hasta ile karşılaştırıp ondan daha öncelikli ise onun önüne ekler, bu şekilde önceki her hasta ile mukayeseye devam eder
                        if (hasta.oncelik * hasta.bakimSuresi / (hasta.timeWindow.t2 - hasta.timeWindow.t1) > atanacakhastalar[konum].oncelik * atanacakhastalar[konum].bakimSuresi / (atanacakhastalar[konum].timeWindow.t2 - atanacakhastalar[konum].timeWindow.t1))
                        {
                            break;//konum uygun yere gelmiş ise for kırılır
                        }
                    }
                    atanacakhastalar.Insert(konum, hasta);//hasta atanma olasılığına göre uygun bir yere yerleştirildi
                }
            }

            CryptoRandom rnd = new CryptoRandom();

            Rota atanacagirota;

            while (atanacakhastalar.Count != 0)
            {
                //rnd1 10 ise, rnd 0-10 aralığında olacaktır bu yöntem baştaki hastaların seçilme şansını artırır.
                int rnd1     = rnd.Next(0, atanacakhastalar.Count); //0-count-1 aralığında üretir
                int rndhasta = rnd.Next(0, rnd1 + 1);               //liste başındaki bireylerin seçilme şansını arttırmak için ilk seçilen değer ile 0 arasında yeni bir konum

                Hasta secilenHasta = atanacakhastalar[rndhasta];

                List <int> atanabilecekrotalar = new List <int>();
                for (int i = 0; i < rotaListesi.Count; i++)
                {
                    atanabilecekrotalar.Add(rotaListesi[i].ekip.ekipID);
                }
                bool atadim = false;
                while (atanabilecekrotalar.Count != 0)
                {
                    int rndrota = rnd.Next(0, atanabilecekrotalar.Count);
                    atanacagirota = EkibinRotasiniBul(atanabilecekrotalar[rndrota]); //atanması için rastgele rota seçildi
                    atadim        = atanacagirota.AtamaYap(secilenHasta);            //hasta rotaya atanmış ise true döner
                    if (atadim)
                    {
                        break;                             //rotaya atanmış ise while ı kır
                    }
                    atanabilecekrotalar.RemoveAt(rndrota); //rotaya atanamadı ise o rotayı sil diğer rotlara bak
                }
                if (!atadim)                               //hasta herhangi bir rotaya atanmadıysa
                {
                    atanamayanhastalar.Add(secilenHasta);
                    return;                          //herhangi bir hasta rotaya atanamadıysa diğerlerine bakmak gereksiz
                }
                atanacakhastalar.RemoveAt(rndhasta); //seçilen hastayı tekrar atamasın diye listeden çıkar
            }
        }
示例#9
0
        private void HastaAtamasiYapBestFitEkip(List <int> myHastaList)
        {
            //skillmap değiştiğinden dolayı bu yordam değiştirildi,
            //bu hali ile hasta  skill gereksiniminde her bit için en kıt kaynağa sahip olanlar  hasta nesnesinde belli
            //hasta.ekipihtiyacsira ya göre küçükten büyüğe sıralanacak ve öncelik öndeki hastalarda olacak şekilde seçim yapılacak
            atanacakhastalar.Clear();
            if (myHastaList == null || myHastaList.Count == 0) //herhangi bir hasta listesi gelmemiş işe hepsi atanacak
            {
                foreach (Hasta hasta in Islemler.hastaListGun)
                {
                    if (hasta.hastaID == 0)
                    {
                        continue;                    // sağlık merkezini atama
                    }
                    atanacakhastalar.Add(hasta);
                }
            }
            else //atama yapılacak hasta listesi dışarıdan gönderildi ise sadece o hastalar için atama yapacak
            {
                foreach (Hasta hasta in Islemler.hastaListGun)
                {
                    if (hasta.hastaID == 0)
                    {
                        continue;                    // sağlık merkezini atama
                    }
                    foreach (int hastaID in myHastaList)
                    {
                        if (hastaID == hasta.hastaID)
                        {
                            atanacakhastalar.Add(hasta);
                        }
                    }
                }
            }

            //burada atanması gereken hasta listesi elde edildi, aşağıda bu listedeki hastaların ataması yapılacak
            for (int i = 0; i < atanacakhastalar.Count - 1; i++)
            {
                for (int j = i + 1; j < atanacakhastalar.Count; j++)
                {
                    if (atanacakhastalar[i].ekipihtiyacsira > atanacakhastalar[j].ekipihtiyacsira)
                    {
                        //hastalarsıraya konuyor
                        Hasta gecici = atanacakhastalar[i];
                        atanacakhastalar[i] = atanacakhastalar[j];
                        atanacakhastalar[j] = gecici;
                    }
                }
            }

            CryptoRandom rnd = new CryptoRandom();

            Rota atanacagirota;

            while (atanacakhastalar.Count != 0)
            {
                //rnd1 10 ise, rnd 0-10 aralığında olacaktır bu yöntem baştaki hastaların seçilme şansını artırır.
                int rnd1     = rnd.Next(0, atanacakhastalar.Count); //0-count-1 aralığında üretir
                int rndhasta = rnd.Next(0, rnd1 + 1);               //liste başındaki bireylerin seçilme şansını arttırmak için ilk seçilen değer ile 0 arasında yeni bir konum

                Hasta secilenHasta = atanacakhastalar[rndhasta];

                List <int> atanabilecekrotalar = new List <int>();
                for (int i = 0; i < rotaListesi.Count; i++)
                {
                    atanabilecekrotalar.Add(rotaListesi[i].ekip.ekipID);
                }
                bool atadim = false;
                while (atanabilecekrotalar.Count != 0)
                {
                    int rndrota = rnd.Next(0, atanabilecekrotalar.Count);
                    atanacagirota = EkibinRotasiniBul(atanabilecekrotalar[rndrota]); //atanması için rastgele rota seçildi
                    atadim        = atanacagirota.AtamaYap(secilenHasta);            //hasta rotaya atanmış ise true döner
                    if (atadim)
                    {
                        break;                             //rotaya atanmış ise while ı kır
                    }
                    atanabilecekrotalar.RemoveAt(rndrota); //rotaya atanamadı ise o rotayı sil diğer rotlara bak
                }
                if (!atadim)                               //hasta herhangi bir rotaya atanmadıysa
                {
                    atanamayanhastalar.Add(secilenHasta);
                    return;                          //herhangi bir hasta rotaya atanamadıysa diğerlerine bakmak gereksiz
                }
                atanacakhastalar.RemoveAt(rndhasta); //seçilen hastayı tekrar atamasın diye listeden çıkar
            }
        }