Beispiel #1
0
        private static List <Osobnik> KrzyżujOX(List <Osobnik> rodzice)
        {
            Osobnik o1 = new Osobnik();
            Osobnik o2 = new Osobnik();

            for (int i = 0; i < rodzice.Count - 1; i++)
            {
                Osobnik o = KrzyżujParęOX(i, rodzice);

                if (i % 2 == 0)
                {
                    o1 = o;
                }
                else
                {
                    o2             = o;
                    rodzice[i - 1] = o1;
                    rodzice[i]     = o2;
                    o1             = new Osobnik();
                    o2             = new Osobnik();
                }
            }

            return(rodzice);
        }
Beispiel #2
0
        static void Main(string[] args)
        {
            TSP.Instancja.PrepareVariables();

            List <Osobnik> osobnicy  = new List <Osobnik>();
            Osobnik        najlepszy = new Osobnik();

            WygenerujPopulacjęPoczątkową(ref osobnicy);

            najlepszy.ocena = int.MaxValue;
            najlepszy       = TSP.Instancja.ZnajdźMinimum(osobnicy, najlepszy);

            Console.WriteLine("Minimum w populacji początkowej wynosi: " + najlepszy.ocena);

            long t1 = DateTime.Now.Ticks;

            while (TSP.Instancja.DocelowaLiczbaIteracji > TSP.Instancja.licznikGłówny)
            {
                TSP.Instancja.WykonajIterację(ref osobnicy, ref najlepszy);
            }

            TimeSpan tz = new TimeSpan(DateTime.Now.Ticks - t1);

            TSP.Instancja.Podsumuj(tz, najlepszy);

            Console.ReadKey();
        }
Beispiel #3
0
        static Osobnik[] StwórzPopulacjęZPliku(string ścieżka)
        {
            int    licznik = 0;
            string linijka;

            System.IO.StreamReader plik = new System.IO.StreamReader(@ścieżka);
            Osobnik osobnik             = new Osobnik();

            Osobnik.listaMiast = new List <Miasto>();
            while ((linijka = plik.ReadLine()) != "EOF")
            {
                if (licznik >= 7)
                {
                    string[] słowa  = linijka.Split(' ');
                    var      indeks = int.Parse(słowa[0]) - 1;
                    Osobnik.listaMiast.Add(new Miasto(indeks, double.Parse(słowa[1], CultureInfo.InvariantCulture), double.Parse(słowa[2], CultureInfo.InvariantCulture)));
                    osobnik.genotyp.Add(indeks);
                }
                licznik++;
            }
            plik.Close();

            Osobnik[] populacja = new Osobnik[wielkośćPopulacji];

            for (int i = 0; i < wielkośćPopulacji; i++)
            {
                populacja[i] = osobnik.WymieszajOsobnika();
            }

            niebo = populacja[0];

            return(populacja);
        }
Beispiel #4
0
        static Osobnik SelekcjaTurniejowa(Osobnik[] populacja)
        {
            Osobnik osobnik1 = populacja[Program.random.Next(Program.wielkośćPopulacji)];
            Osobnik osobnik2 = populacja[Program.random.Next(Program.wielkośćPopulacji)];

            return(Osobnik.PorównajOsobników(osobnik1, osobnik2));
        }
Beispiel #5
0
        private static Osobnik KrzyżujParęOX(int indeksRodziców, List <Osobnik> rodzice)
        {
            Osobnik o = new Osobnik();
            int     indeksKrzyżowania = 0;

            indeksKrzyżowania = RNG.Next(Osobnik.liczbaMiast / 2);
            for (int j = indeksKrzyżowania; j < indeksKrzyżowania + Osobnik.liczbaMiast / 2; j++)
            {
                o.trasa[j] = rodzice[indeksRodziców].trasa[j];
            }
            for (int j = indeksKrzyżowania; j < indeksKrzyżowania + Osobnik.liczbaMiast / 2; j++)
            {
                if (Array.IndexOf(o.trasa, rodzice[indeksRodziców + 1].trasa[j]) == -1)
                {
                    int indeksPrzepisanejWartości = Array.IndexOf(rodzice[indeksRodziców + 1].trasa, o.trasa[j]);
                    while (o.trasa[indeksPrzepisanejWartości] != 0)
                    {
                        indeksPrzepisanejWartości = Array.IndexOf(rodzice[indeksRodziców + 1].trasa, o.trasa[indeksPrzepisanejWartości]);
                    }
                    o.trasa[indeksPrzepisanejWartości] = rodzice[indeksRodziców + 1].trasa[j];
                }
            }
            for (int j = 0; j < Osobnik.liczbaMiast; j++)
            {
                if (Array.IndexOf(o.trasa, rodzice[indeksRodziców + 1].trasa[j]) == -1)
                {
                    o.trasa[Array.IndexOf(o.trasa, 0)] = rodzice[indeksRodziców + 1].trasa[j];
                }
            }

            return(o);
        }
