private void Form_Chart_Load(object sender, EventArgs e) { for (int i = 0; i < DATA.dugumYapilari_degisken_ucret_50_kar.Count(); i++) { DugumYapisi dugumYapisi = DATA.dugumYapilari_degisken_ucret_50_kar[i]; // eğer çözüm bulundu ise: if (dugumYapisi.dugumler[DATA.varis_sehri_plaka_kodu].toplamYolKm != 1999999999) { comboBox_degiskenUCret.Items.Add(dugumYapisi.yolcuSayisi); } } for (int i = 0; i < DATA.dugumYapilari_sabit_ucret_max_kar.Count(); i++) { DugumYapisi dugumYapisi = DATA.dugumYapilari_sabit_ucret_max_kar[i]; // eğer çözüm bulundu ise: if (dugumYapisi.dugumler[DATA.varis_sehri_plaka_kodu].toplamYolKm != 1999999999) { comboBox_sabitUCret.Items.Add(dugumYapisi.yolcuSayisi); } } }
public void Ciz(DugumYapisi dugumYapisi) { Dugum varis_sehri_plaka_kodu = dugumYapisi.dugumler[DATA.varis_sehri_plaka_kodu]; Pen kalem = new Pen(Color.Red, 4); Graphics cizim = pictureBox1.CreateGraphics(); textBox_sonuc.Text = "Yolcu Sayısı: " + dugumYapisi.yolcuSayisi + " , " + "Kar = " + dugumYapisi.kar + " , " + "Toplam Yol = " + varis_sehri_plaka_kodu.toplamYolKm + " , " + "Zepline Maliyet = " + dugumYapisi.yolunZeplineMaliyeti + " , " + "Yolcu Başına Ücret = " + dugumYapisi.kisiBasiPara + Environment.NewLine; int cemberCapi = 40; Dugum oncekiDugum = null; for (int i = 0; i < varis_sehri_plaka_kodu.yollar.Count; i++) { Dugum cozumAdimi = varis_sehri_plaka_kodu.yollar.ElementAt(i); cizim.DrawEllipse(kalem, new Rectangle(cozumAdimi.harita_X - 20, cozumAdimi.harita_Y - 20, cemberCapi, cemberCapi)); if (oncekiDugum != null) { cizim.DrawLine(kalem, new Point(cozumAdimi.harita_X, cozumAdimi.harita_Y), new Point(oncekiDugum.harita_X, oncekiDugum.harita_Y)); textBox_sonuc.Text += " -> " + cozumAdimi.isim; } else { textBox_sonuc.Text += cozumAdimi.isim; } oncekiDugum = cozumAdimi; } }
public void ZeplineMaliyetiBul(DugumYapisi dugumYapisi) { Dugum[] dugumler = dugumYapisi.dugumler; Dugum varisDugumu = dugumler[DATA.varis_sehri_plaka_kodu]; dugumYapisi.yolunZeplineMaliyeti = varisDugumu.toplamYolKm * 10; }
private void button_degiskenUcret_Ciz_Click(object sender, EventArgs e) { // önceden çizilmiş yol silindi pictureBox1.Refresh(); DugumYapisi dugumYapisi = DATA.dugumYapilari_degisken_ucret_50_kar.ToList().FirstOrDefault(w => w.yolcuSayisi == Convert.ToInt32(comboBox_degiskenUCret.Text)); Ciz(dugumYapisi); }
public void Coz(DugumYapisi dugumYapisi) { VerilenDosyalardanGrafOlustur(dugumYapisi); KomsuluklariKontrolEt(dugumYapisi); DjikstraEnKisaYoluBul(dugumYapisi); ZeplineMaliyetiBul(dugumYapisi); }
private void Kaydet(DugumYapisi[] dugumYapilari, string kaydetmeYolu, double calismaSuresi, string islemAdi) { StreamWriter yaz = new StreamWriter(kaydetmeYolu); yaz.WriteLine(islemAdi); yaz.WriteLine("İşlem Süresi: " + calismaSuresi + " Mili Saniye"); yaz.WriteLine(); yaz.WriteLine(); for (int j = 0; j < dugumYapilari.Length; j++) { DugumYapisi dugumYapisi = dugumYapilari[j]; Dugum varis_sehri_plaka_kodu = dugumYapisi.dugumler[DATA.varis_sehri_plaka_kodu]; // eğer çözüm bulunamadı ise: if (dugumYapisi.dugumler[DATA.varis_sehri_plaka_kodu].toplamYolKm == 1999999999) { continue; } string text = "Toplam Yol: " + varis_sehri_plaka_kodu.toplamYolKm + " KM" + Environment.NewLine + "ZeplineMAliyet: " + dugumYapisi.yolunZeplineMaliyeti + Environment.NewLine + "Kar: " + dugumYapisi.kar + Environment.NewLine + "Yolcu Sayısı: " + dugumYapisi.yolcuSayisi + Environment.NewLine + "KisiBasi Para: " + dugumYapisi.kisiBasiPara + Environment.NewLine; Dugum oncekiDugum = null; for (int i = 0; i < varis_sehri_plaka_kodu.yollar.Count; i++) { Dugum cozumAdimi = varis_sehri_plaka_kodu.yollar.ElementAt(i); if (oncekiDugum != null) { text += " -> " + cozumAdimi.isim; } else { text += cozumAdimi.isim; } oncekiDugum = cozumAdimi; } yaz.WriteLine(text); yaz.WriteLine(); } yaz.Close(); MessageBox.Show("Dosyaya Yazıldı"); }
public void DjikstraEnKisaYoluBul(DugumYapisi dugumYapisi) { Dugum[] dugumler = dugumYapisi.dugumler; int kisi_sayisi = dugumYapisi.yolcuSayisi; // djiskstra algoritması için başlangıç değerleri sonsuz olarak atanıyor: for (int i = 0; i < dugumler.Length; i++) { dugumler[i].toplamYolKm = 1999999999; } Dugum baslangic_sehri_dugumu = dugumler[DATA.baslangic_sehri_plaka_kodu]; Dugum varis_sehri_dugumu = dugumler[DATA.varis_sehri_plaka_kodu]; // başlangıç ataması: başlangıç düğümüne değerleri atanıyor baslangic_sehri_dugumu.yollar.Add(baslangic_sehri_dugumu); baslangic_sehri_dugumu.toplamYolKm = 0; Recursive(null, baslangic_sehri_dugumu); }
public void Coz() { DateTime sabitParaBaslama, sabirParaBitis, degisenParaBaslama, degisenParaBitis; sabitParaBaslama = DateTime.Now; // sabit ücret işlemleri için DugumYapilari oluşturuluyor: // 5,6,7,...,49,50 adet yolcu için ayrı ayrı graf hazırlanıyor: DATA.dugumYapilari_sabit_ucret_max_kar = new DugumYapisi[46]; for (int i = 5; i <= 50; i++) { DATA.dugumYapilari_sabit_ucret_max_kar[i - 5] = new DugumYapisi() { dugumler = new Dugum[81], yolcuSayisi = i, kisiBasiPara = 20 }; } // sabit ücret çözüm işlemleri: for (int i = 0; i < DATA.dugumYapilari_sabit_ucret_max_kar.Count(); i++) { DugumYapisi dugumYapisi = DATA.dugumYapilari_sabit_ucret_max_kar[i]; Islemler islemler = new Islemler(); islemler.Coz(dugumYapisi); } // sabit ücret kar hesaplama for (int i = 0; i < DATA.dugumYapilari_sabit_ucret_max_kar.Count(); i++) { DugumYapisi dugumYapisi = DATA.dugumYapilari_sabit_ucret_max_kar[i]; dugumYapisi.kar = dugumYapisi.yolcuSayisi * dugumYapisi.kisiBasiPara - dugumYapisi.yolunZeplineMaliyeti; } DATA.dugumYapilari_sabit_ucret_max_kar = DATA.dugumYapilari_sabit_ucret_max_kar.OrderByDescending(w => w.kar).ToArray(); // toplam çalışma süresini bulma sabirParaBitis = DateTime.Now; DATA.sabitUcretToplamCalismaSuresi = (sabirParaBitis - sabitParaBaslama).TotalMilliseconds; //_______________________________________________________________________ degisenParaBaslama = DateTime.Now; // max kar işlemleri için DugumYapilari oluşturuluyor: // 10,20,30,40,50 adet yolcu için ayrı ayrı graf hazırlanıyor: DATA.dugumYapilari_degisken_ucret_50_kar = new DugumYapisi[5]; for (int i = 1; i <= 5; i++) { DATA.dugumYapilari_degisken_ucret_50_kar[i - 1] = new DugumYapisi() { dugumler = new Dugum[81], yolcuSayisi = i * 10, kar = 50 }; } // max kar çözüm işlemleri: for (int i = 0; i < DATA.dugumYapilari_degisken_ucret_50_kar.Count(); i++) { DugumYapisi dugumYapisi = DATA.dugumYapilari_degisken_ucret_50_kar[i]; Islemler islemler = new Islemler(); islemler.Coz(dugumYapisi); } // max kar çözüm işlemleri: for (int i = 0; i < DATA.dugumYapilari_degisken_ucret_50_kar.Count(); i++) { DugumYapisi dugumYapisi = DATA.dugumYapilari_degisken_ucret_50_kar[i]; int olmasiGerekenKar = dugumYapisi.yolunZeplineMaliyeti * 3 / 2; dugumYapisi.kisiBasiPara = olmasiGerekenKar / dugumYapisi.yolcuSayisi; } // toplam çalışma süresini bulma degisenParaBitis = DateTime.Now; DATA.degiskenUcretToplamCalismaSuresi = (degisenParaBitis - degisenParaBaslama).TotalMilliseconds; }
public static void VerilenDosyalardanGrafOlustur(DugumYapisi dugumYapisi) { Dugum[] dugumler = dugumYapisi.dugumler; int kisi_sayisi = dugumYapisi.yolcuSayisi; for (int i = 0; i < 81; i++) { dugumler[i] = new Dugum(); dugumler[i].komsular = new List <Komsu>(); dugumler[i].yollar = new List <Dugum>(); } string plaka_ilAdi = DATA.verilenDosyalarinKlasoru + "/" + "plaka-il.txt"; StreamReader oku = new StreamReader(plaka_ilAdi, Encoding.GetEncoding(1254)); string satir = oku.ReadLine(); satir = oku.ReadLine(); // çünkü ilk satırda açıklama var while (satir != null) { string[] satirParcalari = satir.Split(','); string plakaKodu = satirParcalari[0]; string sehirIsmi = satirParcalari[1]; int plaka = Convert.ToInt32(plakaKodu); dugumler[plaka - 1].plakaKodu = plaka; dugumler[plaka - 1].isim = sehirIsmi; satir = oku.ReadLine(); } oku.Close(); // lat long plakaKodu rakim string latlong = DATA.verilenDosyalarinKlasoru + "/" + "lat long.txt"; StreamReader oku2 = new StreamReader(latlong); satir = oku2.ReadLine(); satir = oku2.ReadLine(); // çünkü ilk satırda açıklama var while (satir != null) { string[] satirParcalari = satir.Split(','); string _lat = satirParcalari[0]; string _long = satirParcalari[1]; string _plakaKodu = satirParcalari[2]; string _rakim = satirParcalari[3]; int plaka = Convert.ToInt32(_plakaKodu); int rakim = Convert.ToInt32(_rakim); double lat = Convert.ToDouble(_lat.Replace('.', ',')); double lng = Convert.ToDouble(_long.Replace('.', ',')); dugumler[plaka - 1].rakim = rakim; dugumler[plaka - 1].lat = lat; dugumler[plaka - 1].lng = lng; satir = oku2.ReadLine(); } oku2.Close(); // plaka, pointX, pointY string plakaPoint = DATA.verilenDosyalarinKlasoru + "/" + "plaka-point.txt"; StreamReader oku3 = new StreamReader(plakaPoint); satir = oku3.ReadLine(); satir = oku3.ReadLine(); // çünkü ilk satırda açıklama var while (satir != null) { string[] satirParcalari = satir.Split(','); string _plakaKodu = satirParcalari[0]; string _pointX = satirParcalari[1]; string _pointY = satirParcalari[2]; int plaka = Convert.ToInt32(_plakaKodu); int pointX = Convert.ToInt32(_pointX); int pointY = Convert.ToInt32(_pointY); dugumler[plaka - 1].harita_X = pointX; dugumler[plaka - 1].harita_Y = pointY; satir = oku3.ReadLine(); } oku3.Close(); // komşuluklar: string komsuluklar = DATA.verilenDosyalarinKlasoru + "/" + "Komşuluklar.txt"; StreamReader oku4 = new StreamReader(komsuluklar); satir = oku4.ReadLine(); satir = oku4.ReadLine(); // çünkü ilk satırda açıklama var while (satir != null) { string[] satirParcalari = satir.Split(','); string _plakaKodu = satirParcalari[0]; // şu anki düğümün plakası int plaka = Convert.ToInt32(_plakaKodu); // plakak kodundan sonra gelen her numara bir komşunu plakası for (int i = 1; i < satirParcalari.Length; i++) { // komşu düğümün plakası int komsu_plakaKodu = Convert.ToInt32(satirParcalari[i]); // bir komşu nesnesi üretiliyor Komsu komsu = new Komsu() { komsuDugum = dugumler[komsu_plakaKodu - 1], mesafe = 0 }; // şu anki düğüme komşu olarak ekleniyor dugumler[plaka - 1].komsular.Add(komsu); } satir = oku4.ReadLine(); } oku4.Close(); }
public void KomsuluklariKontrolEt(DugumYapisi dugumYapisi) { Dugum[] dugumler = dugumYapisi.dugumler; int kisi_sayisi = dugumYapisi.yolcuSayisi; // zeplinin çıkacağı maximum açı: int maxZeplinAcisi = 80 - kisi_sayisi; foreach (Dugum dugum in dugumler) { // dugumun komsularından çıkarılacak olan komsuları tutacak olan liste: List <Komsu> silinecekDugumler = new List <Komsu>(); for (int i = 0; i < dugum.komsular.Count; i++) { bool gecebilirMi = false; Komsu dugumunKomsusu = dugum.komsular.ElementAt(i); // işlemler int dugumRakim = dugum.rakim; // dugumun rakımı int komsuRakimi = dugumunKomsusu.komsuDugum.rakim; // komsunun rakımı // dugumler arası yatay uzaklık int komsununUzakligiKM = DigerKodlar.GetDistanceAsKM(dugum.lat, dugum.lng, dugumunKomsusu.komsuDugum.lat, dugumunKomsusu.komsuDugum.lng); int yatay_kenar = komsununUzakligiKM; int dusey_kenar = Math.Abs(dugumRakim - (komsuRakimi + 40)); int hipotenus = (int)Math.Sqrt(Math.Pow((dusey_kenar * Math.Pow(10, -3)), 2) + Math.Pow(yatay_kenar, 2)); double aci = Math.Atan(((double)dusey_kenar) / yatay_kenar) * 180 / Math.PI; dugumunKomsusu.mesafe = hipotenus; // eğer zeplin yukarı çıkacaksa eğim limiti geçerli if (dugumRakim < komsuRakimi) { if (aci <= maxZeplinAcisi) { gecebilirMi = true; } else { gecebilirMi = false; } } else { gecebilirMi = true; } if (!gecebilirMi) { silinecekDugumler.Add(dugumunKomsusu); } } // komsu olduğu halde gidilemeyecek komsular dugumun komsu listesinden çıkarılıyor: foreach (Komsu komsu in silinecekDugumler) { dugum.komsular.Remove(komsu); } } // int a = 5; : breakpoint koyabilmek için :)) }