//public bool AtamaYap_eski(Hasta yenihasta)
        //{
        //    //rotada uygun bir konum bulursa atama yapacak, true dönecek
        //    //atama yapamaz ise false dönecek
        //    //atama yaparken hasta nın atanabileceği zç içinde uygun yere atayacak
        //    //atanmış olan diğer hastaların zaman çerçevesinde oynama yapmayacak

        //    try
        //    {
        //        if ((ekip.skill & yenihasta.skill) != yenihasta.skill) return false; //skill yetersiz ise atama yapma
        //        for (int i = 0; i < ziyaretSirasi.Count - 1; i++)
        //        {
        //            Gen g1 = ziyaretSirasi[i];
        //            Gen g2 = ziyaretSirasi[i + 1];
        //            //distanceMatrix.Add(new Tuple<int, int>(h1, h2), uzaklik);
        //            //Uzaklik u1 = distancematr[new Tuple<int, int>(hastalist[0].hastaID, hastalist[1].hastaID)];

        //            //uzaklik1=g1-yenihasta; uzaklik2=yenihasta-g2
        //            Uzaklik2 uzaklik1 = Islemler.distanceMatrix[new Tuple<int, int>(g1.hasta.hastaID, yenihasta.hastaID)];
        //            Uzaklik2 uzaklik2 = Islemler.distanceMatrix[new Tuple<int, int>(yenihasta.hastaID, g2.hasta.hastaID)];
        //            int t1 = g1.atandigiTimeWindow.t2 + Convert.ToInt32(uzaklik1.dakika);
        //            int t2 = t1 + yenihasta.bakimSuresi;

        //            if (t2 > yenihasta.timeWindow.t2)
        //                continue; //ziyaret yapılamaz t2 süresinde ziyaret bitmiyor

        //            if (t1 < yenihasta.timeWindow.t1) //hastanın bakım zamanı gelmemiş ise ziyaret hasta bakım zamanında yapılır
        //            {
        //                t1 = yenihasta.timeWindow.t1;
        //                t2 = t1 + yenihasta.bakimSuresi;
        //            }
        //            int g2yevaris = t2 + uzaklik2.dakika; //yeni noktadan g2 ye gidiş periyodu

        //            if (MesaiSarkmasiVar(t1, t2))
        //                continue;//ziyaretler sabah başlamış öğlen bitmiş ziyaret yapılamaz
        //            if (g2yevaris > g2.atandigiTimeWindow.t1)
        //                continue;//yeni atanacak hasta mevcut atamadaki ziyaret planını bozuyor

        //            //bu noktada ise; atama yapılabilir
        //            YeniNoktaEkleAraya(i + 1, yenihasta, t1, t2);


        //            return true;
        //        }
        //    }

        //    catch
        //    {
        //        return false;
        //    }
        //    return false; //üstteki döngüden kurtulmuş ise atama yapamamıştır
        //}
        public bool AtamaYap(Hasta yenihasta)
        {
            //rotada uygun bir konum bulursa atama yapacak, true dönecek

            //atama yapamaz ise false dönecek
            //atama yaparken hasta nın atanabileceği zç içinde uygun yere atayacak
            //atanmış olan diğer hastaların zaman çerçevesinde oynama yapmayacak

            try
            {
                if ((ekip.skill & yenihasta.skill) != yenihasta.skill)
                {
                    return(false);                                                   //skill yetersiz ise atama yapma
                }
                for (int i = 0; i < ziyaretSirasi.Count - 1; i++)
                {
                    Gen g1 = ziyaretSirasi[i];
                    Gen g2 = ziyaretSirasi[i + 1];
                    //distanceMatrix.Add(new Tuple<int, int>(h1, h2), uzaklik);
                    //Uzaklik u1 = distancematr[new Tuple<int, int>(hastalist[0].hastaID, hastalist[1].hastaID)];

                    //uzaklik1=g1-yenihasta; uzaklik2=yenihasta-g2
                    Uzaklik2 uzaklik1 = Islemler.distanceMatrix[new Tuple <int, int>(g1.hasta.hastaID, yenihasta.hastaID)];
                    Uzaklik2 uzaklik2 = Islemler.distanceMatrix[new Tuple <int, int>(yenihasta.hastaID, g2.hasta.hastaID)];
                    int      t1       = g1.atandigiTimeWindow.t2 + Convert.ToInt32(uzaklik1.dakika);
                    int      t2       = t1 + yenihasta.bakimSuresi;

                    if (t2 > yenihasta.timeWindow.t2)
                    {
                        continue;                     //ziyaret yapılamaz t2 süresinde ziyaret bitmiyor
                    }
                    if (t1 < yenihasta.timeWindow.t1) //hastanın bakım zamanı gelmemiş ise ziyaret hasta bakım zamanında yapılır
                    {
                        t1 = yenihasta.timeWindow.t1;
                        t2 = t1 + yenihasta.bakimSuresi;
                    }
                    int g2yevaris = t2 + uzaklik2.dakika; //yeni noktadan g2 ye gidiş periyodu

                    if (MesaiSarkmasiVar(t1, t2))
                    {
                        continue;//ziyaretler sabah başlamış öğlen bitmiş ziyaret yapılamaz
                    }
                    if (g2yevaris > g2.atandigiTimeWindow.t1)
                    {
                        continue;//yeni atanacak hasta mevcut atamadaki ziyaret planını bozuyor
                    }
                    //bu noktada ise; atama yapılabilir
                    YeniNoktaEkleAraya(i + 1, yenihasta, t1, t2);


                    return(true);
                }
            }

            catch
            {
                return(false);
            }
            return(false); //üstteki döngüden kurtulmuş ise atama yapamamıştır
        }
        public void ToplamUzaklikHesapla()
        {
            //rota ile yapılan toplam uzaklık değeri metre ve dakika cinsinden ikisni de hesaplar
            Uzaklik2 tUzaklik = new Uzaklik2();

            for (int i = 0; i < ziyaretSirasi.Count - 1; i++)
            {
                Gen g1 = ziyaretSirasi[i];
                Gen g2 = ziyaretSirasi[i + 1];
                if (g1.hasta.hastaID == g2.hasta.hastaID)
                {
                    continue;
                }
                Uzaklik2 uzaklik = Islemler.UzaklikGetir(g1.hasta.hastaID, g2.hasta.hastaID);
                //  Uzaklik2 uzaklik = Islemler.distanceMatrix[new Tuple<int, int>(g1.hasta.hastaID, g2.hasta.hastaID)];
                tUzaklik.dakika += uzaklik.dakika;

                //bakım zamanı mecburi bir maliyet ve değiştirilemeyeceğinden zaman maliyetine eklenmedi, aşağıdaki kod ile kolayca eklenebilir
                //fakat GA nın azaltma imkanının olmadığı bir değerin fitness fonksiyonunu eklimememesi için bakım durumu eklenmedi sadce yolculuk zamanı eklendi
                //yolculuk zamanın eklenmesindeki ana sebep ise 1,2,3 gibi bir sıralama ile 1,3,2 gibi sıralamada tesr yön de trafik sıkışıklığı yada daha çok ışık gibi sebeplerden kaçınmak

                tUzaklik.dakika += g1.hasta.bakimSuresi; //Tek bir deney için eklendi daha sonr akapatılacak bakim süresini de ekle

                tUzaklik.metre += uzaklik.metre;
            }
            _toplamUzaklik = tUzaklik;
        }
