예제 #1
0
        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);
        }
예제 #2
0
        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();
                }
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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));
        }
예제 #6
0
 public static List <Kaynak> Haric(this List <Kaynak> k, Kaynak haric)
 {
     return(k.Where(a => a != haric).ToList());
 }