public bool KaynagaGit(Kaynak k) { if (SeciliKaynak == null) { SeciliKaynak = k; } int i = Form1.rnd.Next(2);//Seçili Parametre double yeniParametre = k[i] + Form1.rnd.NextDouble() * (SeciliKaynak[i] - k[i]); Kaynak yeniKaynak = new Kaynak(k.MaxLimit); int digerKaynakIndis = (i + 1) % 2; yeniKaynak[digerKaynakIndis] = SeciliKaynak[digerKaynakIndis]; yeniKaynak[i] = yeniParametre; if (yeniKaynak.Uygunluk > SeciliKaynak.Uygunluk) { if (SeciliKaynak != null) { birOncekiKaynak = SeciliKaynak; // Opsiyonel ( Gözlemlemek için ) } SeciliKaynak.LimitCounter = 0; SeciliKaynak = yeniKaynak; return(true); } SeciliKaynak.LimitCounter++; return(false); }
private async void Button1_Click(object sender, EventArgs e) { if (!ToggleKontrol()) { return; } rnd = new Random(); //Random yenile Series series = CreateKaynakSeries(); int iterasyon = (int)numericUpDown3.Value; int populasyon = (int)numericUpDown1.Value; int cap = (int)numericUpDown4.Value; List <Kaynak> kaynaklar = kaynakUret(populasyon + 1); List <Arı> isciArılar = ArıUret(populasyon); List <Arı> gözcü_Arılar = ArıUret(populasyon); Image img = Resources.matyas; Kaynak bestKaynak = kaynaklar.EnIyiKaynak(); label7.Text = bestKaynak.Uygunluk.ToString(); for (int i = 0; i < iterasyon; i++) { kaynaklar = (await IsciArıGezintiAsync(isciArılar, kaynaklar.Haric(bestKaynak))).ToList(); TabloRender(kaynaklar, cap, colorDialog1.Color, img); kaynaklar = (await GözcüGezintiAsync(gözcü_Arılar, kaynaklar.Haric(bestKaynak))).ToList(); TabloRender(kaynaklar, cap, colorDialog2.Color, img); kaynaklar.Add(bestKaynak); bestKaynak = kaynaklar.EnIyiKaynak(); label8.Text = bestKaynak.Uygunluk.ToString(); pictureBox1.Invoke((Action) delegate { pictureBox1.Image = img; }); DataPoint dataPoint = new DataPoint(i + 1, 1 - bestKaynak.Uygunluk); chart1.Invoke((Action) delegate { series.Points.Add(dataPoint); }); await Task.Delay(1); if (!isRunning) { break; } if (i == iterasyon - 1) { ToggleKontrol(); } } }
private List <Kaynak> kaynakUret(int miktar) { int sayi = miktar; int maxLimit = (int)numericUpDown2.Value; List <Kaynak> kaynaklar = new List <Kaynak>(); for (int i = 0; i < sayi; i++) { double s1 = rnd.NextDouble() * 20 - 10; double s2 = rnd.NextDouble() * 20 - 10; Kaynak k = new Kaynak(s1, s2, maxLimit); kaynaklar.Add(k); } return(kaynaklar); }
private Kaynak Greedy(List <Kaynak> kaynaklar) { double uygunlukSum = kaynaklar.Sum(a => 1 - a.Uygunluk); //Greedy double rand = rnd.NextDouble() * uygunlukSum; Kaynak selicenKaynak = null; double toplam = 0; foreach (var item in kaynaklar) { toplam += 1 - item.Uygunluk; if (toplam > rand) { selicenKaynak = item; break; } } return(selicenKaynak); }
private Task <Kaynak[]> GözcüGezintiAsync(List <Arı> arılar, List <Kaynak> kaynaklar) { List <Task <Kaynak> > taskPool = new List <Task <Kaynak> >(kaynaklar.Count); List <Kaynak> yeniKaynaklar = new List <Kaynak>(); for (int i = 0; i < kaynaklar.Count; i++) { if (i >= arılar.Count) { break; } Task <Kaynak> t = new Task <Kaynak>(() => { Kaynak secilenKaynak = Greedy(kaynaklar); bool uygunlukArttımı = arılar[i].KaynagaGit(secilenKaynak); Kaynak guncelKaynak = null; if (uygunlukArttımı) { guncelKaynak = arılar[i].SeciliKaynak; } else { guncelKaynak = kaynaklar[i]; } if (arılar[i].SeciliKaynak.LimitDoldumu()) { arılar[i].SeciliKaynak = kaynakUret(1)[0]; } return(guncelKaynak); }); taskPool.Add(t); if (i == kaynaklar.Count - 1) { break; } // i değeri referans hatalı artış hatası } taskPool.ForEach(a => { a.Start(); }); return(Task.WhenAll(taskPool)); }
public static List <Kaynak> Haric(this List <Kaynak> k, Kaynak haric) { return(k.Where(a => a != haric).ToList()); }