예제 #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);
        }
예제 #2
0
 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));
     }
 }
예제 #4
0
        // 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);
        }
예제 #7
0
        //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);
        }
예제 #8
0
        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);
            }
        }
예제 #9
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);
            }
        }
예제 #10
0
        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();
            }
        }
예제 #11
0
        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ı");
            }
        }
예제 #12
0
        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ı");
            }
        }
예제 #13
0
 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);
        }