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); }
private void EkipleriAta() //o gün çalışacak olan ekipler için başlangıç rotası { for (int i = 0; i < Islemler.ekipListGun.Count; i++) { Rota myrota = new Rota(); myrota.ekip = Islemler.ekipListGun[i]; rotaListesi.Add(myrota); } }
public Rota(Rota modelRota) //kopya çıkartmak için kullanılır { //model rotanın bir kopyasını çıkartır this._rotaceza = modelRota.rotaceza; this.ekip = modelRota.ekip; foreach (Gen kopyaGen in modelRota.ziyaretSirasi) { this.ziyaretSirasi.Add(new Gen(kopyaGen)); } }
// Int64 gunId; private List <Rota> RotaListesi() { List <Rota> myRotaList = new List <Rota>(); //grid1 sonuçlar //grid2 rotalar //grid 3 genler var, //rotaların hepsi grid 2 den döngü ile alınacak, sonra bu döngüde ziyaret listesi bir reader ile çekilecek //oluşturulan rotalar rotalistesine add yapılacak for (int i = 0; i < dataGridView2.Rows.Count - 1; i++) { int rotaID = (int)dataGridView2.Rows[i].Cells[0].Value; Rota myrota = new Rota(); myrota.ziyaretSirasi.Clear();//rota nesnesi doğası gereği her seferinde kendisi 2 adet gen ekliyor onlar silindi Ekip myekip = new Ekip(); myekip.ekipID = (int)dataGridView2.Rows[i].Cells[3].Value; myrota.ekip = myekip; myrota.rotaceza = (int)dataGridView2.Rows[i].Cells[4].Value; Uzaklik2 myuzaklik = new Uzaklik2(); myuzaklik.metre = (int)dataGridView2.Rows[i].Cells[5].Value; myuzaklik.dakika = (int)dataGridView2.Rows[i].Cells[6].Value; myrota.toplamUzaklik = myuzaklik; string sqlcumle = "exec ZiyaretSirasigetir " + rotaID.ToString(); SqlCommand sqlkomut = new SqlCommand(); sqlkomut.Connection = Islemler.conn; sqlkomut.CommandText = sqlcumle; Islemler.conn.Open(); SqlDataReader drZiyaretler = sqlkomut.ExecuteReader(); while (drZiyaretler.Read()) { Gen mygen = new Gen(); Hasta myhasta = new Hasta(); myhasta.hastaID = (int)drZiyaretler[1]; myhasta.gosterID = (int)drZiyaretler[2]; myhasta.bakimSuresi = (int)drZiyaretler[5]; myhasta.konum.lat = (double)drZiyaretler[6]; myhasta.konum.lon = (double)drZiyaretler[7]; mygen.hasta = myhasta; mygen.atandigiTimeWindow.t1 = (int)drZiyaretler[3]; mygen.atandigiTimeWindow.t2 = (int)drZiyaretler[4]; myrota.ziyaretSirasi.Add(mygen); } drZiyaretler.Close(); myRotaList.Add(myrota); Islemler.conn.Close(); } return(myRotaList); }
//private void button8_Click(object sender, EventArgs e) //{ // string str = listBox1.Text; // int index1 = str.IndexOf("Iter:")+5; // int index2 = str.IndexOf("Fitn:"); // listBox2.Items.Clear(); // listBox3.Items.Clear(); // string rotalar = ""; // nesil = Int32.Parse(str.Substring(index1,index2-index1)); // NesilDegistir(nesil, listBox2, listBox3); // ////nesil değiştir yazıldıktan sonra kapatıldı // //foreach (Rota myrota in ga.IyiList[nesil].kromozom.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() + ")"; // // rotalar += "(" + mygen.atandigiTimeWindow.t1.ToString() + ":" + mygen.atandigiTimeWindow.t2.ToString() + ")"; // // if (mygen.hasta.hastaID != 0) listBox3.Items.Add(mygen.hasta.hastaID); // // } // // listBox2.Items.Add(rotalar); // //} //} private void RouteCiz(Rota myrota, Color renk, float kalemkalinlik) { GMapProviders.GoogleMap.ApiKey = Islemler.myKey; //var route=GMapProviders.GoogleMap. .GetRouteBetweenPoints(start, end, false, false, 1); map.Overlays.Clear(); MarkerEkleHepsi(Islemler.gunID); if (myrota.ziyaretSirasi.Count <= 2) { return; } MapRoute route = null; GMapOverlay routes = null; // map.Overlays.Clear(); // string hastalar = ""; GMapRoute r = null; for (int i = 0; i < myrota.ziyaretSirasi.Count - 1; i++) { PointLatLng start = new PointLatLng(myrota.ziyaretSirasi[i].hasta.konum.lat, myrota.ziyaretSirasi[i].hasta.konum.lon); PointLatLng end = new PointLatLng(myrota.ziyaretSirasi[i + 1].hasta.konum.lat, myrota.ziyaretSirasi[i + 1].hasta.konum.lon); try { route = GoogleMapProvider.Instance.GetRoute(start, end, false, true, 15); r = new GMapRoute(route.Points, myrota.ekip.ekipID.ToString()); } catch { MessageBox.Show("İnternet bağlantıı yok\nRota ön bellekten çizdirildi\nRotada eksik noktalar olabilir"); break; } r.Stroke.Width = kalemkalinlik; r.Stroke.Color = renk; routes = new GMapOverlay("routes"); routes.Routes.Add(r); // start = end; // end= new PointLatLng(myrota.ziyaretSirasi[i].hasta.konum.lat, myrota.ziyaretSirasi[i].hasta.konum.lon); map.Overlays.Add(routes); //map.Refresh(); //hastalar += myrota.ziyaretSirasi[i].hasta.hastaID.ToString() + "-"; } // map.Refresh(); map.Zoom = map.Zoom - 0.5; map.Zoom = map.Zoom + 0.5; // MessageBox.Show(hastalar); }
private void RouteCiz2(Rota myrota, Color renk) { //kullanılmıyor GMapProviders.GoogleMap.ApiKey = Islemler.myKey; //var route=GMapProviders.GoogleMap. .GetRouteBetweenPoints(start, end, false, false, 1); if (myrota.ziyaretSirasi.Count <= 2) { return; } MapRoute route2 = null; GMapOverlay routes2 = null; // map.Overlays.Clear(); string hastalar = ""; GMapRoute r2 = null; for (int i = 0; i < myrota.ziyaretSirasi.Count - 1; i++) { PointLatLng start = new PointLatLng(myrota.ziyaretSirasi[i].hasta.konum.lat, myrota.ziyaretSirasi[i].hasta.konum.lon); PointLatLng end = new PointLatLng(myrota.ziyaretSirasi[i + 1].hasta.konum.lat, myrota.ziyaretSirasi[i + 1].hasta.konum.lon); route2 = GoogleMapProvider.Instance.GetRoute(start, end, false, false, 15); r2 = new GMapRoute(route2.Points, myrota.ekip.ekipID.ToString()); r2.Stroke.Width = 3; r2.Stroke.Color = renk; routes2 = new GMapOverlay("routes"); routes2.Routes.Add(r2); start = end; // end= new PointLatLng(myrota.ziyaretSirasi[i].hasta.konum.lat, myrota.ziyaretSirasi[i].hasta.konum.lon); map.Overlays.Add(routes2); map.Refresh(); hastalar += myrota.ziyaretSirasi[i].hasta.hastaID.ToString() + "-"; } map.Refresh(); map.Zoom = map.Zoom - 1; map.Zoom = map.Zoom + 1; // MessageBox.Show(hastalar); }
//private void button8_Click(object sender, EventArgs e) //{ // string str = listBox1.Text; // int index1 = str.IndexOf("Iter:")+5; // int index2 = str.IndexOf("Fitn:"); // listBox2.Items.Clear(); // listBox3.Items.Clear(); // string rotalar = ""; // nesil = Int32.Parse(str.Substring(index1,index2-index1)); // NesilDegistir(nesil, listBox2, listBox3); // ////nesil değiştir yazıldıktan sonra kapatıldı // //foreach (Rota myrota in ga.IyiList[nesil].kromozom.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() + ")"; // // rotalar += "(" + mygen.atandigiTimeWindow.t1.ToString() + ":" + mygen.atandigiTimeWindow.t2.ToString() + ")"; // // if (mygen.hasta.hastaID != 0) listBox3.Items.Add(mygen.hasta.hastaID); // // } // // listBox2.Items.Add(rotalar); // //} //} private void RouteCiz(Rota myrota, Color renk) { GMapProviders.GoogleMap.ApiKey = ""; //var route=GMapProviders.GoogleMap. .GetRouteBetweenPoints(start, end, false, false, 1); map.Overlays.Clear(); MarkerEkleHepsi(Islemler.gunID); if (myrota.ziyaretSirasi.Count <= 2) { return; } MapRoute route = null; GMapOverlay routes = null; // map.Overlays.Clear(); string hastalar = ""; GMapRoute r = null; for (int i = 0; i < myrota.ziyaretSirasi.Count - 1; i++) { PointLatLng start = new PointLatLng(myrota.ziyaretSirasi[i].hasta.konum.lat, myrota.ziyaretSirasi[i].hasta.konum.lon); PointLatLng end = new PointLatLng(myrota.ziyaretSirasi[i + 1].hasta.konum.lat, myrota.ziyaretSirasi[i + 1].hasta.konum.lon); route = GoogleMapProvider.Instance.GetRoute(start, end, false, true, 15); r = new GMapRoute(route.Points, myrota.ekip.ekipID.ToString()); r.Stroke.Width = 2; r.Stroke.Color = renk; routes = new GMapOverlay("routes"); routes.Routes.Add(r); start = end; // end= new PointLatLng(myrota.ziyaretSirasi[i].hasta.konum.lat, myrota.ziyaretSirasi[i].hasta.konum.lon); map.Overlays.Add(routes); //map.Refresh(); //hastalar += myrota.ziyaretSirasi[i].hasta.hastaID.ToString() + "-"; } // map.Refresh(); map.Zoom = map.Zoom - 1; map.Zoom = map.Zoom + 1; // MessageBox.Show(hastalar); }
private void EkipleriAta() //o gün çalışacak olan ekipler için başlangıç rotası { for (int i = 0; i < Islemler.ekipListGun.Count; i++) { Rota myrota = new Rota(); Ekip myekip = Islemler.ekipListGun[i]; myrota.ekip = myekip; //sabah mesai ekibe göre ayarla myrota.ziyaretSirasi[0].atandigiTimeWindow.t1 = myekip.sabahMesai.t1; myrota.ziyaretSirasi[0].atandigiTimeWindow.t2 = myekip.sabahMesai.t1; //öğleden sonraki mesai ekibe göre ayarla myrota.ziyaretSirasi[myrota.ziyaretSirasi.Count - 1].atandigiTimeWindow.t1 = myekip.ogleMesai.t2; myrota.ziyaretSirasi[myrota.ziyaretSirasi.Count - 1].atandigiTimeWindow.t2 = myekip.ogleMesai.t2; rotaListesi.Add(myrota); } }
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); } }
public void AtamalariYap() { //ekip seç ekipe ait rotayı doldur sonra bu ekibi sil, diğer ekibi seç while (_ekipList.Count > 0 && _hastaList.Count > 1) //while ya hasta listesi biterse yada ataacak ekip kalmaz ise boşalır { Ekip secilenekip = EkipSec(); //en uygun ekibi seçer Rota myrota = new Rota(); //yeni bir rota başlattı myrota.ekip = secilenekip; //rotanın ekibi atandı if (myrota.ekip == null) { break; //programda runtime de bir hata olup ekip seçilemez ise kırılmasın diy eeklendi: algoritmaya bir etkisi yok } //ekip rotaya atandığı için rota başlangıç ve bitiş periyodları ekibe ait zaman periyodları olarak ayarlanıyor myrota.ziyaretSirasi[0].atandigiTimeWindow.t1 = secilenekip.sabahMesai.t1; //başlangıç noktası myrota.ziyaretSirasi[0].atandigiTimeWindow.t2 = secilenekip.sabahMesai.t1; myrota.ziyaretSirasi[myrota.ziyaretSirasi.Count - 1].atandigiTimeWindow.t1 = secilenekip.ogleMesai.t2; //bitiş noktası myrota.ziyaretSirasi[myrota.ziyaretSirasi.Count - 1].atandigiTimeWindow.t2 = secilenekip.ogleMesai.t2; 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 bool ziyaretedilebilirvarmi = true; int saglikmerkezi = 0; Hasta eskihasta = _hastaList[nokta]; 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 Hasta kararverilenhasta = null; 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 int atamaicint1 = 0; int atamaicint2 = 0; //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 { Hasta yenihasta = _hastaList[j]; if (eskihasta == yenihasta) { continue; //aynı hasta için işlem yapmamalı } int eskihastayenihastauzaklik = Islemler.UzaklikGetir(eskihasta.hastaID, yenihasta.hastaID).dakika; int yenihastasaglikmerkeziuzaklik = Islemler.UzaklikGetir(yenihasta.hastaID, saglikmerkezi).dakika; int m1 = periyod + eskihastayenihastauzaklik + yenihasta.bakimSuresi; int m2 = m1 + yenihastasaglikmerkeziuzaklik; //son noktadan sonra sağlık merkezine gidilebiliyormu bool skillyeterli = (myrota.ekip.skill & yenihasta.skill) == yenihasta.skill; //skill ziayaret için yeteliyse true, değilse false if (periyod + eskihastayenihastauzaklik > yenihasta.timeWindow.t1) //yeni hasta ziyaretinin başlaması gereken t1 değeri { t1 = periyod + eskihastayenihastauzaklik; } else { t1 = yenihasta.timeWindow.t1; } t2 = t1 + yenihasta.bakimSuresi; //yeni hasta t2 zamanı, hasta ziyaretinin bittiği time windows bool mesaisarkmasiyok = !myrota.MesaiSarkmasiVar2(t1, t2); //rotada bu t1, t2 atamasında mesai sarkması varmı bakılıyor, dönen değer değillendi if (skillyeterli && mesaisarkmasiyok && m1 <= yenihasta.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 = yenihasta.timeWindow.t1 - (periyod + eskihastayenihastauzaklik); //bu formül ekibin en az bekleme yapacağı hastayı seçer eğer negatif ise hasta ziyareti hasta zç1 başladıkatn sonra başlayacaktır if (yenifark < fark) { fark = yenifark; kararverilenhasta = yenihasta; nokta = j;//en düşük farka sahip olan noktayı bulmak için fark değei küçüldüğünde nokta güncelleniyor atamaicint1 = t1; atamaicint2 = t2; } } } if (ziyaretedilebilirvarmi) //rotaya yeni bir hasta daha eklenebilir mi? { //****burada nokta değerine ait hastayı rotaya ekle**** myrota.YeniNoktaEkleAraya(myrota.ziyaretSirasi.Count - 1, kararverilenhasta, atamaicint1, atamaicint2);//fark değiri en düşük olan hasta rotaya eklendi myrota.KaydirmaUygula(); periyod = atamaicint2; //t2 de yeni yapılan ziyaretin bitişi var eskihasta = kararverilenhasta; _hastaList.Remove(kararverilenhasta); //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 } } myrota.ToplamUzaklikHesapla(); } }
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ı"); } }
public void YeniRotaEkle(Rota yeniRota) { //rota listesine yenirota ile belirtilen rotayı ekler }
public void EkipCezaGuncelle(Rota rota) { /* ************ Yazması çok zahmetli bir yordam, değişiklik yapılacaksa dikkatli incele * eğer yavaş çalışmaya sebep olursa döngü yapısındki ifelse yapılarını elden geçir * Ekibe atanan ziyaret noktalarını tarayarak hatalı ve * istenmeyen noktaları cezalandırır, * fazla mesasi * istenmeyen periyod * öğle arası ihlaline bakar */ if (rota.ziyaretSirasi.Count <= 2)//rotada hasya yok demektir { return; } int fazlamesai = 0; int oglearasiihlali = 0; Gen ilkZiyaret = rota.ziyaretSirasi[1]; //ilk nokta Gen sonZiyaret = rota.ziyaretSirasi[rota.ziyaretSirasi.Count - 2]; //sonZiyaret nokta bool sabahmesaisivar = false; if (this.sabahMesai.t2 - sabahMesai.t1 > 0) { sabahmesaisivar = true; } bool oglemesaisivar = false; if (this.ogleMesai.t2 - ogleMesai.t1 > 0) { oglemesaisivar = true; } /* * ilk hasta ziyaretinin mesai başlamdan önce planlanması durumunu kontrol ediyor * aşağıdaki ilk if eğer ilk hasta sabah mesaisinde ise, * else if ise eğer ilk hasta öğle mesaisinde ise çalışır. * else if olaki ekibin hiç sabah mesaisi yoksa gideceği ilk hastanın öğle mesaisinden sonra olması gerekir * else if in çalışması için hastanın sabah mesaisini pas geçmesi gerek */ if (sabahmesaisivar && (this.sabahMesai.t1 + Islemler.UzaklikGetir(0, ilkZiyaret.hasta.hastaID).dakika > ilkZiyaret.atandigiTimeWindow.t1)) { fazlamesai += this.sabahMesai.t1 + Islemler.UzaklikGetir(0, ilkZiyaret.hasta.hastaID).dakika - ilkZiyaret.atandigiTimeWindow.t1; } else if (oglemesaisivar && (this.ogleMesai.t1 + Islemler.UzaklikGetir(0, ilkZiyaret.hasta.hastaID).dakika > ilkZiyaret.atandigiTimeWindow.t1)) { fazlamesai += this.ogleMesai.t1 + Islemler.UzaklikGetir(0, ilkZiyaret.hasta.hastaID).dakika - ilkZiyaret.atandigiTimeWindow.t1; } /* * son hasta ziyaretinin mesai bittikten sonra planlanması durumu * aşağığıdaki if, if else yukarıdaki yapıya benzer burada son ziyaret için mesai bitişi kontrol edildi * öğle mesaisi yoksa son hastanın sabah son mesai saatini aşmaması gerekir */ if (oglemesaisivar && (sonZiyaret.atandigiTimeWindow.t2 + Islemler.UzaklikGetir(sonZiyaret.hasta.hastaID, 0).dakika > this.ogleMesai.t2)) { fazlamesai += sonZiyaret.atandigiTimeWindow.t2 + Islemler.UzaklikGetir(sonZiyaret.hasta.hastaID, 0).dakika - this.ogleMesai.t2; } else if (sabahmesaisivar && (sonZiyaret.atandigiTimeWindow.t2 + Islemler.UzaklikGetir(sonZiyaret.hasta.hastaID, 0).dakika > this.sabahMesai.t2)) { fazlamesai += sonZiyaret.atandigiTimeWindow.t2 + Islemler.UzaklikGetir(sonZiyaret.hasta.hastaID, 0).dakika - this.sabahMesai.t2; } /* * ziyaret öğle arasına sarkmış ise * öğle arasına sarkmada 4 durum var, her durum ayrı bir if,ile değerlendirilecek * 1) ziyaret.t1<oglearası.t1 AND ziyaret.t2> between oglearası * 2) ziyaret.t1 between öğlearası AND ziyaret.t2>Öğlearası.t2 * 3) ziyaret.t1 between öglearası AND ziyaret.t2 between öglearası * 4) ziyaret.t1<oglerası.t1 AND ziyaret.t2>oglearası.t2 */ int oa_t1 = this.sabahMesai.t2; //ekibin öğle arası başlangıcı int oa_t2 = this.ogleMesai.t1; //ekibin öğle arası bitişi for (int i = 1; i < rota.ziyaretSirasi.Count - 1; i++) //ziyaret sırasındaki hastalara bakar ilk ve son hasta ya bakmaz sağlık merkezi { Gen g1 = rota.ziyaretSirasi[i]; //i. hasta Gen g2 = rota.ziyaretSirasi[i + 1]; int zi_t1 = rota.ziyaretSirasi[i].atandigiTimeWindow.t1; //ziyaret.t1 int zi_t2 = rota.ziyaretSirasi[i].atandigiTimeWindow.t2; int dakika = Islemler.UzaklikGetir(rota.ziyaretSirasi[i], rota.ziyaretSirasi[i + 1]).dakika; //i, i+1 arasındaki uzaklığın dakika cinsinden değeri if (zi_t1 >= oa_t1 && zi_t1 <= oa_t2 && zi_t2 + dakika > oa_t2) //2.durum { oglearasiihlali += oa_t2 - zi_t1; break; //ziyaret öğle arasını geçtiğine göre dögünn devamı na gerek yok } else if (zi_t1 <= oa_t1 && zi_t2 >= oa_t2) //4.durum { oglearasiihlali += oa_t2 - oa_t1; break; //ziyaret öğle arasını geçtipine göre döngünün devamına gerek yok } else if (zi_t1 <= oa_t1 && zi_t2 + dakika > oa_t1) //1.durum (zi_t1 <= oa_t1 && zi_t2 + dakika > oa_t1 && zi_t2 + dakika <= oa_t2) { oglearasiihlali += zi_t2 + dakika - oa_t1; } else if (zi_t1 >= oa_t1 && zi_t1 <= oa_t2 && zi_t2 + dakika >= oa_t1 && zi_t2 + dakika <= oa_t2) //3.durum { oglearasiihlali += zi_t2 + dakika - zi_t1; } } _ekipCeza = fazlamesai * Islemler.CezaPuanlari[Cezalar.ekipFazlaMesaiPeriyod] + oglearasiihlali * Islemler.CezaPuanlari[Cezalar.oglearasiihlali]; }
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); }