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(); }
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); }