Beispiel #6
0
        public Osobnik WymieszajOsobnika()
        {
            Osobnik nowyOsobnik = new Osobnik();

            nowyOsobnik.genotyp = new List <int>(genotyp).OrderBy(x => Program.random.Next()).ToList();
            return(nowyOsobnik);
        }
Beispiel #7
0
 private static void WyświetlNajlepszego(Osobnik najlepszy)
 {
     foreach (int i in najlepszy.trasa)
     {
         Console.Write(najlepszy.trasa[i] + " ");
     }
     Console.WriteLine();
 }
Beispiel #8
0
        public void Podsumuj(TimeSpan tz, Osobnik najlepszy)
        {
            Console.WriteLine("Czas wykonania w sekundach: " + tz.Seconds);

            Console.WriteLine("Liczba iteracji: " + TSP.Instancja.licznikGłówny);

            Console.WriteLine("Minimmalna ocena wynosi: " + najlepszy.ocena);

            ZwróćPoprawnąTrasę(najlepszy);
        }
Beispiel #9
0
 private void ZwróćPoprawnąTrasę(Osobnik najlepszy)
 {
     if (TSP.SprawdźPoprawnośćTrasy(najlepszy))
     {
         Console.WriteLine("Najlepsza znaleziona poprawna trasa: ");
         TSP.WyświetlNajlepszego(najlepszy);
     }
     else
     {
         Console.WriteLine("Znaleziona trasa nie jest poprawna.");
     }
 }
Beispiel #10
0
        public Osobnik ZnajdźMinimum(List <Osobnik> osobnicy, Osobnik najlepszy)
        {
            for (int i = 0; i < osobnicy.Count - 1; i++)
            {
                if (najlepszy.ocena > osobnicy[i].ocena)
                {
                    najlepszy = osobnicy[i];
                }
            }

            return(najlepszy);
        }
Beispiel #11
0
        public static Osobnik Oblicz(Osobnik trasa)
        {
            int czasObliczeń = 1000 * 60 * 30;  //30 minut

            Stopwatch stoper = new Stopwatch();

            stoper.Start();
            while (stoper.ElapsedMilliseconds <= czasObliczeń)
            {
                Osobnik sąsiad = new Osobnik();
                sąsiad.genotyp = trasa.genotyp.GetRange(0, trasa.genotyp.Count);

                int punkt1 = Program.random.Next(trasa.genotyp.Count);
                int punkt2 = Program.random.Next(trasa.genotyp.Count);
                int temp;

                temp = sąsiad.genotyp[punkt1];
                sąsiad.genotyp[punkt1] = sąsiad.genotyp[punkt2];
                sąsiad.genotyp[punkt2] = temp;

                if (sąsiad.SzybkośćTrasy() != 0 && sąsiad.SzybkośćTrasy() < trasa.SzybkośćTrasy())
                {
                    trasa = sąsiad;
                    //Console.WriteLine(trasa.SzybkośćTrasy());
                }
            }

            stoper.Stop();

            Console.WriteLine("Znaleziona ścieżka: ");
            for (int i = 0; i < trasa.genotyp.Count; i++)
            {
                Console.Write(Osobnik.listaMiast[trasa.genotyp[i]].indeks + " ");
            }
            Console.WriteLine("\nSzybkość trasy: " + trasa.SzybkośćTrasy());
            Console.WriteLine("\nLiczba baterii: " + trasa.liczbaBateriiOsobnika);

            using (System.IO.StreamWriter zapisator =
                       new System.IO.StreamWriter(@"../../Wyniki/Z" + Program.nazwaPlikuWejściowego + "-" + Program.liczbaBaterii + "-" + DateTime.Now.ToString().Replace(':', '-') + ".txt"))
            {
                zapisator.WriteLine("\nSzybkość trasy: " + trasa.SzybkośćTrasy());
                zapisator.WriteLine("\nLiczba baterii: " + trasa.liczbaBateriiOsobnika);
                zapisator.WriteLine();

                for (int i = 0; i < trasa.genotyp.Count; i++)
                {
                    zapisator.Write(Osobnik.listaMiast[trasa.genotyp[i]].indeks + " ");
                }
                zapisator.WriteLine();
            }

            return(trasa);
        }
