//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; }
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); }
// 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); }
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)); }
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"); } } } }
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; }
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)]); }