예제 #1
0
        public static Osobnik[] GenerujŚcieżkowoZachłannie(int liczbaWierzchołków, int liczbaOsobników)
        {
            Osobnik[] populacja = new Osobnik[liczbaOsobników];

            FenotypŚcieżkowo fenotyp      = new FenotypŚcieżkowo();
            FunkcjaCelu      funkcja_celu = new FunkcjaCelu();

            Parallel.For(0, liczbaOsobników, indeks =>
            {
                int[] tymczasowa_tablica = new int[liczbaWierzchołków];
                tymczasowa_tablica       = Zachłanny.WygenerujOsobnika();

                Osobnik wygenerowany_osobnik = new Osobnik(tymczasowa_tablica, fenotyp, funkcja_celu);

                while (wygenerowany_osobnik.Liczba_baterii > 99)
                {
                    tymczasowa_tablica   = Zachłanny.WygenerujOsobnika();
                    wygenerowany_osobnik = new Osobnik(tymczasowa_tablica, fenotyp, funkcja_celu);
                }

                populacja[indeks] = wygenerowany_osobnik;
            });

            Console.WriteLine("wygenerowano");
            return(populacja);
        }
        public override Osobnik DokonajRekombinacji(Osobnik mama, Osobnik tata, Mutacja mutacja, Fenotyp fenotyp, FunkcjaCelu funkcja_celu)
        {
            int     liczba_miast = Miasta.Liczba_miast;
            Osobnik dziecko;

            int[] genotyp_dziecka = new int[liczba_miast];

            int punkt_przecięcia = LosowaKlasa.Los.Next(liczba_miast);

            for (int i = 0; i < punkt_przecięcia; i++)
            {
                genotyp_dziecka[i] = mama.Genotyp[i];
            }

            for (int i = punkt_przecięcia; i < liczba_miast; i++)
            {
                genotyp_dziecka[i] = tata.Genotyp[i];
            }


            double wylosowana_liczba = LosowaKlasa.Los.NextDouble();

            if (wylosowana_liczba < mutacja.Prawdopodobieństwo_mutacji)
            {
                genotyp_dziecka = mutacja.Mutuj(genotyp_dziecka);
            }

            dziecko = new Osobnik(genotyp_dziecka, fenotyp, funkcja_celu);

            return(dziecko);
        }
예제 #3
0
        public static Osobnik[] GenerujŚcieżkowoLosowo(int liczbaWierzchołków, int liczbaOsobników)
        {
            Osobnik[] populacja = new Osobnik[liczbaOsobników];


            FenotypŚcieżkowo fenotyp      = new FenotypŚcieżkowo();
            FunkcjaCelu      funkcja_celu = new FunkcjaCelu();

            Random los = new Random();

            Parallel.For(0, liczbaOsobników, indeks =>
            {
                int[] tymczasowa_tablica     = Enumerable.Range(1, liczbaWierzchołków).ToArray();
                int[] tymczasowa_tablica2    = tymczasowa_tablica.OrderBy(x => los.Next()).ToArray();
                Osobnik wygenerowany_osobnik = new Osobnik(tymczasowa_tablica2, fenotyp, funkcja_celu);

                while (wygenerowany_osobnik.Liczba_baterii > 99)
                {
                    for (int j = 0; j < liczbaWierzchołków; j++)
                    {
                        tymczasowa_tablica[j] = j + 1;
                    }
                    tymczasowa_tablica2  = tymczasowa_tablica.OrderBy(x => los.Next()).ToArray();
                    wygenerowany_osobnik = new Osobnik(tymczasowa_tablica2, fenotyp, funkcja_celu);
                }

                populacja[indeks] = wygenerowany_osobnik;
            });

            Console.WriteLine("wygenerowano");
            return(populacja);
        }