Beispiel #12
0
        public static void Oblicz(Osobnik[] populacja, string nazwaPlikuWejściowego, int wielkośćPopulacji, int liczbaPokoleń, string krzyżowanie, int liczbaBaterii, string selekcja, double prawdopodobieństwoMutacji)
        {
            for (int i = 0; i < liczbaPokoleń; i++)
            {
                Osobnik[] nowaPopulacja = new Osobnik[wielkośćPopulacji];

                for (int j = 0; j < wielkośćPopulacji; j++)
                {
                    Osobnik tata    = Selekcja.Selekcjonuj(Program.selekcja, populacja);
                    Osobnik mama    = Selekcja.Selekcjonuj(Program.selekcja, populacja);
                    Osobnik dziecko = Krzyżowanie.Krzyżuj(krzyżowanie, tata, mama);

                    //konkurencja między rodzicami i dzieckiem
                    if (tata.SzybkośćTrasy() < mama.SzybkośćTrasy())
                    {
                        nowaPopulacja[j] = tata;
                    }
                    else
                    {
                        nowaPopulacja[j] = mama;
                    }

                    if (dziecko.SzybkośćTrasy() < nowaPopulacja[j].SzybkośćTrasy())
                    {
                        nowaPopulacja[j] = dziecko;
                    }
                }
                populacja = nowaPopulacja;
            }

            Console.WriteLine("Znaleziona ścieżka: ");
            for (int i = 0; i < Program.niebo.genotyp.Count; i++)
            {
                Console.Write(Osobnik.listaMiast[Program.niebo.genotyp[i]].indeks + " ");
            }
            Console.WriteLine("\nSzybkość trasy: " + Program.niebo.SzybkośćTrasy());
            Console.WriteLine("\nLiczba baterii: " + Program.niebo.liczbaBateriiOsobnika);

            using (System.IO.StreamWriter zapisator =
                       new System.IO.StreamWriter(@"../../Wyniki/" + nazwaPlikuWejściowego + "-" + wielkośćPopulacji + "-" + liczbaPokoleń + "-" + krzyżowanie + "-" + liczbaBaterii + "-" + prawdopodobieństwoMutacji + "-" + selekcja + "-" + DateTime.Now.ToString().Replace(':', '-') + ".txt"))
            {
                zapisator.WriteLine("\nSzybkość trasy: " + Program.niebo.SzybkośćTrasy());
                zapisator.WriteLine("\nLiczba baterii: " + Program.niebo.liczbaBateriiOsobnika);
                zapisator.WriteLine();

                for (int i = 0; i < Program.niebo.genotyp.Count; i++)
                {
                    zapisator.Write(Osobnik.listaMiast[Program.niebo.genotyp[i]].indeks + " ");
                }
                zapisator.WriteLine();
            }
        }
Beispiel #13
0
        static SortedList <int, int> ZmianaReprezentacjiNaSąsiedztwa(Osobnik osobnik)
        {
            SortedList <int, int> listaSąsiedztwa = new SortedList <int, int>();

            for (int i = 0; i < osobnik.genotyp.Count - 1; i++)
            {
                listaSąsiedztwa.Add(osobnik.genotyp[i], osobnik.genotyp[i + 1]);
            }

            listaSąsiedztwa.Add(osobnik.genotyp[osobnik.genotyp.Count - 1], osobnik.genotyp[0]);

            return(listaSąsiedztwa);
        }
Beispiel #14
0
        private static bool SprawdźPoprawnośćTrasy(Osobnik najlepszy)
        {
            bool result = true;

            for (int i = 0; i < najlepszy.trasa.Length; i++)
            {
                if (!najlepszy.trasa.Contains(i))
                {
                    result = false;
                }
            }

            return(result);
        }
