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); } }
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; } }