예제 #4
0
        public override Osobnik DokonajRekombinacji(Osobnik mama, Osobnik tata, Mutacja mutacja, Fenotyp fenotyp, FunkcjaCelu funkcja_celu)
        {
            int liczba_miast = Miasta.Liczba_miast;

            int[] genotyp_dziecka = new int[liczba_miast];

            Osobnik dziecko;

            int punkt_przecięcia  = LosowaKlasa.Los.Next(0, liczba_miast);
            int punkt_przecięcia2 = LosowaKlasa.Los.Next(punkt_przecięcia, liczba_miast);

            bool[] czy_użyte = new bool[liczba_miast];

            for (int i = punkt_przecięcia; i < punkt_przecięcia2; i++)
            {
                genotyp_dziecka[i]             = mama.Genotyp[i];
                czy_użyte[mama.Genotyp[i] - 1] = true;
            }

            int indeks = punkt_przecięcia2;

            for (int i = punkt_przecięcia2; i < liczba_miast; i++)
            {
                while (czy_użyte[tata.Genotyp[indeks] - 1])
                {
                    indeks++;
                    indeks %= liczba_miast;
                }

                genotyp_dziecka[i] = tata.Genotyp[indeks];
                indeks++;
                indeks %= liczba_miast;
            }

            for (int i = 0; i < punkt_przecięcia; i++)
            {
                while (czy_użyte[tata.Genotyp[indeks] - 1])
                {
                    indeks++;
                    indeks %= liczba_miast;
                }

                genotyp_dziecka[i] = tata.Genotyp[indeks];
                indeks++;
                indeks %= liczba_miast;
            }

            double wylosowana_liczba = LosowaKlasa.Los.NextDouble();

            if (wylosowana_liczba < mutacja.Prawdopodobieństwo_mutacji)
            {
                genotyp_dziecka = mutacja.Mutuj(genotyp_dziecka);
            }

            dziecko = new Osobnik(genotyp_dziecka, fenotyp, funkcja_celu);

            return(dziecko);
        }
예제 #5
0
        public override Osobnik DokonajSelekcji(Osobnik[] populacja, Fenotyp fenotyp, FunkcjaCelu funkcja_celu)
        {
            int indeks_kandydata1 = LosowaKlasa.Los.Next(Algorytm.Liczba_osobników);
            int indeks_kandydata2 = LosowaKlasa.Los.Next(Algorytm.Liczba_osobników);

            Osobnik kandydat1 = populacja[indeks_kandydata1];
            Osobnik kandydat2 = populacja[indeks_kandydata2];

            if (kandydat1.Wartość < kandydat2.Wartość)
            {
                return(kandydat1);
            }
            else
            {
                return(kandydat2);
            }
        }
예제 #6
0
        public override Osobnik DokonajRekombinacji(Osobnik mama, Osobnik tata, Mutacja mutacja, Fenotyp fenotyp, FunkcjaCelu funkcja_celu)
        {
            int liczba_miast = Miasta.Liczba_miast;

            int[] genotyp_dziecka = new int[liczba_miast];

            Osobnik dziecko;

            int[] na_którym_miejscu_w_matce = new int[liczba_miast];

            for (int i = 0; i < liczba_miast; i++)
            {
                na_którym_miejscu_w_matce[mama.Genotyp[i] - 1] = i;
            }

            int indeks = 0;

            do
            {
                genotyp_dziecka[indeks] = mama.Genotyp[indeks];
                indeks = na_którym_miejscu_w_matce[tata.Genotyp[indeks] - 1];
            } while (indeks != 0);

            for (int i = 0; i < liczba_miast; i++)
            {
                if (genotyp_dziecka[i] == 0)
                {
                    genotyp_dziecka[i] = tata.Genotyp[i];
                }
            }

            double wylosowana_liczba = LosowaKlasa.Los.NextDouble();

            if (wylosowana_liczba < mutacja.Prawdopodobieństwo_mutacji)
            {
                genotyp_dziecka = mutacja.Mutuj(genotyp_dziecka);
            }

            dziecko = new Osobnik(genotyp_dziecka, fenotyp, funkcja_celu);

            return(dziecko);
        }
예제 #7
0
        public static Osobnik[] GenerujKolejkowo12345(int liczbaWierzchołków, int liczbaOsobników)
        {
            Osobnik[] populacja = new Osobnik[liczbaOsobników];


            FenotypŚcieżkowo fenotyp      = new FenotypŚcieżkowo();
            FunkcjaCelu      funkcja_celu = new FunkcjaCelu();

            Parallel.For(0, liczbaOsobników, indeks =>
            {
                int[] tymczasowa_tablica = new int[liczbaWierzchołków];

                Osobnik wygenerowany_osobnik = new Osobnik(tymczasowa_tablica, fenotyp, funkcja_celu);

                populacja[indeks] = wygenerowany_osobnik;
            });

            Console.WriteLine("wygenerowano");
            return(populacja);
        }
