コード例 #1
0
        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);
                }
            }
        }
コード例 #2
0
        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;
            }
        }
コード例 #3
0
        public void ZeplineMaliyetiBul(DugumYapisi dugumYapisi)
        {
            Dugum[] dugumler = dugumYapisi.dugumler;

            Dugum varisDugumu = dugumler[DATA.varis_sehri_plaka_kodu];

            dugumYapisi.yolunZeplineMaliyeti = varisDugumu.toplamYolKm * 10;
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        public void Coz(DugumYapisi dugumYapisi)
        {
            VerilenDosyalardanGrafOlustur(dugumYapisi);

            KomsuluklariKontrolEt(dugumYapisi);

            DjikstraEnKisaYoluBul(dugumYapisi);

            ZeplineMaliyetiBul(dugumYapisi);
        }
コード例 #6
0
        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ı");
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        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;
        }
コード例 #9
0
        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();
        }
コード例 #10
0
        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 :))
        }