Exemple #3
0
        static Uzaklik2 GetDistanceDurationFromGoogle(Nokta n1, Nokta n2)
        {
            //Uzaklik değerini km ve dakika cinsinden döner
            //n1 ile n2 arasındaki değerlere bakar
            //Uzaklik, Nokta struct yapısındandır
            // aranan noktalarla ilgili bir yanlışlık olursa geriye -1 döner
            Uzaklik2 donen = new Uzaklik2();

            donen.metre  = -1;
            donen.dakika = -1;
            string url = "https://maps.googleapis.com/maps/api/distancematrix/xml?";

            url += "origins=" + n1.lat.ToString().Replace(",", ".") + "," + n1.lon.ToString().Replace(",", ".");
            url += "&destinations=" + n2.lat.ToString().Replace(",", ".") + "," + n2.lon.ToString().Replace(",", ".");
            url += "&mode=driving&sensor=false";
            url += "&key=" + myKey;//keyin sorgu süresi dolarsa para alıyor günlük 10.000 sorgu
            HttpWebRequest request        = (HttpWebRequest)WebRequest.Create(url);
            WebResponse    response       = request.GetResponse();
            Stream         dataStream     = response.GetResponseStream();
            StreamReader   sreader        = new StreamReader(dataStream);
            string         responsereader = sreader.ReadToEnd();

            response.Close();
            XmlDocument xmldoc = new XmlDocument();

            xmldoc.LoadXml(responsereader);
            if (xmldoc.GetElementsByTagName("status")[0].ChildNodes[0].InnerText == "OK") //eleman varsa
            {
                XmlNodeList dst = xmldoc.GetElementsByTagName("distance");
                XmlNodeList dur = xmldoc.GetElementsByTagName("duration");
                donen.metre  = Convert.ToDouble(dst[0].ChildNodes[0].ChildNodes[0].Value);
                donen.dakika = (int)Math.Round(Convert.ToDouble(dur[0].ChildNodes[0].ChildNodes[0].Value) / 60, 0);
            }
            return(donen);
        }