예제 #8
0
        public override Osobnik DokonajSelekcji(Osobnik[] populacja, Fenotyp fenotyp, FunkcjaCelu funkcja_celu)
        {
            Osobnik[] tymczasowa_populacja = new Osobnik[Algorytm.Liczba_osobników];
            populacja.CopyTo(tymczasowa_populacja, 0);

            tymczasowa_populacja = tymczasowa_populacja.OrderByDescending(x => x.Wartość).ToArray();


            double wylosowane_prawdopodobieństwo = LosowaKlasa.Los.NextDouble();
            double akumulator_prawdopodobieństw  = 0;

            for (int i = 0; i < Algorytm.Liczba_osobników; i++)
            {
                akumulator_prawdopodobieństw += prawdopodobieństwa[i];
                if (akumulator_prawdopodobieństw >= wylosowane_prawdopodobieństwo)
                {
                    return(tymczasowa_populacja[i]);
                }
            }
            Console.WriteLine("UPS");
            return(new Osobnik(null, null, null));
        }
예제 #9
0
        private void LiczPokolenie()
        {
            Parallel.For(0, liczba_osobników, indeks =>
            {
                Osobnik mama = selekcja.DokonajSelekcji(populacja, fenotyp, funkcja_celu);
                Osobnik tata = selekcja.DokonajSelekcji(populacja, fenotyp, funkcja_celu);

                Osobnik dziecko = rekombinacja.DokonajRekombinacji(mama, tata, mutacja, fenotyp, funkcja_celu);
                while (dziecko.Liczba_baterii > 99)
                {
                    mama    = selekcja.DokonajSelekcji(populacja, fenotyp, funkcja_celu);
                    tata    = selekcja.DokonajSelekcji(populacja, fenotyp, funkcja_celu);
                    dziecko = rekombinacja.DokonajRekombinacji(mama, tata, mutacja, fenotyp, funkcja_celu);
                }

                nowa_populacja[indeks] = dziecko;
            });



            nowa_populacja.CopyTo(populacja, 0);

            ++numer_pokolenia;

            czy_do_nieba      = true;
            kandydat_do_nieba = Najlepszy(populacja);


            if (kandydat_do_nieba.Wartość >= niebo.Last().Value.Wartość)
            {
                czy_do_nieba = false;
            }
            if (czy_do_nieba)
            {
                niebo.Clear();
                niebo.Add(numer_pokolenia, kandydat_do_nieba);
            }
        }
예제 #10
0
        public static Osobnik[] GenerujKolejkowoLosowo(int liczbaWierzchołków, int liczbaOsobników)
        {
            Osobnik[] populacja = new Osobnik[liczbaOsobników];

            FenotypKolejkowo fenotyp      = new FenotypKolejkowo();
            FunkcjaCelu      funkcja_celu = new FunkcjaCelu();


            Parallel.For(0, liczbaOsobników, indeks =>
            {
                int[] tymczasowa_tablica = new int[liczbaWierzchołków];

                Random los = new Random();

                for (int j = 0; j < liczbaWierzchołków; j++)
                {
                    tymczasowa_tablica[j] = los.Next(1, liczbaWierzchołków + 1 - j);
                }
                Osobnik wygenerowany_osobnik = new Osobnik(tymczasowa_tablica, fenotyp, funkcja_celu);

                while (wygenerowany_osobnik.Liczba_baterii > 99)
                {
                    for (int j = 0; j < liczbaWierzchołków; j++)
                    {
                        tymczasowa_tablica[j] = los.Next(1, liczbaWierzchołków + 1 - j);
                    }
                    wygenerowany_osobnik = new Osobnik(tymczasowa_tablica, fenotyp, funkcja_celu);
                }



                populacja[indeks] = wygenerowany_osobnik;
            });

            Console.WriteLine("wygenerowano");
            return(populacja);
        }
예제 #11
0
 public abstract Osobnik DokonajRekombinacji(Osobnik mama, Osobnik tata, Mutacja mutacja, Fenotyp fenotyp, FunkcjaCelu funkcja_celu);
