コード例 #1
0
        static void Main(string[] args)
        {
            List <Osobnik> listaWyników      = new List <Osobnik>();
            List <Osobnik> najlepsiPopulacji = new List <Osobnik>();

            for (int index = 0; index < liczbaUruchomien; index++)
            {
                Osobnik[] populacja = new Osobnik[20]; // 20 = zalozony staly rozmiar populacji
                for (int i = 0; i < populacja.Length; ++i)
                {
                    do
                    {
                        populacja[i]           = new Osobnik();
                        populacja[i].m_genotyp = (uint)los.Next(int.MinValue, int.MaxValue);
                    } while (CzyWZakresie(populacja[i]));
                }

                Osobnik maxUruchomienia = populacja[0];

                int nr_pokolenia = 0;

                Osobnik maxPopulacji;

                while (nr_pokolenia++ < 1000) // 1000 - zalozona liczba pokolen
                {
                    Osobnik[] nowa_populacja = new Osobnik[populacja.Length];
                    maxPopulacji = nowa_populacja[0];
                    for (int i = 0; i < nowa_populacja.Length; i++) // nowe pokolenie
                    {
                        Osobnik dziecko, mama, tata;
                        do
                        {
                            mama              = Selekcja(populacja);
                            tata              = Selekcja(populacja);
                            dziecko           = Rekombinacja(mama, tata);
                            nowa_populacja[i] = dziecko;
                        } while (CzyWZakresie(nowa_populacja[i]));
                    }
                    najlepsiPopulacji.Add(MaxPopulacji(populacja));
                    populacja = nowa_populacja;
                }

                for (int i = 0; i < populacja.Length; i++)
                {
                    Console.WriteLine("{0} dla {1}",
                                      Osobnik.FunkcjaDopasowania(Osobnik.Fenotyp(populacja[i])),
                                      Osobnik.Fenotyp(populacja[i]));
                }

                listaWyników.Add(MaxPopulacji(najlepsiPopulacji.ToArray()));
            }

            Console.WriteLine("Średnia z wszystkich uruchomień: {0}", Średnia(listaWyników.ToArray()));
            Console.ReadKey();
        }
コード例 #2
0
        static double Średnia(Osobnik[] wartosci)
        {
            double suma = 0.0;

            foreach (var item in wartosci)
            {
                suma += Osobnik.FunkcjaDopasowania(item.m_fenotyp);
            }

            return(suma / wartosci.Length);
        }
コード例 #3
0
        static Osobnik MaxPopulacji(Osobnik[] populacja)
        {
            Osobnik maxPopulacji = populacja[0];

            foreach (var item in populacja)
            {
                if (Osobnik.FunkcjaDopasowania(item.m_fenotyp) > Osobnik.FunkcjaDopasowania(maxPopulacji.m_fenotyp))
                {
                    maxPopulacji = item;
                }
            }
            return(maxPopulacji);
        }
コード例 #4
0
    // tworzenie nowego osobnika poprzez krzyżowanie dwóch innych (punkt krzyżowania ten sam co w +) tylko odwrotnie niż w +
    public static Osobnik operator -(Osobnik o1, Osobnik o2)
    {
        Osobnik pom = new Osobnik();

        for (int i = 0; i < podz; i++)
        {
            pom.Chromosom[i] = o2.Chromosom[i];
        }
        for (int i = podz; i < 10; i++)
        {
            pom.Chromosom[i] = o1.Chromosom[i];
        }
        return(pom);
    }
コード例 #5
0
        static Osobnik Rekombinacja(Osobnik mama, Osobnik tata)
        {
            uint    maska   = ~0u << los.Next(1, 32);
            Osobnik dziecko = new Osobnik();

            dziecko.m_genotyp = maska & mama.m_genotyp
                                | ~maska & tata.m_genotyp;

            if (los.NextDouble() < 0.1) // 0.1 - 10% pr. mutacji - zalozenie
            {
                maska              = 1u << los.Next(32);
                dziecko.m_genotyp ^= maska;
            }
            return(dziecko);
        }
