Example #1
0
        static void Main(string[] args)
        {
            var    r                  = new Random(DateTime.Now.Millisecond);
            var    p                  = new pole();
            double sumaFitness        = 0;
            double maxFitnessJedinca  = 0;
            var    descendingComparer = Comparer <int> .Create((x, y) => y.CompareTo(x));

            var  generacia = 1;
            bool koniec    = false;

            var elite          = new List <jedinec>();
            var povodniJedinci = new List <jedinec>();
            var jedinci        = new List <jedinec>();

            Console.WriteLine("Zadaj velkost populacie: (100)");
            var vp = Console.ReadLine();
            var velkostPopulacie = Convert.ToInt32(vp);
            var napln            = velkostPopulacie;

            Console.WriteLine("Zadaj typ selekcie - 1 pre ruletu, 2 pre turnaj:");
            var vyb = Console.ReadLine();
            var typ = Convert.ToInt32(vyb);

            Console.WriteLine("Zadaj pocet jedincov, ktori sa maju vytvorit novi krizenim: (70)");
            var ko    = Console.ReadLine();
            var kolko = Convert.ToInt32(ko);

            var pocetInstr = 500;

            Console.WriteLine("Chces zadat maximalny pocet instrukcii, ktore moze jedinec vykonat? Default je 500. Ano/Nie?:");
            var rozhodnutie = Console.ReadLine();

            if (rozhodnutie.ToLower() == "ano")
            {
                Console.WriteLine("Zadaj pocet:");
                var ins = Console.ReadLine();
                pocetInstr = Convert.ToInt32(ins);
            }

            while (napln-- > 0)
            {
                jedinci.Add(new jedinec(r));
            }


            var vypis = 100;

            while (!koniec)        // tu je cyklus v ktorom vsetko bezi, jedinci sa krizia
            {
                /*if (generacia == 1 || generacia % vypis == 0 || p.pocetPokladov == 5)
                 * {
                 *  Console.WriteLine("---------- Generacia: " + generacia + " ----------");
                 * }*/

                maxFitnessJedinca = 0;
                sumaFitness       = 0;
                foreach (var j in jedinci)
                {
                    var steps = j.run(pocetInstr);
                    j.fitness    = p.fitness(steps);
                    sumaFitness += j.fitness;
                    if (p.pocetPokladov == 5)
                    {
                        koniec = true;
                    }

                    if (maxFitnessJedinca > j.fitness)
                    {
                        maxFitnessJedinca *= 1;
                    }
                    else
                    {
                        maxFitnessJedinca = j.fitness;
                    }

                    if (p.pocetPokladov == 5)
                    {
                        Console.WriteLine("Koniec! Nasli sme vsetky poklady.");
                        Console.WriteLine("Generacia: " + generacia);
                        Console.WriteLine("Suma fitness doterajsich jedincov: " + sumaFitness);
                        Console.WriteLine("Konecna fitness jedinca: " + j.fitness);       // vypisuje fitness
                        Console.WriteLine("Vysledne kroky:");
                        var s = string.Join(" ", steps.Select(x => x.ToString()));
                        Console.WriteLine(s);       // vypisuje postupnost krokov
                        Console.WriteLine("Pocet najdenych pokladov: " + p.pocetPokladov);
                        Console.WriteLine();
                    }
                }

                //jedinci.AddRange(elite);

                /*if (generacia == 1 || generacia % vypis == 0)
                 * {
                 *  Console.WriteLine("Suma fitness: " + sumaFitness + " Max fitness jedinca: " + maxFitnessJedinca);
                 * }*/

                if (generacia == 1 || generacia % 10000 == 0)
                {
                    Console.WriteLine("Hladam poklady...");
                }


                //povodniJedinci = jedinci.ToList();
                povodniJedinci.AddRange(jedinci);
                jedinci.Clear();
                if (typ == 1)
                {
                    jedinci = ruleta(sumaFitness, povodniJedinci, kolko).ToList();
                }
                else if (typ == 2)
                {
                    jedinci = turnaj(povodniJedinci, kolko).ToList();
                }

                if (kolko < velkostPopulacie)
                {
                    for (int i = 0; i < (velkostPopulacie - kolko); i++)
                    {
                        jedinci.Add(new jedinec(r));
                    }
                }
                povodniJedinci.Clear();

                /*elite.Clear();
                 * for(int t = 0; t < 5; t++)
                 * {
                 *  elite.Add(jedinci[t]);
                 * }*/

                generacia++;
            }

            Console.Read();
        }
Example #2
0
        public List <pohyb> run(int steps)     // funkcia pre beh programu pre jedinca, pocet krokov je nastavenych premennou steps
        {
            var p = new pole();

            p.startovnaPozicia();

            var result = new List <pohyb>();
            var ip     = 0;

            while (steps-- > 0)                 // pokial nepresiahne urceny pocet krokov
            {
                var inst = mem[ip];             // premenna pre instrukciu, ukazuje na pamatovu bunku
                var op   = inst >> 6;           // premenna pre operaciu, co ma program vykonat (inkrementacia, dekrementacia, skok alebo vypis)
                var adr  = (byte)(inst & 0x3f); // premenna pre adresu (0011 1111)

                /*if (ip == 0 || ip == 1)
                 * {
                 *  Console.WriteLine("inst: " + Convert.ToString(inst, 2));
                 *  Console.WriteLine("op: " + Convert.ToString(op, 2));
                 *  Console.WriteLine("adr: " + Convert.ToString(adr, 2));
                 * }*/

                switch (op)     // podla operacie vykonaj konkretnu akciu
                {
                case 0:         // inkrementacia
                    mem[adr]++;
                    ip++;
                    break;

                case 1:             // dekrementacia
                    mem[adr]--;
                    ip++;
                    break;

                case 2:             // skok
                    ip = adr;
                    break;

                case 3:             // vypis
                    var pocet = bitcount(mem[adr]);
                    var prem  = 0;
                    if (pocet <= 2)
                    {
                        prem = 0;
                    }
                    else if (pocet <= 4)
                    {
                        prem = 1;
                    }
                    else if (pocet <= 6)
                    {
                        prem = 2;
                    }
                    else
                    {
                        prem = 3;
                    }

                    result.Add((pohyb)(prem));
                    ip++;
                    if (p.testJeMimo((pohyb)(prem)))          // skontroluj, ci je mimo, ak ano, skonci program pre daneho jedinca
                    {
                        return(result);
                    }
                    break;
                }
                if (ip >= 64)
                {
                    ip = 0;                 // ak sa dostane na koniec pola, tak chod od zaciatku
                }
            }
            //Console.WriteLine("Dosiahnuty limit poctu krokov");
            return(result);
        }