예제 #12
0
        static void Wykonaj(string ścieżka_startowa)
        {
            string       ścieżka          = ścieżka_startowa; // domyślnie "parametry.txt"
            StreamReader czytany_strumień = new StreamReader(ścieżka);

            // lista miast
            string ścieżka_do_miast = czytany_strumień.ReadLine();

            // wielkość populacji
            int wielkość_populacji = Convert.ToInt32(czytany_strumień.ReadLine());

            // rodzaj algorytmu
            int nr_algorytmu = Convert.ToInt32(czytany_strumień.ReadLine());

            // populacja startowa
            int nr_generowania_populacji_startowej = Convert.ToInt32(czytany_strumień.ReadLine());

            // selekcja
            int      nr_selekcji = Convert.ToInt32(czytany_strumień.ReadLine());
            Selekcja selekcja;

            if (nr_selekcji == 0)
            {
                selekcja = new SelekcjaTurniejowa();
            }
            else
            {
                selekcja = new SelekcjaRuletkaRankingowa();
                double[] prawdopodobieństwa = new double[wielkość_populacji];
                int      suma = 0;
                for (int i = 0; i < prawdopodobieństwa.Length; i++)
                {
                    prawdopodobieństwa[i] = i + 1;
                    suma += i + 1;
                }
                for (int i = 0; i < prawdopodobieństwa.Length; i++)
                {
                    prawdopodobieństwa[i] = prawdopodobieństwa[i] / suma;
                }
                selekcja.Prawdopodobieństwa = prawdopodobieństwa;
            }

            // rekombinacja, fenotyp
            int          nr_rekombinacji = Convert.ToInt32(czytany_strumień.ReadLine());
            Rekombinacja rekombinacja;
            Fenotyp      fenotyp;

            Miasta.Lista_miast = WczytywanieZPliku.Wczytaj(ścieżka_do_miast);
            if (nr_rekombinacji == 0)
            {
                rekombinacja = new RekombinacjaPMX();
                fenotyp      = new FenotypŚcieżkowo();
            }
            else if (nr_rekombinacji == 1)
            {
                rekombinacja = new RekombinacjaCięcieIŁączenie();
                fenotyp      = new FenotypKolejkowo();
            }
            else if (nr_rekombinacji == 2)
            {
                rekombinacja = new RekombinacjaCX();
                fenotyp      = new FenotypŚcieżkowo();
            }
            else
            {
                rekombinacja = new RekombinacjaOX();
                fenotyp      = new FenotypŚcieżkowo();
            }


            // prawdopodobieństwo mutacji w %
            double prawdopodobieństwo_mutacji = Convert.ToDouble(czytany_strumień.ReadLine()) / 100;

            // mutacja
            int     nr_mutacji = Convert.ToInt32(czytany_strumień.ReadLine());
            Mutacja mutacja;

            if (nr_rekombinacji == 1)
            {
                mutacja = new MutacjaKolejkowa(prawdopodobieństwo_mutacji);
            }
            else
            {
                if (nr_mutacji == 0)
                {
                    mutacja = new MutacjaPrzezZamianęMiast(prawdopodobieństwo_mutacji);
                }
                else
                {
                    mutacja = new MutacjaINVEROVER(prawdopodobieństwo_mutacji);
                }
            }


            // warunek stopu
            string wiersz = czytany_strumień.ReadLine();

            string[] podzielony_wiersz          = wiersz.Split(' ');
            Algorytm.WarunekStopu warunek_stopu = (Algorytm.WarunekStopu)Convert.ToInt32(podzielony_wiersz[0]);
            int parametr_stopu = Convert.ToInt32(podzielony_wiersz[1]);

            // liczba powtórzeń algorytmu
            int liczba_powtórzeń = Convert.ToInt32(czytany_strumień.ReadLine());

            // ścieżka, gdzie zapisaywane są wyniki
            string ścieżka_do_wyników = czytany_strumień.ReadLine();

            czytany_strumień.Close();

            FunkcjaCelu funkcja_celu = new FunkcjaCelu();

            Osobnik[] wyniki         = new Osobnik[liczba_powtórzeń];
            int[]     numery_pokoleń = new int[liczba_powtórzeń];
            double[]  czasy_wykonań  = new double[liczba_powtórzeń];


            Stopwatch stoper = new Stopwatch();

            stoper.Start();

            if (nr_algorytmu == 0)
            {
                Parallel.For(0, liczba_powtórzeń, indeks =>
                {
                    Stopwatch stoper_indywidualny = new Stopwatch();
                    stoper_indywidualny.Start();

                    Osobnik[] populacja = new Osobnik[wielkość_populacji];
                    if (nr_rekombinacji == 1)
                    {
                        if (nr_generowania_populacji_startowej == 0)
                        {
                            populacja = Populacja.GenerujKolejkowoLosowo(Miasta.Liczba_miast, wielkość_populacji);
                        }
                        else if (nr_generowania_populacji_startowej == 1)
                        {
                            populacja = Populacja.GenerujKolejkowoZachłannie(Miasta.Liczba_miast, wielkość_populacji);
                        }
                        else
                        {
                            populacja = Populacja.GenerujKolejkowo12345(Miasta.Liczba_miast, wielkość_populacji);
                        }
                    }
                    else
                    {
                        if (nr_generowania_populacji_startowej == 0)
                        {
                            populacja = Populacja.GenerujŚcieżkowoLosowo(Miasta.Liczba_miast, wielkość_populacji);
                        }
                        else if (nr_generowania_populacji_startowej == 1)
                        {
                            populacja = Populacja.GenerujŚcieżkowoZachłannie(Miasta.Liczba_miast, wielkość_populacji);
                        }
                        else
                        {
                            populacja = Populacja.GenerujŚcieżkowo12345(Miasta.Liczba_miast, wielkość_populacji);
                        }
                    }
                    Algorytm algorytm = new Algorytm(populacja, selekcja, rekombinacja, mutacja, warunek_stopu, parametr_stopu, fenotyp, funkcja_celu);

                    Dictionary <int, Osobnik> słownik = algorytm.Oblicz();

                    wyniki[indeks]         = słownik.Last().Value;
                    numery_pokoleń[indeks] = słownik.Last().Key;


                    stoper_indywidualny.Stop();
                    czasy_wykonań[indeks] = stoper.ElapsedMilliseconds;

                    Console.WriteLine("Powtórzenie " + indeks + " : " + wyniki[indeks].Wartość);
                    Console.WriteLine("Numer pokolenia: " + numery_pokoleń[indeks]);
                    Console.WriteLine("Czas wykonania: " + czasy_wykonań[indeks] + " ms");
                    Console.WriteLine();
                });
            }
            else if (nr_algorytmu == 1)
            {
                Fenotyp fenotyp2 = new FenotypŚcieżkowo();

                Parallel.For(0, liczba_powtórzeń, indeks =>
                {
                    int[] tymczasowa_tablica = Zachłanny.WygenerujOsobnika();
                    Osobnik osobnik          = new Osobnik(tymczasowa_tablica, fenotyp2, funkcja_celu);

                    while (osobnik.Liczba_baterii > 99)
                    {
                        tymczasowa_tablica = Zachłanny.WygenerujOsobnika();
                        osobnik            = new Osobnik(tymczasowa_tablica, fenotyp2, funkcja_celu);
                    }

                    wyniki[indeks] = osobnik;
                    Console.WriteLine("Powtórzenie " + indeks + " : " + wyniki[indeks].Wartość);
                });
            }
            else
            {
            }


            stoper.Stop();
            double czas_programu = stoper.ElapsedMilliseconds;


            StreamWriter zapisywany_strumień = new StreamWriter(ścieżka_do_wyników);

            zapisywany_strumień.WriteLine(ścieżka_do_miast);

            zapisywany_strumień.WriteLine("Wielkość populacji: " + wielkość_populacji);

            if (nr_algorytmu == 0)
            {
                zapisywany_strumień.WriteLine("Algorytm: ewolucyjny");
                if (nr_generowania_populacji_startowej == 0)
                {
                    zapisywany_strumień.WriteLine("Generowanie populacji: losowe");
                }
                else if (nr_generowania_populacji_startowej == 1)
                {
                    zapisywany_strumień.WriteLine("Generowanie populacji: zachłanne");
                }
                else
                {
                    zapisywany_strumień.WriteLine("Generowanie populacji: 1 2 3 4 5...");
                }

                if (nr_selekcji == 0)
                {
                    zapisywany_strumień.WriteLine("turniej");
                }
                else
                {
                    zapisywany_strumień.WriteLine("ranking");
                }

                if (nr_rekombinacji == 0)
                {
                    zapisywany_strumień.WriteLine("PMX");
                    zapisywany_strumień.WriteLine("Prawdopodobieństwo mutacji: " + prawdopodobieństwo_mutacji * 100 + "%");
                    if (nr_mutacji == 0)
                    {
                        zapisywany_strumień.WriteLine("Mutacja: zamiana dwóch losowych miast");
                    }
                    else
                    {
                        zapisywany_strumień.WriteLine("Mutacja: INVER-OVER");
                    }
                }
                else if (nr_rekombinacji == 1)
                {
                    zapisywany_strumień.WriteLine("cięcie i łączenie");
                    zapisywany_strumień.WriteLine("Prawdopodobieństwo mutacji: " + prawdopodobieństwo_mutacji * 100 + "%");
                    zapisywany_strumień.WriteLine("Mutacja: zmiana jednej współrzędnej w reprezentacji kolejkowej");
                }
                else if (nr_rekombinacji == 2)
                {
                    zapisywany_strumień.WriteLine("CX");
                    zapisywany_strumień.WriteLine("Prawdopodobieństwo mutacji: " + prawdopodobieństwo_mutacji * 100 + "%");
                    if (nr_mutacji == 0)
                    {
                        zapisywany_strumień.WriteLine("Mutacja: zamiana dwóch losowych miast");
                    }
                    else
                    {
                        zapisywany_strumień.WriteLine("Mutacja: INVER-OVER");
                    }
                }
                else
                {
                    zapisywany_strumień.WriteLine("OX");
                    zapisywany_strumień.WriteLine("Prawdopodobieństwo mutacji: " + prawdopodobieństwo_mutacji * 100 + "%");
                    if (nr_mutacji == 0)
                    {
                        zapisywany_strumień.WriteLine("Mutacja: zamiana dwóch losowych miast");
                    }
                    else
                    {
                        zapisywany_strumień.WriteLine("Mutacja: INVER-OVER");
                    }
                }


                if (warunek_stopu == 0)
                {
                    zapisywany_strumień.WriteLine("Warunek stopu: liczba pokoleń = " + parametr_stopu);
                }
                else if ((int)warunek_stopu == 1)
                {
                    zapisywany_strumień.WriteLine("Warunek stopu: czas = " + parametr_stopu + " sek");
                }
                else if ((int)warunek_stopu == 2)
                {
                    zapisywany_strumień.WriteLine("Warunek stopu: poprawa w ostatnich k pokoleń = " + parametr_stopu);
                }
                else
                {
                    zapisywany_strumień.WriteLine("Warunek stopu: różnorodność populacji");
                }
            }
            else if (nr_algorytmu == 1)
            {
                zapisywany_strumień.WriteLine("Algorytm: zachłanny");
            }
            else
            {
                zapisywany_strumień.WriteLine("Algorytm: Sprawdzenie liczby baterii, dla jakich generowane są ścieżki w algorytmie zachłannym");
            }

            zapisywany_strumień.WriteLine("Liczba powtórzeń: " + liczba_powtórzeń);

            zapisywany_strumień.WriteLine("Czas wykonania: " + czas_programu + " ms");

            zapisywany_strumień.WriteLine();

            zapisywany_strumień.WriteLine("Wyniki:");
            foreach (Osobnik osobnik in wyniki)
            {
                zapisywany_strumień.WriteLine(osobnik.Wartość);
            }
            zapisywany_strumień.WriteLine();


            zapisywany_strumień.WriteLine("Liczby baterii:");
            foreach (Osobnik osobnik in wyniki)
            {
                zapisywany_strumień.WriteLine(osobnik.Liczba_baterii);
            }
            zapisywany_strumień.WriteLine();


            zapisywany_strumień.WriteLine("Numery pokoleń:");
            foreach (int nr_pokolenia in numery_pokoleń)
            {
                zapisywany_strumień.WriteLine(nr_pokolenia);
            }
            zapisywany_strumień.WriteLine();

            zapisywany_strumień.WriteLine("Czasy obliczeń poszczególnych powtórzeń [ms]:");
            foreach (double czas in czasy_wykonań)
            {
                zapisywany_strumień.WriteLine(czas);
            }
            zapisywany_strumień.WriteLine();

            zapisywany_strumień.WriteLine("Numery miast:");
            foreach (Osobnik osobnik in wyniki)
            {
                foreach (Współrzędne miasto in osobnik.Fenotyp)
                {
                    zapisywany_strumień.Write(miasto.Nr_miasta + " ");
                }
                zapisywany_strumień.WriteLine();
                zapisywany_strumień.WriteLine();
            }

            zapisywany_strumień.Close();

            Console.WriteLine();
            Console.WriteLine("Gotowe! Wyniki zapisano w '" + ścieżka_do_wyników + "'.");
        }
