public void AtamalariYap_onceki2() { //daha önce yazılmıştı artık kullanılmıyor //ekip seç ekipe ait rotayı doldur sonra bu ekibi sil, diğer ekibi seç while (_ekipList.Count > 0 && _hastaList.Count > 1) { Ekip secilenekip = EkipSec(); //en uygun ekibi seçer Rota myrota = new Rota(); //yeni bir rota başlattı myrota.ekip = secilenekip; //rotanın ekibi atandı int periyod = myrota.ekip.sabahMesai.t1; //rota için başlangıç periyodu, ekibin sabah mesai başlangıcı int nokta = 0; //rota başlangıç noktası her zaman 0. nokta, 0 sağlık merkezi int i = 0; //hasta listesindeki ilk hasta Id si bool ziyaretedilebilirvarmi = true; while (ziyaretedilebilirvarmi) //seçilen ekip için uygun noktaları bularak gredy olarak atamalar yapacak { ziyaretedilebilirvarmi = false; //ziyaret edilebilir nokta bulamaz ise false kalsın diye güncellendi int fark = Islemler.M; //fark değeri başlangıcta büyük bir değer alındı int t1 = 0; //atama yapılacak zç1 değeri int t2 = 0; //zç2 //aşağıdaki for tüm hasta listesini dolaşarak atama için en uygun hastayı bulur // atanabilecek hasta bulursa ziyaretedilebilirvarmı true olur for (int j = 1; j < _hastaList.Count; j++)//hasta listesi-1 kadar döngü ile mevcut hastalar taranıyor { if (i == j) { continue; //en son hasta } int m1 = periyod + Islemler.UzaklikGetir(_hastaList[i].hastaID, _hastaList[j].hastaID).dakika + _hastaList[j].bakimSuresi; int m2 = m1 + Islemler.UzaklikGetir(_hastaList[j].hastaID, _hastaList[0].hastaID).dakika; //son noktadan sonra sağlık merkezine gidilebiliyormu bool skillyeterli = (myrota.ekip.skill & _hastaList[j].skill) == _hastaList[j].skill; //skill ziayaret için yeteliyse true, değilse false bool mesaisarkmasiyok = !myrota.MesaiSarkmasiVar(t1, t2); //rotada bu t1, t2 atamasında mesai sarkması varmı bakılıyor, dönen değer değillendi if (skillyeterli && mesaisarkmasiyok && m1 < _hastaList[j].timeWindow.t2 && m2 < myrota.ekip.ogleMesai.t2) { //koşul sağlanmış ise ziyaret edilebilece bir hasta noktası var demektir. bu duurmda farklara bakılacak ziyaretedilebilirvarmi = true; //ziyaret edilebilir bir nokta bulunduğundan true, hiç nokta bulamaz ise false olarak kalmaya devam edecek int yenifark = _hastaList[j].timeWindow.t1 - (periyod + Islemler.UzaklikGetir(_hastaList[i].hastaID, _hastaList[j].hastaID).dakika); if (yenifark < fark) { fark = yenifark; nokta = j; //en düşük farka sahip olan noktayı bulmak için fark değei küçüldüğünde nokta güncelleniyor if (m1 > _hastaList[j].timeWindow.t1) //ziyaret edilecek hastaya ulaşıldığında ziyaret başlayacak { t1 = m1; //eğer hastaya ulaşma zamanı ile hastanın istediği zç1 kıyaslayarak büyük olanını seçiyor } else { t1 = _hastaList[j].timeWindow.t1; //eğer hastaya ulaşma zamanı t1 den önce ise ziyaret t1 de başlayacak, bu durumda ekip beklemiş sayılır } t2 = t1 + _hastaList[j].bakimSuresi; //ziyaret bitişi için gereken t2 zamanı, t2=t1+bakim } } } if (ziyaretedilebilirvarmi) //rotaya yeni bir hasta daha eklenebilir mi? { //****burada nokta değerine ait hastayı rotaya ekle**** myrota.YeniNoktaEkleAraya(myrota.ziyaretSirasi.Count - 1, _hastaList[nokta], t1, t2); //fark değiri en düşük olan hasta rotaya eklendi periyod = t2; //t2 de yeni yapılan ziyaretin bitişi var _hastaList.RemoveAt(nokta); //hasta rotaya eklendiği için ziyaret listesinden çıkarıldı i = nokta; //arama başlangıç için yeni i değeri nokta oldu } else { //ziyaret edilebilecek hasta bulunamadı demektir //bu durumda son rota için artık yeni hasta eklenemez anlamına gelir //bu rota rotalistesine eklenecek //seçilen ekip ekip listten silinecek _rotaList.Add(myrota); //myrota için artık atanacak yeni hasta yok demektir _ekipList.Remove(secilenekip); //myrota için belirlenen ekip için atanacak yeni hasta yok tekrar seçilmemesi çin listeden silindi } } } if (_hastaList.Count <= 1) { MessageBox.Show("atamalar tamam"); } else { MessageBox.Show("atamalar yapılamadı"); } }
public void AtamalariYap_onceki() { //ekip seç ekipe ait rotayı doldur sonra bu ekibi sil, diğer ekibi seç bool atamalartamam = false; while (true) { Ekip secilenekip = EkipSec(); Rota myrota = new Rota(); myrota.ekip = secilenekip; int periyod = myrota.ekip.sabahMesai.t1; int nokta = 0; //rota başlangıç noktası her zaman 0. nokta, 0 sağlık merkezi int i = 0; //hasta listesindeki ilk hasta Id si bool ziyaretedilebilirvarmi = false; int fark = Islemler.M; int t1 = 0; //zç1 int t2 = 0; //zç2 //aşağıdaki for tüm hasta listesini dolaşarak atama için en uygun hastayı bulur // atanabilecek hasta bulursa ziyaretedilebilirvarmı true olur for (int j = 1; j < _hastaList.Count; j++) { int m1 = periyod + Islemler.UzaklikGetir(_hastaList[i].hastaID, _hastaList[j].hastaID).dakika + _hastaList[j].bakimSuresi; int m2 = m1 + Islemler.UzaklikGetir(_hastaList[j].hastaID, _hastaList[0].hastaID).dakika; if (m1 > _hastaList[j].timeWindow.t1) //ziyaret edilecek hastaya ulaşıldığında ziyaret başlayacak { t1 = m1; //eğer hastaya ulaşma zamanı t1(ZÇ1) den daha sonra ise } else { t1 = _hastaList[j].timeWindow.t1; //eğer hastaya ulaşma zamanı t1 den önce ise ziyaret t1 de başlayacak } t2 = t1 + _hastaList[j].bakimSuresi; //ziyaret bitişi gereken t2 zamanı, t2=t1+bakim bool skillyeterli = (myrota.ekip.skill & _hastaList[j].skill) != _hastaList[j].skill; bool mesaisarkmasiyok = !myrota.MesaiSarkmasiVar(t1, t2); //rotada bu t1, t2 atamasında mesai sarkması varmı bakılıyor, dönen değer değillendi if (skillyeterli && mesaisarkmasiyok && m1 < _hastaList[j].timeWindow.t2 && m2 < myrota.ekip.ogleMesai.t2) { ziyaretedilebilirvarmi = true; int yenifark = _hastaList[j].timeWindow.t1 - (periyod + Islemler.UzaklikGetir(i, _hastaList[j].hastaID).dakika); if (yenifark < fark) { fark = yenifark; nokta = j;//nokta dizinin indisi bu indissteki değeri rotaya eklemek gerek } } } if (ziyaretedilebilirvarmi) //rotaya yeni bir hasta daha eklenebilir mi? { //****burada nokta değerine ait hastayı rotaya ekle**** myrota.YeniNoktaEkleAraya(myrota.ziyaretSirasi.Count - 1, _hastaList[nokta], t1, t2); if (_hastaList[i].timeWindow.t1 > periyod + Islemler.UzaklikGetir(_hastaList[i].hastaID, _hastaList[nokta].hastaID).dakika) { periyod = _hastaList[i].timeWindow.t1; } else { periyod = periyod + Islemler.UzaklikGetir(_hastaList[i].hastaID, _hastaList[nokta].hastaID).dakika; } _hastaList.RemoveAt(nokta); //hasta rotaya eklendiği için listeden çıkarıldı i = nokta; //arama başlangıç için yeni i değeri nokta oldu } else { //ziyaret edilebilecek hasta bulunamadı demektir //bu durumda son rota için artık yeni hasta eklenemez anlamına gelir //bu rota rotalistesine eklenecek //seçilen ekip ekip listten silinecek //eğer hala listede hasta varsa count>1 (0 nolu hasta sağlık merkezi o silinmiyor), while dönmeye devam edecek _rotaList.Add(myrota); //myrota için artık atanacak yeni hasta yok demektir _ekipList.Remove(secilenekip); //myrota için belirlenen ekip için atanacak yeni hasta yok tekrar seçilmemesi çin listeden silindi //atanacak hasta yoksa count=1 atama tamamlanmış demektir break ile çıkılır //atanacak hasta kaldıysa fakat ekiplist te ekip kalmadıyda atamalar başarılamamış demektir break ile çıkılır //atanacak hasta varsa fakat ekiplistte ekip varsa yeni rota başlatılır, üstteki 2 durum değilse bu duurmdur if (_hastaList.Count <= 1) { atamalartamam = true; break;//while kırıldı } if (_hastaList.Count > 1 && _ekipList.Count == 0) { atamalartamam = false; break;//while kırıldı atamalar tamamlanamadı } //akış buraya gelmiş ise while dönmeye devam eder } } if (atamalartamam) { MessageBox.Show("atamalar tamam"); } else { MessageBox.Show("atamalar yapılamadı"); } }