Beispiel #15
0
 public static Osobnik Krzyżuj(string typ, Osobnik tata, Osobnik mama)
 {
     if (typ == "OX")
     {
         return(KrzyżowanieOX(tata, mama));
     }
     else if (typ == "przezWymianePodtras")
     {
         return(KrzyżowaniePrzezWymianęPodtras(tata, mama));
     }
     else
     {
         Console.WriteLine("Podano błędny typ krzyżowania.");
         return(null);
     }
 }
Beispiel #16
0
        static Osobnik ZmianaReprezentacjiNaŚcieżkową(SortedList <int, int> listaSąsiedztwa)
        {
            Osobnik osobnik = new Osobnik();
            int     indeks  = 0;
            int     element = 0;

            osobnik.genotyp.Add(listaSąsiedztwa.Keys[indeks]);

            for (int i = 0; i < listaSąsiedztwa.Count; i++)
            {
                element = listaSąsiedztwa.Values[indeks];
                osobnik.genotyp.Add(element);
                indeks = listaSąsiedztwa.IndexOfKey(element);
            }

            osobnik.genotyp.RemoveAt(osobnik.genotyp.Count - 1);

            return(osobnik);
        }
Beispiel #17
0
        public void WykonajIterację(ref List <Osobnik> osobnicy, ref Osobnik najlepszy)
        {
            List <Osobnik> rodzice = new List <Osobnik>();

            rodzice = TSP.WybierzTurniej(osobnicy, TSP.Instancja.distances, TSP.Instancja.uczestnicyTurnieju);

            rodzice = TSP.KrzyżujOX(rodzice);

            rodzice = TSP.Mutuj(rodzice, Osobnik.liczbaMiast, TSP.Instancja.parametrMutacji);

            foreach (Osobnik o in rodzice)
            {
                o.OceńOsobnika(TSP.Instancja.distances);
            }

            najlepszy = new Osobnik(TSP.Instancja.ZnajdźMinimumWPętli(osobnicy, najlepszy, TSP.Instancja.licznikGłówny));
            osobnicy  = rodzice;
            TSP.Instancja.licznikGłówny++;
        }
Beispiel #18
0
 public static Osobnik PorównajOsobników(Osobnik osobnik1, Osobnik osobnik2)
 {
     if (osobnik1.SzybkośćTrasy() < osobnik2.SzybkośćTrasy())
     {
         if (osobnik1.SzybkośćTrasy() != 0)
         {
             return(osobnik1);
         }
         else if (osobnik2.SzybkośćTrasy() != 0)
         {
             return(osobnik2);
         }
         else
         {
             return(osobnik1);
         }
     }
     else
     {
         return(osobnik2);
     }
 }
Beispiel #19
0
 private Osobnik ZnajdźMinimumWPętli(List <Osobnik> rodzice, Osobnik najlepszy, int licznikGłówny)
 {
     for (int i = 0; i < rodzice.Count; i++)
     {
         if (najlepszy.ocena > rodzice[i].ocena)
         {
             najlepszy = rodzice[i];
             StringBuilder iteracja = new StringBuilder();
             iteracja.Append("Iteracja: ");
             iteracja.Append(licznikGłówny.ToString());
             iteracja.Append((licznikGłówny > 100000) ? "\t" : "\t\t");
             Console.Write(iteracja);
             //Console.Write("Iteracja: " + licznikGłówny + "\t");
             Console.Write("Minimum wynosi: " + najlepszy.ocena + "\t");
             for (int j = 0; j < najlepszy.ocena / 1000; j++)
             {
                 Console.Write("*");
             }
             Console.WriteLine();
         }
     }
     return(najlepszy);
 }
