예제 #1
0
        /// <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();
        }
예제 #2
0
        /// <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);
            }
        }
예제 #3
0
        /// <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();
        }
예제 #4
0
        /// <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;
                    }
                }
            }
        }
예제 #5
0
        /// <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();
        }
예제 #6
0
        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();
             */
        }