Example #1
0
        public void BaslangicKromozomOlustur()
        {
            var result = this.TasimaListesi.GroupBy(u => u.NakliyeNo).Select(grp => grp.ToList());

            foreach (var item in result)
            {
                var ilkTasima = item.FirstOrDefault();
                var nakliye   = new Nakliye();
                nakliye.NakliyeNo = ilkTasima.NakliyeNo;
                nakliye.TasimaListesi.AddRange(item);
                nakliye.RotaList   = item.Where(a => a.KaynakNokta.Id != 65 && a.HedefNokta.Id != 65).Select(a => a.HedefId).ToList();
                nakliye.PlanId     = this.PlanId;
                nakliye.NakSkor    = RotaSkorHesapla(nakliye.RotaList);
                nakliye.AtananArac = ilkTasima.TasimaninAraci;
                this.NakliyeListesi.Add(nakliye);
            }
        }
Example #2
0
        public void TavlamaBenzetimiUygula()
        {
            //her aracın bulunduğu konumdan ELM ye olan uzaklıkları şimdilik 0
            //sicaklik 0
            var    seed       = (int)DateTime.Now.Ticks;
            var    rnd        = new Random(seed);
            double sicaklik   = this.Sicaklik;
            double sao        = this.SicaklikAzaltmaOrani;
            double MaxSkor    = double.MaxValue;
            double KomsuSkor1 = 0;
            double KomsuSkor2 = 0;
            double BestSkor   = 0;
            double Delta      = 0;
            int    Iteration  = this.Dongu;

            List <Nakliye> KomsulukCozum1     = new List <Nakliye>();
            List <Nakliye> KomsulukCozum2     = new List <Nakliye>();
            List <int>     SecilenAracTorbasi = new List <int>();

            KomsulukCozum1.AddRange(NakliyeListesi);//komşuluk1

            List <int> KRota1 = new List <int>();
            List <int> KRota2 = new List <int>();

            while (sicaklik > 1)
            {
                for (int k = 0; k < Iteration; k++)
                {
                    //System.Diagnostics.Debug.WriteLine("Sıcaklık : "+sicaklik+" : "+ "KomşuSkor1 : "+ KomsuSkor1);
                    //her nakliye için her iterasyonda bir swap yapılır_> Komşuluk 2
                    KomsulukCozum2.Clear();
                    foreach (var n in KomsulukCozum1)
                    {
                        var nakl = new Nakliye();

                        KRota1.Clear();
                        KRota1.AddRange(n.RotaList);//Komşuluk1

                        //İç rotadan rassal iki taşıma seç
                        int ind1 = rnd.Next(0, KRota1.Count);
                        int ind2 = rnd.Next(0, KRota1.Count);

                        //seçilen taşımaları bul
                        var r1 = KRota1.ElementAt(ind1);
                        var r2 = KRota1.ElementAt(ind2);
                        //Debug.WriteLine(string.Join(",", n.RotaList));

                        //swap işlemini yap
                        n.RotaList[ind1] = r2;
                        n.RotaList[ind2] = r1;
                        //Debug.WriteLine(string.Join(",",n.RotaList));

                        KRota2.Clear();
                        KRota2.AddRange(n.RotaList); //Komşuluk2

                        nakl.NakliyeNo = n.NakliyeNo;
                        nakl.RotaList.AddRange(KRota2);
                        nakl.RotaList.Clear();
                        nakl.RotaList.AddRange(n.RotaList);
                        nakl.NakSkor = RotaSkorHesapla(n.RotaList);
                        KomsulukCozum2.Add(nakl);
                    }

                    Debug.WriteLine(Environment.NewLine);
                    KomsuSkor1 = KomsulukCozum1.Max(a => a.NakSkor);
                    Debug.WriteLine("Sıcaklık : " + sicaklik + " KomşuSkor1 : " + KomsuSkor1);

                    KomsuSkor2 = KomsulukCozum2.Max(a => a.NakSkor);
                    Debug.WriteLine("KomşuSkor2 : " + KomsuSkor2);
                    Delta = KomsuSkor2 - KomsuSkor1;

                    if (Delta <= 0)
                    {
                        KomsulukCozum1.Clear();
                        for (int i = 0; i < KomsulukCozum2.Count; i++)
                        {
                            KomsulukCozum1.Add(KomsulukCozum2[i]);
                        }
                    }

                    else if (rnd.NextDouble() < (Math.Exp(-Delta / sicaklik)))
                    {
                        KomsulukCozum1.Clear();
                        for (int i = 0; i < KomsulukCozum2.Count; i++)
                        {
                            KomsulukCozum1.Add(KomsulukCozum2[i]);
                        }
                    }
                    else
                    {
                        KomsulukCozum2.Clear();
                        for (int i = 0; i < KomsulukCozum1.Count; i++)
                        {
                            KomsulukCozum2.Add(KomsulukCozum1[i]);
                        }
                    }
                    if (KomsuSkor2 < MaxSkor)
                    {
                        MaxSkor  = KomsuSkor2;
                        BestSkor = KomsuSkor2;
                        EnIyiCozum.Clear();
                        for (int i = 0; i < KomsulukCozum2.Count; i++)
                        {
                            EnIyiCozum.Add(KomsulukCozum2[i]);
                        }
                        System.Diagnostics.Debug.WriteLine("Sıcaklık :" + sicaklik + " " + MaxSkor);
                    }
                }
                sicaklik = sicaklik * sao;
            }
        }