Exemple #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);
        }
Exemple #5
0
        static public Uzaklik2 UzaklikGetir(Gen g1, Gen g2)
        {
            Uzaklik2 ayninokta = new Uzaklik2();

            ayninokta.dakika = 0; ayninokta.metre = 0;
            if (g1.hasta.hastaID == g2.hasta.hastaID)
            {
                return(ayninokta);
            }

            //  return Islemler.distanceMatrix[new Tuple<int, int>(g1.hasta.hastaID, g2.hasta.hastaID)];
            return(UzaklikGetir(g1.hasta.hastaID, g2.hasta.hastaID));
        }
Exemple #6
0
        static public void DistanceMatrixOlustur()
        {
            //sürekli kullanılmayacak, sadece ilk başta kullanıldı
            List <Hasta> hastalar = new List <Hasta>();
            SqlCommand   sqlkomut = new SqlCommand("select hastaID,lat,lon from HASTALAR", Islemler.conn);

            Islemler.conn.Open();
            SqlDataReader dr = sqlkomut.ExecuteReader();

            while (dr.Read())
            {
                Hasta hasta = new Hasta();
                hasta.hastaID   = (int)dr["hastaID"];
                hasta.konum.lat = (double)dr["lat"];
                hasta.konum.lon = (double)dr["lon"];
                hastalar.Add(hasta);
            }
            dr.Close();
            Islemler.conn.Close();
            Uzaklik2 uzaklik = new Uzaklik2();

            foreach (Hasta h1 in hastalar)
            {
                foreach (Hasta h2 in hastalar)
                {
                    if (h1.Equals(h2))
                    {
                        continue;
                    }
                    uzaklik = GetDistanceDurationFromGoogle(h1.konum, h2.konum);
                    string sql = "exec InsertDistanceDuration ";
                    sql += h1.konum.lat;
                    sql += "," + h1.konum.lon;
                    sql += "," + h2.konum.lat;
                    sql += "," + h2.konum.lon;
                    sql += "," + uzaklik.metre;
                    sql += "," + uzaklik.dakika;
                    sqlkomut.CommandText = sql;
                    try
                    {
                        Islemler.conn.Open();
                        sqlkomut.ExecuteNonQuery();
                        Islemler.conn.Close();
                    }
                    catch
                    {
                        MessageBox.Show("Distance oluşumunda hata var");
                    }
                }
            }
        }