예제 #13
0
        public override Osobnik DokonajRekombinacji(Osobnik mama, Osobnik tata, Mutacja mutacja, Fenotyp fenotyp, FunkcjaCelu funkcja_celu)
        {
            int liczba_miast = Miasta.Liczba_miast;

            int[] genotyp_dziecka = new int[liczba_miast];

            Osobnik dziecko;

            int punkt_przecięcia  = LosowaKlasa.Los.Next(liczba_miast);
            int punkt_przecięcia2 = LosowaKlasa.Los.Next(liczba_miast);


            bool[] czy_dziecko_zawiera      = new bool[liczba_miast];
            int[]  na_którym_miejscu_w_ojcu = new int[liczba_miast];

            for (int i = 0; i < liczba_miast; i++)
            {
                na_którym_miejscu_w_ojcu[tata.Genotyp[i] - 1] = i;
            }

            if (punkt_przecięcia > punkt_przecięcia2)
            {
                for (int i = punkt_przecięcia; i < liczba_miast; i++)
                {
                    genotyp_dziecka[i] = tata.Genotyp[i];
                    czy_dziecko_zawiera[genotyp_dziecka[i] - 1] = true;
                }

                for (int i = 0; i < punkt_przecięcia2; i++)
                {
                    genotyp_dziecka[i] = tata.Genotyp[i];
                    czy_dziecko_zawiera[genotyp_dziecka[i] - 1] = true;
                }

                for (int i = punkt_przecięcia2; i < punkt_przecięcia; i++)
                {
                    int tymczasowa_liczba = mama.Genotyp[i];
                    while (czy_dziecko_zawiera[tymczasowa_liczba - 1])
                    {
                        tymczasowa_liczba = mama.Genotyp[na_którym_miejscu_w_ojcu[tymczasowa_liczba - 1]];
                    }
                    genotyp_dziecka[i] = tymczasowa_liczba;
                }
            }
            else
            {
                for (int i = punkt_przecięcia; i < punkt_przecięcia2; i++)
                {
                    genotyp_dziecka[i] = tata.Genotyp[i];
                    czy_dziecko_zawiera[genotyp_dziecka[i] - 1] = true;
                }

                for (int i = 0; i < punkt_przecięcia; i++)
                {
                    int tymczasowa_liczba = mama.Genotyp[i];
                    while (czy_dziecko_zawiera[tymczasowa_liczba - 1])
                    {
                        tymczasowa_liczba = mama.Genotyp[na_którym_miejscu_w_ojcu[tymczasowa_liczba - 1]];
                    }
                    genotyp_dziecka[i] = tymczasowa_liczba;
                }

                for (int i = punkt_przecięcia2; i < liczba_miast; i++)
                {
                    int tymczasowa_liczba = mama.Genotyp[i];
                    while (czy_dziecko_zawiera[tymczasowa_liczba - 1])
                    {
                        tymczasowa_liczba = mama.Genotyp[na_którym_miejscu_w_ojcu[tymczasowa_liczba - 1]];
                    }
                    genotyp_dziecka[i] = tymczasowa_liczba;
                }
            }

            double wylosowana_liczba = LosowaKlasa.Los.NextDouble();

            if (wylosowana_liczba < mutacja.Prawdopodobieństwo_mutacji)
            {
                genotyp_dziecka = mutacja.Mutuj(genotyp_dziecka);
            }

            dziecko = new Osobnik(genotyp_dziecka, fenotyp, funkcja_celu);

            return(dziecko);
        }