コード例 #6
0
        static Osobnik Selekcja(Osobnik[] populacji)
        {
            Osobnik k1 = populacji[los.Next(populacji.Length)];
            Osobnik k2 = populacji[los.Next(populacji.Length)];

            if (Osobnik.FunkcjaDopasowania(Osobnik.Fenotyp(k1))
                > Osobnik.FunkcjaDopasowania(Osobnik.Fenotyp(k2)))
            {
                return(k1);
            }
            else
            {
                return(k2);
            }
        }
コード例 #7
0
        static void Main(string[] args)
        {
            // pierwszy osobnik

            Console.WriteLine("______________*______________*______________*______________*______________*______________*______________");
            Console.WriteLine();

            Osobnik Jeden = new Osobnik(-1, 1, 3);

            Jeden.Policz();
            Console.WriteLine("Dlugosc lancucha binarnego Pierwszego osobnika to: {0} ", Jeden.dlugosclancucha);


            Console.WriteLine("Podaj ilosc lancuchow binarnych Pierwszego osobnika: ");
            Jeden.ilosclancuchow = int.Parse(Console.ReadLine());


            Console.WriteLine();
            Console.WriteLine();

            List <double> WieleLancuchowJeden = new List <double>();

            for (int i = 1; i <= Jeden.ilosclancuchow; i++)
            {
                Jeden.generujLancuchBinarny(Jeden.dlugosclancucha);
                Console.WriteLine("Lancuch binarny nr {0} dla Pierwszego osobnika to: {1}", i, Jeden.lancuchBinarny);

                Jeden.zamienNaWartoscDziesietna(Jeden.lancuchBinarny);
                WieleLancuchowJeden.Add(Jeden.wartoscX);
                Console.WriteLine("Wartosc dziesietna lancucha binarnego nr {0} dla Pierwszego osobnika to: {1}", i, WieleLancuchowJeden[i - 1]);
                Console.WriteLine();
            }

            Jeden.WieleLancuchow = WieleLancuchowJeden;

            List <double> WielePunktowJeden = new List <double>();

            for (int i = 1; i <= Jeden.ilosclancuchow; i++)
            {
                Jeden.przesuniecieDoPrzedzialu(Jeden.WieleLancuchow[i - 1], Jeden.dlugosclancucha);
                WielePunktowJeden.Add(Jeden.punkt);
                Jeden.punkt = 0;
                Console.WriteLine("Wartosc punktu dla lancucha binarnego nr {0} Pierwszego osobnika to: {1}", i, WielePunktowJeden[i - 1]);
                Console.WriteLine();
            }


            Jeden.WielePunktowX = WielePunktowJeden;


            Jeden.algorytm(Jeden.WielePunktowX, Jeden.ilosclancuchow);
            Console.WriteLine("Wartosc funkcji dla podanych lancuchow binarnych Pierwszego osobnika to: {0}", Jeden.wynikAlgorytmu);



            // drugi osobnik

            Console.WriteLine("______________*______________*______________*______________*______________*______________*______________");
            Console.WriteLine();

            Osobnik Dwa = new Osobnik(-1, 1, 3);

            Dwa.Policz();
            Console.WriteLine("Dlugosc lancucha binarnego Drugiego oosobnika to: {0} ", Dwa.dlugosclancucha);


            Console.WriteLine("Podaj ilosc lancuchow binarnych dla Drugiego osobnika: ");
            Dwa.ilosclancuchow = int.Parse(Console.ReadLine());

            List <double> WieleLancuchowDwa = new List <double>();

            for (int i = 1; i <= Dwa.ilosclancuchow; i++)
            {
                Dwa.generujLancuchBinarny(Dwa.dlugosclancucha);
                Console.WriteLine("Lancuch binarny nr {0} dla Drugiego oosobnika to: {1}", i, Dwa.lancuchBinarny);

                Dwa.zamienNaWartoscDziesietna(Dwa.lancuchBinarny);
                WieleLancuchowDwa.Add(Dwa.wartoscX);
                Console.WriteLine("Wartosc dziesietna lancucha binarnego nr {0} dla Drugiego osobnika to: {1}", i, WieleLancuchowDwa[i - 1]);
                Console.WriteLine();
            }

            Dwa.WieleLancuchow = WieleLancuchowDwa;

            List <double> WielePunktowDwa = new List <double>();

            for (int i = 1; i <= Dwa.ilosclancuchow; i++)
            {
                Dwa.przesuniecieDoPrzedzialu(Dwa.WieleLancuchow[i - 1], Dwa.dlugosclancucha);
                WielePunktowDwa.Add(Dwa.punkt);
                Dwa.punkt = 0;
                Console.WriteLine("Wartosc punktu dla lancucha binarnego nr {0} Drugiego osobnika to: {1}", i, WielePunktowDwa[i - 1]);
                Console.WriteLine();
            }

            Dwa.WielePunktowX = WielePunktowDwa;


            Dwa.algorytm(Dwa.WielePunktowX, Dwa.ilosclancuchow);
            Console.WriteLine("Wartosc funkcji dla podanych lancuchow binarnych Drugiego osobnika to: {0}", Dwa.wynikAlgorytmu);


            // trzeci osobnik

            Console.WriteLine("______________*______________*______________*______________*______________*______________*______________");
            Console.WriteLine();

            Osobnik Trzy = new Osobnik(-1, 1, 3);

            Trzy.Policz();
            Console.WriteLine("Dlugosc lancucha binarnego Trzeciego osobnika to: {0} ", Trzy.dlugosclancucha);


            Console.WriteLine("Podaj ilosc lancuchow binarnych: ");
            Trzy.ilosclancuchow = int.Parse(Console.ReadLine());

            List <double> WieleLancuchowTrzy = new List <double>();

            for (int i = 1; i <= Trzy.ilosclancuchow; i++)
            {
                Trzy.generujLancuchBinarny(Trzy.dlugosclancucha);
                Console.WriteLine("Lancuch binarny nr {0} dla Trzeciego osobnika to: {1}", i, Trzy.lancuchBinarny);

                Trzy.zamienNaWartoscDziesietna(Trzy.lancuchBinarny);
                WieleLancuchowTrzy.Add(Trzy.wartoscX);
                Console.WriteLine("Wartosc dziesietna lancucha binarnego nr {0} dla Trzeciego osobnika to: {1}", i, WieleLancuchowTrzy[i - 1]);
                Console.WriteLine();
            }

            Trzy.WieleLancuchow = WieleLancuchowTrzy;

            List <double> WielePunktowTrzy = new List <double>();

            for (int i = 1; i <= Trzy.ilosclancuchow; i++)
            {
                Trzy.przesuniecieDoPrzedzialu(Trzy.WieleLancuchow[i - 1], Trzy.dlugosclancucha);
                WielePunktowTrzy.Add(Trzy.punkt);
                Trzy.punkt = 0;
                Console.WriteLine("Wartosc punktu dla lancucha binarnego nr {0} Trzeciego osobnika to: {1}", i, WielePunktowTrzy[i - 1]);
                Console.WriteLine();
            }

            Trzy.WielePunktowX = WielePunktowTrzy;


            Trzy.algorytm(Trzy.WielePunktowX, Trzy.ilosclancuchow);
            Console.WriteLine("Wartosc funkcji dla podanych lancuchow binarnych Trzeciego osobnika to: {0}", Trzy.wynikAlgorytmu);

            Console.WriteLine("______________*______________*______________*______________*______________*______________*______________");
            Console.WriteLine();

            Populacja populacjaPierwsza = new Populacja();

            populacjaPierwsza.OsobnikiZPopulacji.Add(Jeden.wynikAlgorytmu);

            populacjaPierwsza.OsobnikiZPopulacji.Add(Dwa.wynikAlgorytmu);

            populacjaPierwsza.OsobnikiZPopulacji.Add(Trzy.wynikAlgorytmu);

            int iloscOsobnikow = 3;

            for (int i = 0; i < iloscOsobnikow; i++)
            {
                Console.WriteLine("Osobnik {0} ma wartosc funkcji wynoszaca {1}.", i + 1, populacjaPierwsza.OsobnikiZPopulacji[i]);
                Console.WriteLine();
            }

            Console.ReadKey();
        }
コード例 #8
0
 static bool CzyWZakresie(Osobnik osobnik)
 {
     return(osobnik.m_fenotyp > 2.0 || osobnik.m_fenotyp < -2.0);
 }