Пример #1
0
        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);
        }
Пример #2
0
        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("----------------------");
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }