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