Exemple #7
0
        static Uzaklik2 GetDistanceDuration(Nokta n1, Nokta n2)
        {
            //kod tekrar elden geçmeli 31.10.2019
            //2 nokta arasındaki uzaklığı önce veritabanında arar,
            //veritabanında bulamaz ise googledistance matrix apisinden (GetDistanceDurationFromGoogle) çağırır sonra ki çağrılar için veritabanına yazar
            Uzaklik2 uzaklik = new Uzaklik2();//geriye dönecek olan değer için tanımlandı
            string   sql     = "Select distance, duration from DISTANCEMATRIX Where ";

            sql += "n1.Lat=" + n1.lat.ToString().Replace(",", ".");
            sql += " AND n1.Lon=" + n1.lon.ToString().Replace(",", ".");
            sql += " AND n2.Lat=" + n2.lat.ToString().Replace(",", ".");
            sql += " AND n2.Lon=" + n2.lon.ToString().Replace(",", ".");
            SqlCommand sqlkomut = new SqlCommand(sql, Islemler.conn);

            Islemler.conn.Open();
            SqlDataReader dr = sqlkomut.ExecuteReader();

            if (dr.Read()) //veritabanında kayıt var ise veritabanından getir
            {
                uzaklik.metre  = (double)dr["distance"];
                uzaklik.dakika = (int)dr["duration"];
            }
            else //eğer database de kayıtlı değilse google dan ister
            {
                uzaklik = GetDistanceDurationFromGoogle(n1, n2);//veritabanında bulamazsa googledan alıyor
                                                                // uzaklik değerleri database yazılıyor
                sql  = "exec InsertDistanceDuration ";
                sql += n1.lat;
                sql += "," + n1.lon;
                sql += "," + n2.lat;
                sql += "," + n2.lon;
                sql += "," + uzaklik.metre;
                sql += "," + uzaklik.dakika;
                sqlkomut.CommandText = sql;
                try
                {
                    Islemler.conn.Open();
                    sqlkomut.ExecuteNonQuery();
                    Islemler.conn.Close();
                }
                catch
                {
                    MessageBox.Show("Veritabanı hatası oldu");
                }
            }
            dr.Close();
            Islemler.conn.Close();
            return(uzaklik);
        }
        public void ToplamUzaklikHesapla()
        {
            //rota ile yapılan toplam uzaklık değeri metre ve dakika cinsinden ikisni de hesaplar
            Uzaklik2 tUzaklik = new Uzaklik2();

            for (int i = 0; i < ziyaretSirasi.Count - 1; i++)
            {
                Gen      g1      = ziyaretSirasi[i];
                Gen      g2      = ziyaretSirasi[i + 1];
                Uzaklik2 uzaklik = Islemler.distanceMatrix[new Tuple <int, int>(g1.hasta.hastaID, g2.hasta.hastaID)];
                tUzaklik.dakika += uzaklik.dakika;
                tUzaklik.metre  += uzaklik.metre;
            }
            _toplamUzaklik = tUzaklik;
        }
Exemple #9
0
        static public Uzaklik2 UzaklikGetir(int h1ID, int h2ID)
        {
            //iki nokta rasındaki uzaklık değerini getirir
            //eğer değer veritabanında varsa veritabanından getirir
            //eğer degeri uzaklık matriksinde bulamaz ise google dan sorgular ve veritabanına yeni değeri yazar
            //bütün uzaklıklar her zaman sorgulanmayabilir.

            Uzaklik2 ayninokta = new Uzaklik2();

            ayninokta.dakika = 0; ayninokta.metre = 0;
            if (h1ID == h2ID)
            {
                return(ayninokta);
            }
            Uzaklik2 yeniuzaklik = new Uzaklik2();

            try
            {
                yeniuzaklik = Islemler.distanceMatrix[new Tuple <int, int>(h1ID, h2ID)];
            }
            catch
            {
                //distance matrixte olmayan bir değer sorgulanıyor
                Nokta n1 = new Nokta();
                Nokta n2 = new Nokta();

                //burası hata verme ihtimali olan bir kısım
                //eğer burada hata olursa değerleri database den sorgulama yap
                //hata vermez ise bu şekilde kalmalı bu daha hızlı
                foreach (Hasta hasta in _hastaListGun)
                {
                    if (h1ID == hasta.hastaID)
                    {
                        n1 = hasta.konum;
                    }
                    if (h2ID == hasta.hastaID)
                    {
                        n2 = hasta.konum;
                    }
                }

                yeniuzaklik = GetDistanceDurationFromGoogle(n1, n2);

                //yeni uzakliği veritabanina ekle
                SqlCommand sqlkomut = new SqlCommand();
                string     sql      = "exec InsertDistanceDuration ";
                sql += n1.lat;
                sql += "," + n1.lon;
                sql += "," + n2.lat;
                sql += "," + n2.lon;
                sql += "," + yeniuzaklik.metre;
                sql += "," + yeniuzaklik.dakika;
                sqlkomut.CommandText = sql;
                sqlkomut.Connection  = Islemler.conn;
                try
                {
                    Islemler.conn.Open();
                    sqlkomut.ExecuteNonQuery(); //yeni değer tabloya yazıldı
                    Islemler.conn.Close();
                }
                catch
                {
                    MessageBox.Show("Veritabanı hatası oldu");
                }
                distanceMatrix.Add(new Tuple <int, int>(h1ID, h2ID), yeniuzaklik);//yeni değer distance matrixe eklendi
            }

            return(Islemler.distanceMatrix[new Tuple <int, int>(h1ID, h2ID)]);
        }