/// <summary> /// Zlepšující funkce /// S 80% šancí (nebo Algorithm.P_CROSSOVER) aplikuji operátor křížení /// S 20% šancí (nebo Algorithm.P_MUTATION) apliukuji operátor mutace /// Aktualizuji populaci po křížení a mutaci /// </summary> public void improve() { var rnd = new Random(); this.pNext.Clear(); foreach (SuperInvidual iTmp in this.pCurrent) { SuperInvidual iNew; if (rnd.Next(1, 100) < Algorithm.P_CROSSOVER) { iNew = new SuperInvidual(this.select(), this.select()); } else { iNew = this.select(); } this.pNext.Add(iNew); } this.pCurrent.Clear(); foreach (SuperInvidual iTmp in this.pNext) { this.pCurrent.Add(iTmp); } this.pCurrent[0] = this.best; this.updateBest(); }
/// <summary> /// Výběrová funkce => Turnaj mezi 2 jedinci /// Náhodně vyberu 2 jedince z celé populace. /// Podle getDistance funkce vyberu lepšího jedince. (Kratší vzdálenost = lepší) /// </summary> /// <returns>Invidual (Jedinec)</returns> private SuperInvidual select() { var rnd = new Random(); int i1 = rnd.Next(0, Algorithm.POPULATION_SIZE); int i2 = rnd.Next(0, Algorithm.POPULATION_SIZE); while (i1 == i2) { i2 = rnd.Next(0, Algorithm.POPULATION_SIZE); } SuperInvidual a = this.pCurrent[i1]; SuperInvidual b = this.pCurrent[i2]; if (a.getFitness() < b.getFitness()) { return(a); } else { return(b); } }
/// <summary> /// Konstruktor /// Naplním populaci jedinci /// Na začátku jsou jedinci generováni náhodně /// </summary> public SuperPopulation() { this.pCurrent = new List <SuperInvidual>(); this.pNext = new List <SuperInvidual>(); this.best = null; for (int i = 0; i < Algorithm.POPULATION_SIZE; i++) { this.pCurrent.Add(new SuperInvidual()); } this.updateBest(); }
/// <summary> /// Projdu celou populaci a aktializuji nejlepšího jedince. /// Tohoto jedince držím v proměnné Invidual best /// </summary> private void updateBest() { this.best = null; foreach (SuperInvidual iTmp in this.pCurrent) { if (this.best == null) { this.best = iTmp; } else { if (iTmp.getFitness() < this.best.getFitness()) { this.best = iTmp; } } } }
/// <summary> /// Vytvorim noveho jedince z 2 super jedincu (krizeni) /// </summary> /// <param name="s1"></param> /// <param name="s2"></param> public SuperInvidual(SuperInvidual s1, SuperInvidual s2) { var rnd = new Random(); int a = rnd.Next(0, 2); if (a == 0) { for (int i = 0; i < CROSSIN_POINT; i++) { this.routes[i] = s1.routes[i]; } for (int i = CROSSIN_POINT; i < routes.Length; i++) { this.routes[i] = s2.routes[i]; } } else { for (int i = 0; i < CROSSIN_POINT; i++) { this.routes[i] = s2.routes[i]; } for (int i = CROSSIN_POINT; i < routes.Length; i++) { this.routes[i] = s1.routes[i]; } } this.driverCount = 0; for (int i = 0; i < routes.Length; i++) { if (routes[i] > this.driverCount) { this.driverCount = routes[i]; } } startAlgorithm(); }
static void Main(string[] args) { // Oddelovac tisicu muze byt nastaven jinak na ruznych strojich. Timto nastavim "anglickou klavesnici" Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); InputOutput.start(); for (int j = 1; j < 51; j++) { SuperPopulation sp = new SuperPopulation(); sp.showMe(); /* * for (int i = 0; i < 1; i++) * { * Console.WriteLine("pokousim se vylepsit po " + i); * sp.improve(); * Console.WriteLine("vylepseno po " + i); * sp.showMe(); * InputOutput.printResult(sp.getMe(), ("Test" + j + "_Record_Vnejsi0Vnitrni20_Gen" + i), true); * } */ Console.WriteLine("\n\nDokončeno\n\n"); SuperInvidual result = sp.GetBest(); InputOutput.printResult(result.getMe(), "Test" + j + "_Result_Vnejsi0Vnitrni20", true); result.showMeFull(); sp = null; } /* * * for (int i = 0; i < 20; i++) * { * Console.WriteLine("pokousim se vylepsit po " + i); * sp.improve(); * Console.WriteLine("vylepseno po " + i); * sp.showMe(); * InputOutput.printResult(sp.getMe(), ("Test1_Record_Vnejsi20Vnitrni50_Gen" + i), true); * } * * Console.WriteLine("\n\nDokončeno\n\n"); * * SuperInvidual result = sp.GetBest(); * * InputOutput.printResult(result.getMe(), "Test1_Result_Vnejsi20Vnitrni50", true); * * result.showMeFull(); * */ /* * * SuperInvidual super = new SuperInvidual(); * * * * super.showMeFull(); * Console.ReadLine(); * * Console.WriteLine("prelozen: " + super.checkOverload()); * Console.ReadLine(); * * SuperInvidual super2 = new SuperInvidual(); * * super2.showMeFull(); * Console.ReadLine(); * * Console.WriteLine("prelozen: " + super2.checkOverload()); * Console.ReadLine(); * * SuperInvidual superNew = new SuperInvidual(super, super2); * * superNew.showMeFull(); * Console.ReadLine(); */ /* * Console.WriteLine("prelozen: " + superNew.checkOverload()); * Console.ReadLine(); * * Console.WriteLine("prelozeni ktereho ridice? "); * int i = Convert.ToInt32(Console.ReadLine()); * Console.WriteLine("prelozen: " + superNew.checkOverload(i)); * Console.ReadLine(); * * Console.WriteLine("veze: " + superNew.getDriverPallets(i)); * Console.ReadLine(); * * string[] cesta = new string[superNew.getDriverPallets(i)]; * cesta = superNew.getSequence(i); * Functions.showArray(cesta); * Console.ReadLine(); */ /* * Console.WriteLine("poustim algoritmus"); * superNew.startAlgorithm(); * superNew.showMeRoutes(); * Console.ReadLine(); * * int num = superNew.getFitness(); * Console.WriteLine("fitness: " + num); * Console.ReadLine(); */ // Controller controller = new Controller(); /* * string[] s = { "ab", "cd", "dd", "aa", "ab" }; * * Console.WriteLine("pred opravou"); * Functions.showArray(s); * * string[] a = Functions.removeDuplicityStringArray(s); * * Console.WriteLine("po oprave"); * Functions.showArray(a); * * Console.ReadLine(); */ //InputOutput.start(); /* * Algorithm algoritmus; * Invidual result; * * // Pole jedinců, kteří tvoří objednávku (10 variant objednávek) * Orders[] vysledek = new Orders[10]; * * // Zde je seznam všech variant objednávky * List<string> orderList = new List<string>(); * * // Seznam názvů měst * //string cities = "!#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_abcdefghijklmnopqrstuvwxyz{|}~"; * string cities = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; * * // Vytvořím 10 skupin objednávek - 10 variant, kudy mohou vést cesty * for (int i = 0; i < vysledek.Length; i++) vysledek[i] = new Orders(cities); * * // Vytvořím jeden dlouhý seznam cest ze všech objednávek (Každá objednávka má několik cest) * for (int i = 0; i < vysledek.Length; i++) orderList.AddRange(vysledek[i].getOrdersList()); * * // Ukážu všechny Jedince (každou skupinu objednávek) * for (int i = 0; i < vysledek.Length; i++) * { * Console.WriteLine("Jedinec cislo "+i+":"); * vysledek[i].showMatrix(); * } * * Console.ReadLine(); * * * * int topVzdalenost = 12345675; * int delka; * int index = 0; * List<int> vzdalenostiVysledek = new List<int>(); * List<string> jedinci = new List<string>(); * List<Invidual> topJedinci = new List<Invidual>(); * * List<Invidual> currentJedinci = new List<Invidual>(); * * int citac = 0; * * Console.WriteLine("\n\n\nVypocital jsem tyto nejkratsi cesty:"); * for (int i = 0; i < vysledek.Length; i++) * { * jedinci = vysledek[i].getOrdersList(); * delka = 0; * Console.WriteLine("Skupina cislo:" + i); * for (int j = 0; j < jedinci.Count; j++) * { * if (jedinci[j].Length > 1) * { * citac++; * algoritmus = new Algorithm(jedinci[j], jedinci[j].Length); * result = algoritmus.start(); * delka = delka + result.getDistance(); * currentJedinci.Add(result); * * Console.WriteLine(citac + " " + result.getSequence() + "\tVzdalenost: " + result.getDistance()); * } * * } * * Console.WriteLine("Celkova delka:" + delka + "\n"); * vzdalenostiVysledek.Add(delka); * * if (delka < topVzdalenost) * { * topVzdalenost = delka; * topJedinci.Clear(); * topJedinci.AddRange(currentJedinci); * index = i; * } * jedinci.Clear(); * currentJedinci.Clear(); * } * * Console.WriteLine("\n\n\nMyslim ze tohle je top skupina: (" + index + ")"); * for (int i = 0; i < topJedinci.Count; i++) * { * Console.WriteLine(topJedinci[i].getSequence()); * } * Console.WriteLine("Celkova vzdalenost: " + topVzdalenost); * * Console.WriteLine("\n\n\nVypocet vzdalenosti po jednom: " + topVzdalenost); * * int counter = 0; * * for (int i = 0; i < orderList.Count; i++) * { * if (orderList[i].Length > 1) * { * algoritmus = new Algorithm(orderList[i], orderList[i].Length); * result = algoritmus.start(); * Console.WriteLine(counter + " Nejlepší jedinec: " + result.getSequence() + "\tVzdálenost:" + result.getDistance()); * counter++; * } * else * { * Console.WriteLine(counter + " Nejlepší jedinec: " + orderList[i]); * counter++; * } * * } * * Console.ReadLine(); */ }