Esempio n. 1
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ı");
            }
        }
Esempio n. 2
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ı");
            }
        }