예제 #1
0
        public void mutacja(int LBnCh, List <Osobnik> newpop, List <Osobnik> populacja, int lParam, int TurRozm = 0)
        {
            Random rand = new Random();

            if (TurRozm == 0)
            {
                TurRozm = rand.Next(2, Convert.ToInt32(populacja.Count * 0.2));
            }
            Osobnik najlepszy = selekcjaTurniej(TurRozm, populacja);
            Osobnik nowy      = new Osobnik();
            int     bPunkt    = rand.Next(0, LBnCh * lParam);

            for (int i = 0; i < LBnCh * lParam; i++)
            {
                if (bPunkt == i)
                {
                    nowy.Chromosomy.Add(najlepszy.Chromosomy[i] ^ 1);
                }
                else
                {
                    nowy.Chromosomy.Add(najlepszy.Chromosomy[i]);
                }
            }
            newpop.Add(nowy);
        }
예제 #2
0
        public Osobnik selekcjaTurniej(int TurRozm, List <Osobnik> populacja)
        {
            Random     rand        = new Random();
            Osobnik    win         = new Osobnik();
            List <int> possible    = Enumerable.Range(0, populacja.Count).ToList();
            List <int> listNumbers = new List <int>();

            for (int i = 0; i < TurRozm; i++)
            {
                int index = rand.Next(0, possible.Count);
                listNumbers.Add(possible[index]);
                possible.RemoveAt(index);
            }
            double max = populacja[0].Ocena;

            foreach (int nr in listNumbers)
            {
                if (populacja[nr].Ocena > max)
                {
                    max = populacja[nr].Ocena;
                }
            }
            foreach (Osobnik osob in populacja)
            {
                if (osob.Ocena == max)
                {
                    win = osob;
                }
            }
            return(win);
        }
예제 #3
0
        public List <Osobnik> krzyzowanie(Osobnik p1, Osobnik p2, int LBnCh, int lParam)
        {
            Random         rand    = new Random();
            Osobnik        nowy    = new Osobnik();
            List <Osobnik> nowList = new List <Osobnik>();
            int            bPunkt  = rand.Next(0, LBnCh * 2);

            for (int i = 0; i < LBnCh * lParam; i++)
            {
                if (bPunkt >= i)
                {
                    nowy.Chromosomy.Add(p1.Chromosomy[i]);
                }
                else
                {
                    nowy.Chromosomy.Add(p2.Chromosomy[i]);
                }
            }
            nowList.Add(nowy);
            nowy = new Osobnik();
            for (int i = 0; i < LBnCh * lParam; i++)
            {
                if (bPunkt < i)
                {
                    nowy.Chromosomy.Add(p1.Chromosomy[i]);
                }
                else
                {
                    nowy.Chromosomy.Add(p2.Chromosomy[i]);
                }
            }
            nowList.Add(nowy);
            return(nowList);
        }
예제 #4
0
        public List <Osobnik> tworzOsobniki(int ilosc, int LBnCh, int lParam, List <Osobnik> populacja)
        {
            Random rand = new Random();

            for (int i = 0; i < ilosc; i++)
            {
                Osobnik osobnik = new Osobnik();
                for (int j = 0; j < LBnCh * lParam; j++)
                {
                    osobnik.Chromosomy.Add(rand.Next(0, 2));
                }
                populacja.Add(osobnik);
            }
            return(populacja);
        }
