public static Pop Sort(Pop p) { IList <Gen> list = new List <Gen>(); list = p.Kromozon; IEnumerable <Gen> sortedEnum = list.OrderBy(f => f.Score); IList <Gen> sortedList = sortedEnum.ToList(); p.Kromozon = sortedList; return(p); }
private void btn_basla_Click(object sender, EventArgs e) { double pop = decimal.ToDouble(num_pop.Value); double cap = decimal.ToDouble(num_cap.Value); double mut = decimal.ToDouble(num_mut.Value); double pen = decimal.ToDouble(num_pen.Value); double jen = decimal.ToDouble(num_jen.Value); while (chart_ga.Series.Count > 0) { chart_ga.Series.RemoveAt(0); } // Resetle Series series = this.chart_ga.Series.Add("Total"); series.ChartType = SeriesChartType.Spline; chart_ga.Series["Total"].BorderWidth = 2; chart_ga.Series["Total"].Color = Color.Red; if (pop % 2 == 1) { pop++; } Pop p = new Pop(pop); Pop.penalty = pen.ToString().Length; p.Generate(); for (int i = 0; i < jen; i++) { p.ScoreAll(); if (i % (jen / 10) == 0) { series.Points.AddXY(i, p.BestGen.Score); } p = GA.Sort(p); p.Updatetotalscore(); p.Updatekumdeg(); p = GA.Capraz(p, cap); p = GA.Mutasyon(p, mut); } p.ScoreAll(); listBox1.Items.Add("----------------------"); listBox1.Items.Add("Score = " + p.BestGen.Score); int j = 0; foreach (double g in p.BestGen.Genes) { j++; listBox1.Items.Add("Gen " + j + "=" + g); } listBox1.Items.Add("----------------------"); }
public static Pop Mutasyon(Pop p, double sans) { foreach (Gen h in p.Kromozon) { for (int i = 0; i < h.Genes.Length; i++) { double mut = RandomNumber(0, 1); if (sans > mut) { h.Genes[i] = RandomNumber(-30, 30); } } } return(p); }
public static Pop Capraz(Pop p, double sans) { // 0 a en yakın olan yarısını eşleştirmede kullan Doğal seçim // Ağırlıklı eşleştirme metodu 5 kromozon eşleşcek bool anormal = false; Pop yen = new Pop(p.Kromozon.Count); //10 kromozon int sayi = p.Kromozon.Count; //10 int esles = sayi / 2; //esles = 5 kromozon eslescek if (esles % 2 == 1) // pop 5/2 odd ise yazı tura at { int yazıtura = random.Next(0, 2); if (yazıtura == 0) //2 kromozon eşleştir kro[0,1,2,3] { esles--; } else // 5ciye eş bul kromozon[4] { esles--; anormal = true; } } esles = esles / 2; // 2 tane eşlestir int[] anne = new int[esles]; int[] baba = new int[esles]; int j = 0; for (j = 0; j < esles; j++) //0-1-2-3 { double ran1 = RandomNumber(0, 1); int a = 0; for (; a < esles * 2;) //4 { if (p.Kromozon[a].Kumdeg < ran1) { break; } else { a++; } } anne[j] = a; //p.Kromozon[a]; double ran2 = RandomNumber(0, 1); int b = 0; for (; b < esles * 2;) //4 { if (p.Kromozon[b].Kumdeg < ran2) { break; } else { b++; } } baba[j] = b; //p.Kromozon[b]; } for (int i = 0; i < esles; i++) //Heuristik çaprazlama metoduyla extrapolasyon metodu { double sanss = RandomNumber(0, 1); if (sans > sanss) // 0.70 caprz oranı { bool tersten = false; int dongu = p.Kromozon[anne[i]].Genes.Length; //30 gen Gen yen1 = new Gen(dongu); Gen yen2 = new Gen(dongu); int arasayı = random.Next(0, dongu); // nerden kesecegini ögren int aradongu = arasayı; if (arasayı == 0) // eğer ilk başsa sağdakilerini değiştir { aradongu = 1; } if (arasayı == dongu - 1) // eğer en sonsa soldakileri deiştir { aradongu = 0; tersten = true; // en sondaki aynı kalsın } for (int l = 0; l < dongu; l++) { if (aradongu == l) { for (int k = aradongu; k < dongu; k++) { double B = RandomNumber(0, 1); double a = p.Kromozon[anne[i]].Genes[k]; double b = p.Kromozon[baba[i]].Genes[k]; double sonuc = B * (a - b); yen1.Genes[k] = a - sonuc; yen2.Genes[k] = b - sonuc; } break; } else { yen1.Genes[l] = p.Kromozon[anne[i]].Genes[l]; yen2.Genes[l] = p.Kromozon[baba[i]].Genes[l]; } } if (tersten) // en sondakini aynı yap { yen1.Genes[dongu - 1] = p.Kromozon[anne[i]].Genes[dongu - 1]; yen2.Genes[dongu - 1] = p.Kromozon[baba[i]].Genes[dongu - 1]; } yen.Kromozon.Add(yen1); yen.Kromozon.Add(yen2); } else // olmazsa aySnı kalsın { yen.Kromozon.Add(p.Kromozon[anne[i]]); yen.Kromozon.Add(p.Kromozon[baba[i]]); } } if (anormal) // 5.ye eş bul { double sonsans = RandomNumber(0, 1); int sones = esles * 2; // id si 4 yani kromozon[4] Gen sonyen1 = new Gen(p.Kromozon[sones].Genes.Length); Gen sonyen2 = new Gen(p.Kromozon[sones].Genes.Length); int sonran = random.Next(0, esles); // 0 ile 3 arası bul if (sans > sonsans) // 0.70 caprz oranı { bool tersten = false; int dongu = p.Kromozon[sones].Genes.Length; int arasayı = random.Next(0, dongu); // nerden kesecegini ögren int aradongu = arasayı; if (arasayı == 0) // eğer ilk başsa sağdakilerini değiştir { aradongu = 1; } if (arasayı == dongu - 1) // eğer en sonsa soldakileri deiştir { aradongu = 0; tersten = true; // en sondaki aynı kalsın } for (int l = 0; l < dongu; l++) { if (aradongu == l) { for (int k = aradongu; k < dongu; k++) { double B = RandomNumber(0, 1); double a = p.Kromozon[sones].Genes[k]; double b = p.Kromozon[sonran].Genes[k]; double sonuc = B * (a - b); sonyen1.Genes[k] = a - sonuc; sonyen2.Genes[k] = b - sonuc; } break; } else { sonyen1.Genes[l] = p.Kromozon[sones].Genes[l]; sonyen2.Genes[l] = p.Kromozon[sonran].Genes[l]; } } if (tersten) // en sondakini aynı yap { sonyen1.Genes[dongu - 1] = p.Kromozon[sones].Genes[dongu - 1]; sonyen2.Genes[dongu - 1] = p.Kromozon[sonran].Genes[dongu - 1]; } yen.Kromozon.Add(sonyen1); } else { yen.Kromozon.Add(p.Kromozon[sones]); } } else { yen.Kromozon.Add(p.Kromozon[sayi / 2 - 1]); } for (int i = sayi / 2; i < sayi; i++) // P kötü olanları ekliyoz { yen.Kromozon.Add(p.Kromozon[i]); } return(yen); }