Beispiel #20
0
        static Osobnik KrzyżowanieOX(Osobnik tata, Osobnik mama)
        {
            int punkt1 = Program.random.Next(tata.genotyp.Count);
            int punkt2 = Program.random.Next(tata.genotyp.Count);

            if (punkt1 > punkt2)
            {
                int temp = punkt1;
                punkt1 = punkt2;
                punkt2 = temp;
            }

            Osobnik dziecko = new Osobnik();

            for (int i = punkt1 + 1; i <= punkt2; i++)
            {
                dziecko.genotyp.Add(tata.genotyp[i]);
            }

            for (int i = 0; i < tata.genotyp.Count; i++)
            {
                if (!dziecko.genotyp.Contains(mama.genotyp[i]))
                {
                    dziecko.genotyp.Add(mama.genotyp[i]);
                }
            }

            if (Program.random.NextDouble() < Program.prawdopodobieństwoMutacji)
            {
                dziecko = dziecko.Mutacja();
            }

            Program.niebo = Osobnik.PorównajOsobników(dziecko, Program.niebo);

            return(dziecko);
        }
Beispiel #21
0
 public Osobnik(Osobnik o)
 {
     this.id    = o.id;
     this.ocena = o.ocena;
     this.trasa = o.trasa;
 }
Beispiel #22
0
        static Osobnik KrzyżowaniePrzezWymianęPodtras(Osobnik tata, Osobnik mama)
        {
            SortedList <int, int> tataGenotypSąsiedztwa = ZmianaReprezentacjiNaSąsiedztwa(tata);
            SortedList <int, int> mamaGenotypSąsiedztwa = ZmianaReprezentacjiNaSąsiedztwa(mama);

            SortedList <int, int> dzieckoGenotypSąsiedztwa = new SortedList <int, int>();

            int  długośćOsobnika        = tataGenotypSąsiedztwa.Count;
            bool flaga                  = false; //mama
            int  punktPoczątkowy        = Program.random.Next(1, tataGenotypSąsiedztwa.Count);
            int  długośćObecnejPodtrasy = Program.random.Next(1, tataGenotypSąsiedztwa.Count);
            int  losowyIndeksRodzica    = 0;
            int  wylosowanaWartość      = 0;

            dzieckoGenotypSąsiedztwa.Add(punktPoczątkowy, tataGenotypSąsiedztwa[punktPoczątkowy]);
            int ostatnioDodanyKluczDziecka   = punktPoczątkowy;
            int ostatnioDodanaWartośćDziecka = tataGenotypSąsiedztwa[punktPoczątkowy];

            tataGenotypSąsiedztwa.Remove(ostatnioDodanyKluczDziecka);
            tataGenotypSąsiedztwa.RemoveAt(tataGenotypSąsiedztwa.IndexOfValue(ostatnioDodanyKluczDziecka));
            mamaGenotypSąsiedztwa.Remove(ostatnioDodanyKluczDziecka);
            mamaGenotypSąsiedztwa.RemoveAt(mamaGenotypSąsiedztwa.IndexOfValue(ostatnioDodanyKluczDziecka));

            while (dzieckoGenotypSąsiedztwa.Count < długośćOsobnika - 1)
            {
                if (tataGenotypSąsiedztwa.Count < mamaGenotypSąsiedztwa.Count)
                {
                    długośćObecnejPodtrasy = Program.random.Next(1, tataGenotypSąsiedztwa.Count);
                }
                else
                {
                    długośćObecnejPodtrasy = Program.random.Next(1, mamaGenotypSąsiedztwa.Count);
                }

                if (flaga == true)      //tata
                {
                    for (int i = 0; i < długośćObecnejPodtrasy; i++)
                    {
                        if (tataGenotypSąsiedztwa.ContainsKey(ostatnioDodanaWartośćDziecka) && !dzieckoGenotypSąsiedztwa.ContainsValue(tataGenotypSąsiedztwa[ostatnioDodanaWartośćDziecka]))
                        {
                            dzieckoGenotypSąsiedztwa.Add(ostatnioDodanaWartośćDziecka, tataGenotypSąsiedztwa[ostatnioDodanaWartośćDziecka]);

                            ostatnioDodanyKluczDziecka   = ostatnioDodanaWartośćDziecka;
                            ostatnioDodanaWartośćDziecka = tataGenotypSąsiedztwa[ostatnioDodanaWartośćDziecka];
                            if (mamaGenotypSąsiedztwa.ContainsValue(ostatnioDodanaWartośćDziecka))
                            {
                                mamaGenotypSąsiedztwa.RemoveAt(mamaGenotypSąsiedztwa.IndexOfValue(ostatnioDodanaWartośćDziecka));
                            }
                            tataGenotypSąsiedztwa.Remove(ostatnioDodanyKluczDziecka);
                        }
                        else //jeśli dziecko już zawiera tę wartość, losujemy jakąś inną z puli wartości taty
                        {
                            losowyIndeksRodzica = Program.random.Next(tataGenotypSąsiedztwa.Count);
                            wylosowanaWartość   = tataGenotypSąsiedztwa[tataGenotypSąsiedztwa.Keys[losowyIndeksRodzica]];
                            if (!dzieckoGenotypSąsiedztwa.ContainsValue(wylosowanaWartość))
                            {
                                dzieckoGenotypSąsiedztwa.Add(ostatnioDodanaWartośćDziecka, wylosowanaWartość);

                                ostatnioDodanyKluczDziecka   = ostatnioDodanaWartośćDziecka;
                                ostatnioDodanaWartośćDziecka = wylosowanaWartość;
                                if (mamaGenotypSąsiedztwa.ContainsValue(ostatnioDodanaWartośćDziecka))
                                {
                                    mamaGenotypSąsiedztwa.RemoveAt(mamaGenotypSąsiedztwa.IndexOfValue(ostatnioDodanaWartośćDziecka));
                                }
                                tataGenotypSąsiedztwa.Remove(ostatnioDodanyKluczDziecka);
                            }
                        }
                    }
                    flaga = false;
                }
                else  //mama
                {
                    for (int i = 0; i < długośćObecnejPodtrasy; i++)
                    {
                        if (mamaGenotypSąsiedztwa.ContainsKey(ostatnioDodanaWartośćDziecka) && !dzieckoGenotypSąsiedztwa.ContainsValue(mamaGenotypSąsiedztwa[ostatnioDodanaWartośćDziecka]))
                        {
                            dzieckoGenotypSąsiedztwa.Add(ostatnioDodanaWartośćDziecka, mamaGenotypSąsiedztwa[ostatnioDodanaWartośćDziecka]);

                            ostatnioDodanyKluczDziecka   = ostatnioDodanaWartośćDziecka;
                            ostatnioDodanaWartośćDziecka = mamaGenotypSąsiedztwa[ostatnioDodanaWartośćDziecka];
                            if (tataGenotypSąsiedztwa.ContainsValue(ostatnioDodanaWartośćDziecka))
                            {
                                tataGenotypSąsiedztwa.RemoveAt(tataGenotypSąsiedztwa.IndexOfValue(ostatnioDodanaWartośćDziecka));
                            }
                            mamaGenotypSąsiedztwa.Remove(ostatnioDodanyKluczDziecka);
                        }
                        else
                        {
                            losowyIndeksRodzica = Program.random.Next(mamaGenotypSąsiedztwa.Count);
                            wylosowanaWartość   = mamaGenotypSąsiedztwa[mamaGenotypSąsiedztwa.Keys[losowyIndeksRodzica]];

                            if (!dzieckoGenotypSąsiedztwa.ContainsValue(wylosowanaWartość))
                            {
                                dzieckoGenotypSąsiedztwa.Add(ostatnioDodanaWartośćDziecka, wylosowanaWartość);

                                ostatnioDodanyKluczDziecka   = ostatnioDodanaWartośćDziecka;
                                ostatnioDodanaWartośćDziecka = wylosowanaWartość;
                                if (tataGenotypSąsiedztwa.ContainsValue(ostatnioDodanaWartośćDziecka))
                                {
                                    tataGenotypSąsiedztwa.RemoveAt(tataGenotypSąsiedztwa.IndexOfValue(ostatnioDodanaWartośćDziecka));
                                }
                                mamaGenotypSąsiedztwa.Remove(ostatnioDodanyKluczDziecka);
                            }
                        }
                    }
                    flaga = true;
                }
            }

            dzieckoGenotypSąsiedztwa.Add(ostatnioDodanaWartośćDziecka, punktPoczątkowy);

            Osobnik dziecko = ZmianaReprezentacjiNaŚcieżkową(dzieckoGenotypSąsiedztwa);

            if (Program.random.NextDouble() < Program.prawdopodobieństwoMutacji)
            {
                dziecko = dziecko.Mutacja();
            }

            Program.niebo = Osobnik.PorównajOsobników(dziecko, Program.niebo);

            return(dziecko);
        }