예제 #5
0
        public void zad3Rek(int LBnCh, int ZDMin, int ZDMax, int iteracje, int obecna, List <Osobnik> populacja)
        {
            List <Osobnik> newpop = new List <Osobnik>();

            for (int j = 0; j < (populacja.Count - 1) / 3; j++)
            {
                Osobnik os = selekcjaTurniej2(3, populacja);
                newpop.Add(mutacja2(LBnCh, os, 9));
            }
            for (int j = 0; j < (populacja.Count - 1) / 6; j++)
            {
                Osobnik        p1    = selekcjaTurniej2(3, populacja);
                Osobnik        p2    = selekcjaTurniej2(3, populacja);
                List <Osobnik> krzyz = krzyzowanie(p1, p2, LBnCh, 9);
                foreach (Osobnik osobnik in krzyz)
                {
                    newpop.Add(osobnik);
                }
            }
            for (int j = 0; j < (populacja.Count - 1) / 6; j++)
            {
                Osobnik        p1    = selekcjaTurniej2(3, populacja);
                Osobnik        p2    = selekcjaTurniej2(3, populacja);
                List <Osobnik> krzyz = krzyzowanie(p1, p2, LBnCh, 9);
                foreach (Osobnik osobnik in krzyz)
                {
                    newpop.Add(mutacja2(LBnCh, osobnik, 9));
                }
            }

            Osobnik najlepszy = selekcjaTurniej2(populacja.Count, populacja);

            newpop.Add(najlepszy);
            zad3Licz(newpop, LBnCh, ZDMin, ZDMax);
            double suma = 0;

            foreach (Osobnik osobnik in populacja)
            {
                suma += osobnik.Ocena;
            }
            finish.Text += "Najnizsza ocena: " + najlepszy.Ocena + " Srednia ocena: " + (suma / populacja.Count) + "\n";
            if (obecna < iteracje - 1)
            {
                zad3Rek(LBnCh, ZDMin, ZDMax, iteracje, obecna + 1, newpop);
            }
        }
예제 #6
0
        public Osobnik mutacja2(int LBnCh, Osobnik os, int lParam)
        {
            Random  rand   = new Random();
            Osobnik nowy   = new Osobnik();
            int     bPunkt = rand.Next(0, LBnCh * 2);

            for (int i = 0; i < LBnCh * lParam; i++)
            {
                if (bPunkt == i)
                {
                    nowy.Chromosomy.Add(os.Chromosomy[i] ^ 1);
                }
                else
                {
                    nowy.Chromosomy.Add(os.Chromosomy[i]);
                }
            }
            return(nowy);
        }
예제 #7
0
 private void generuj(Warstwa warstwa, int i, int LBnCh, Osobnik osobnik, double ZDMin, double ZDMax)
 {
     for (int j = 0; j < (warstwy[i] + 1) * warstwy[i + 1]; j++)
     {
         List <int> chromosomy = new List <int>();
         if (i == 0)
         {
             for (int k = j * LBnCh; k < LBnCh * (j + 1); k++)
             {
                 chromosomy.Add(osobnik.Chromosomy[k]);
             }
         }
         else
         {
             for (int k = j * LBnCh + i * (warstwy[i - 1] + 1) * warstwy[i] * LBnCh; k < LBnCh * (j + 1) + i * (warstwy[i - 1] + 1) * warstwy[i] * LBnCh; k++)
             {
                 chromosomy.Add(osobnik.Chromosomy[k]);
             }
         }
         warstwa.Wagi.Add(dekoduj(chromosomy, LBnCh, ZDMin, ZDMax));
     }
 }
예제 #8
0
        public void zad1Rek(int LBnCh, int ZDMin, int ZDMax, int iteracje, int obecna, int lParam, List <Osobnik> populacja)
        {
            List <Osobnik> newpop = new List <Osobnik>();

            for (int j = 0; j < populacja.Count - 1; j++)
            {
                mutacja(LBnCh, newpop, populacja, lParam);
            }
            Osobnik najlepszy = selekcjaTurniej(populacja.Count, populacja);

            newpop.Add(najlepszy);
            zad1Licz(LBnCh, ZDMin, ZDMax, newpop);
            double suma = 0;

            foreach (Osobnik osobnik in populacja)
            {
                suma += osobnik.Ocena;
            }
            finish.Text += "Najwyzsza ocena: " + najlepszy.Ocena + " Srednia ocena: " + (suma / populacja.Count) + "\n";
            if (obecna < iteracje - 1)
            {
                zad1Rek(LBnCh, ZDMin, ZDMax, iteracje, obecna + 1, lParam, newpop);
            }
        }
예제 #9
0
        private void robWarstwy(Warstwa warstwa, List <int> warstwy, int skip, int LBnCh, Osobnik osobnik, int ZDMin, int ZDMax)
        {
            Warstwa tmp = new Warstwa();

            if (warstwy.Count - 1 != skip)
            {
                generuj(tmp, skip, LBnCh, osobnik, ZDMin, ZDMax);
            }

            warstwa.Dzieci.Add(tmp);
            if (warstwy.Count > skip + 1)
            {
                robWarstwy(tmp, warstwy, skip + 1, LBnCh, osobnik, ZDMin, ZDMax);
            }
        }