public void populasyonuIlkle()
 {
     for (int i = 0; i < populasyon.Length; i++)
     {
         populasyon[i] = new Hucre(boyutSayisi, adimBuyuklugu, parametreAraliklari, goruntuIslemleri);
     }
 }
 public void yuzme(Hucre yeniHucre, Hucre eskiHucre)
 {
     for (int i = 0; i < boyutSayisi; i++)
     {
         yeniHucre.Konum[i] = yeniHucre.Konum[i] + eskiHucre.AdımBuyuklugu * yuvarAdım[i];
         // Normalizasyon
         yeniHucre.Konum[i] = Math.Max(Math.Min(yeniHucre.Konum[i], parametreAraliklari[i, 1]), parametreAraliklari[i, 0]);
     }
 }
 public void enIyiyiKontrolEt(Hucre aday)
 {
     if (aday.Cost > enIyiHucre.Cost)
     {
         enIyiHucre.Uygunluk = aday.Uygunluk;
         enIyiHucre.Cost     = aday.Cost;
         enIyiHucre.Konum[0] = aday.Konum[0];
         enIyiHucre.Konum[1] = aday.Konum[1];
         enIyiHucre.Konum[2] = aday.Konum[2];
     }
 }
        public void kemotaksi()
        {
            double Jlast;
            Hucre  yenhucre = new Hucre(boyutSayisi, adimBuyuklugu, parametreAraliklari, goruntuIslemleri);

            for (int i = 0; i < populasyonBuyuklugu; i++)
            {
                etkilesim(populasyon[i]);
                Jlast = populasyon[i].Uygunluk;
                yuvarlanma(yenhucre, populasyon[i]);
                populasyon[i].Cost = goruntuIslemleri.ParametreleriDegerlendir(populasyon[i].Konum[0], populasyon[i].Konum[1], populasyon[i].Konum[2]);
                enIyiyiKontrolEt(populasyon[i]);
                etkilesim(yenhucre);

                for (int j = 0; j < boyutSayisi; j++)
                {
                    populasyon[i].Konum[j] = yenhucre.Konum[j];
                }

                populasyon[i].Cost     = yenhucre.Cost;
                populasyon[i].Uygunluk = yenhucre.Uygunluk;
                populasyon[i].Can     += populasyon[i].Uygunluk;

                for (int m = 0; m < yuzmeUzunlugu; m++)
                {
                    if (yenhucre.Uygunluk < Jlast)
                    {
                        Jlast = yenhucre.Uygunluk;
                        yuzme(yenhucre, populasyon[i]);
                        populasyon[i].Cost = goruntuIslemleri.ParametreleriDegerlendir(populasyon[i].Konum[0], populasyon[i].Konum[1], populasyon[i].Konum[2]);
                        enIyiyiKontrolEt(populasyon[i]);
                        etkilesim(yenhucre);

                        for (int j = 0; j < boyutSayisi; j++)
                        {
                            populasyon[i].Konum[j] = yenhucre.Konum[j];
                        }

                        populasyon[i].Cost     = yenhucre.Cost;
                        populasyon[i].Uygunluk = yenhucre.Uygunluk;
                        populasyon[i].Can     += populasyon[i].Uygunluk;
                    }
                    else
                    {
                        break;
                    }
                }
            }
        }
 private int hucreKiyasla(Hucre sol, Hucre sag)
 {
     if (sol.Can < sag.Can)
     {
         return(-1);
     }
     if (sol.Can > sag.Can)
     {
         return(1);
     }
     else
     {
         return(0);
     }
 }
        public void etkilesim(Hucre h)
        {
            double attract = 0.0, repel = 0.0, diff = 0.0;

            for (int i = 0; i < this.populasyonBuyuklugu; i++)
            {
                for (int j = 0; j < this.boyutSayisi; j++)
                {
                    diff += Math.Pow(h.Konum[j] - this.populasyon[i].Konum[j], 2.0);
                }
                attract += 1.0 * dAttract * Math.Exp(-1.0 * wAtrract * diff);
                repel   += hRepel * Math.Exp(-1.0 * wRepel * diff);
            }

            // Sürü etkisini oluşturur.
            h.Uygunluk = h.Cost + attract + repel;
        }
        public void yuvarlanma(Hucre yeniHucre, Hucre eskiHucre)
        {
            double a = -1.0, b = 1.0, temp1 = 0.0, temp2 = 0.0;

            for (int i = 0; i < this.boyutSayisi; i++)
            {
                delta[i] = rastgeleSayi(a, b); // rastgele.NextDouble() * (b - a) + a;
                temp1   += Math.Pow(delta[i], 2.0);
            }
            temp2 = Math.Sqrt(temp1);

            for (int i = 0; i < boyutSayisi; i++)
            {
                yuvarAdım[i]       = delta[i] / temp2;
                yeniHucre.Konum[i] = eskiHucre.Konum[i] + eskiHucre.AdımBuyuklugu * yuvarAdım[i];
                // Normalizasyon
                yeniHucre.Konum[i] = Math.Max(Math.Min(yeniHucre.Konum[i], parametreAraliklari[i, 1]), parametreAraliklari[i, 0]);
            }
        }
        public double[] aramaBaslat(int sayacLimiti)
        {
            double eski_cost;
            int    sayac       = sayacLimiti;
            int    nesilSayisi = 0;

            populasyonuIlkle();
            enIyiHucre = new Hucre(boyutSayisi, adimBuyuklugu, parametreAraliklari, goruntuIslemleri);

            do
            {
                sayac       -= 1;
                nesilSayisi += 1;
                eski_cost    = enIyiHucre.Cost;


                //for (int k = 0; k < kemotaksiSayisi; k++)
                //{
                kemotaksi();

                //}
                ureme();
                eliminasyon_dagıtım();


                if (eski_cost != enIyiHucre.Cost)
                {
                    sayac = sayacLimiti; // Reset
                }

                //Console.WriteLine("Nesil sayısı: " + nesilSayisi);
                //Console.WriteLine("En iyi varyans:" + enIyiHucre.Cost);
            } while (sayac > 0);

            enIyiKonumlar[0] = enIyiHucre.Konum[0];
            enIyiKonumlar[1] = enIyiHucre.Konum[1];
            enIyiKonumlar[2] = enIyiHucre.Konum[2];
            return(enIyiHucre.Konum);
        }