示例#1
0
        public override void ZnajdzOptimum()
        {
            int poprawy = 0;

            ushort[] genotyp = reprezentacjaRozwiazania.ZwrocGenotyp1Wymiarowy(),
            tmpGenotyp = (ushort[])genotyp.Clone();

            AOsobnik osobnik = losowanie.ZwrocOsobnika();
            ProblemOptymalizacyjny       problemOptymalizacyjny = osobnik.ZwrocInstancjeProblemu();
            Dictionary <string, float[]> wynik = osobnik.FunkcjaDopasowania(reprezentacjaRozwiazania);
            ReprezentacjaRozwiazania     tmpReprezentacjaRozwiazanie = new ReprezentacjaRozwiazania(tmpGenotyp);

            do
            {
                int start  = 1,
                    koniec = problemOptymalizacyjny.ZwrocDlugoscGenotypu() - 1;

                poprawy = 0;
                for (int i = start; i < koniec; i++)
                {
                    int liczba1 = losowy.Next(2, problemOptymalizacyjny.ZwrocDlugoscGenotypu()),
                        liczba2 = losowy.Next(2, problemOptymalizacyjny.ZwrocDlugoscGenotypu());

                    ushort tmpWartosc = tmpGenotyp[liczba1];
                    tmpGenotyp[liczba1] = tmpGenotyp[liczba2];
                    tmpGenotyp[liczba2] = tmpWartosc;

                    tmpReprezentacjaRozwiazanie.ZmienGenotyp(tmpGenotyp);

                    Dictionary <string, float[]> tmpWynik = osobnik.FunkcjaDopasowania(tmpReprezentacjaRozwiazanie);

                    if (tmpWynik["max"][0] > wynik["max"][0])
                    {
                        if (problemOptymalizacyjny.CzyIstniejaOgraniczenia() && (tmpWynik["min"][0] > problemOptymalizacyjny.ZwrocOgraniczeniaProblemu()[0]))
                        {
                            continue;
                        }

                        genotyp = (ushort[])tmpGenotyp.Clone();
                        reprezentacjaRozwiazania.ZmienGenotyp(genotyp);

                        wynik["max"][0] = tmpWynik["max"][0];
                        wynik["min"][0] = tmpWynik["min"][0];
                        poprawy++;
                    }
                    else
                    {
                        tmpGenotyp = (ushort[])genotyp.Clone();
                        tmpReprezentacjaRozwiazanie.ZmienGenotyp(genotyp);
                    }
                }
            } while (poprawy > 0);
        }
示例#2
0
        public override IAlgorytm ZbudujAlgorytm(Dictionary <string, string> parametry, ProblemOptymalizacyjny problem)
        {
            int iloscRozwiazan = 100,
                iloscElementow = problem.ZwrocDlugoscGenotypu();

            AOsobnik      osobnik;
            AnalizaRLS_RS analiza;

            switch (parametry["problem"])
            {
            case "Problem Plecakowy":
                osobnik = new OsobnikKP(problem);
                analiza = new AnalizaRLS_RS(osobnik, short.Parse(parametry["liczbaIteracji"]), short.Parse(parametry["czasPoszukiwania"]));

                return(new RS(new LosowanieKP(osobnik), iloscRozwiazan, iloscElementow, analiza));

            case "Problem Komiwojażera":
                osobnik = new OsobnikTSP(problem);
                analiza = new AnalizaRLS_RS(osobnik, short.Parse(parametry["liczbaIteracji"]), short.Parse(parametry["czasPoszukiwania"]));

                return(new RS(new LosowanieTSP(osobnik), iloscRozwiazan, iloscElementow, analiza));

            case "Problem Podróżującego Złodzieja":
                osobnik = new OsobnikTTP(problem);
                analiza = new AnalizaRLS_RS(osobnik, short.Parse(parametry["liczbaIteracji"]), short.Parse(parametry["czasPoszukiwania"]));

                return(new RS(new LosowanieTTP(osobnik), iloscRozwiazan, iloscElementow, analiza));
            }

            throw new Exception();
        }
示例#3
0
        public override IAlgorytm ZbudujAlgorytm(Dictionary <string, string> parametry, ProblemOptymalizacyjny problem)
        {
            // Stałe składniki Algorytmu Ewolucyjnego
            ASelekcja selekcja;

            ReprezentacjaRozwiazania[] populacja;
            AOsobnik          rozwiazanie;
            ARekombinacja     rekombinacja;
            AnalizaEwolucyjny analityka;

            switch (parametry["problem"])
            {
            case "Problem Plecakowy":
                // konfiguracja algorytmu pod Problem Plecakowy
                rozwiazanie  = new OsobnikKP(problem);
                analityka    = new AnalizaEwolucyjny(rozwiazanie, short.Parse(parametry["liczbaIteracji"]), short.Parse(parametry["czasPoszukiwania"]));
                selekcja     = new SelekcjaWektora(rozwiazanie, problem.ZwrocDlugoscGenotypu(), parametry["metodaSelekcji"]);
                rekombinacja = new RekombinacjaKP(float.Parse(parametry["pwoMutacji"]), rozwiazanie);
                populacja    = new PopulacjaKP().StworzPopulacjeBazowa(problem, ushort.Parse(parametry["rozmiarPopulacji"]), problem.ZwrocDlugoscGenotypu());

                return(new SEA(selekcja, rekombinacja, analityka, populacja, float.Parse(parametry["pwoKrzyzowania"])));

            case "Problem Komiwojażera":
                // konfiguracja algorytmu pod Problem Komiwojażera
                rozwiazanie  = new OsobnikTSP(problem);
                analityka    = new AnalizaEwolucyjny(rozwiazanie, short.Parse(parametry["liczbaIteracji"]), short.Parse(parametry["czasPoszukiwania"]));
                selekcja     = new SelekcjaWektora(rozwiazanie, problem.ZwrocDlugoscGenotypu(), parametry["metodaSelekcji"]);
                rekombinacja = new RekombinacjaTSP(float.Parse(parametry["pwoMutacji"]), rozwiazanie, parametry["rodzajKrzyzowania"]);
                populacja    = new PopulacjaTSP().StworzPopulacjeBazowa(problem, ushort.Parse(parametry["rozmiarPopulacji"]), problem.ZwrocDlugoscGenotypu());

                return(new SEA(selekcja, rekombinacja, analityka, populacja, float.Parse(parametry["pwoKrzyzowania"])));

            case "Problem Podróżującego Złodzieja":
                // konfiguracja algorytmu pod Problem Podróżującego Złodzieja
                rozwiazanie  = new OsobnikTTP(problem);
                analityka    = new AnalizaEwolucyjny(rozwiazanie, short.Parse(parametry["liczbaIteracji"]), short.Parse(parametry["czasPoszukiwania"]));
                selekcja     = new SelekcjaWektora(rozwiazanie, problem.ZwrocDlugoscGenotypu(), parametry["metodaSelekcji"]);
                rekombinacja = new RekombinacjaTTP(float.Parse(parametry["pwoMutacji"]), rozwiazanie, parametry["rodzajKrzyzowania"]);
                populacja    = new PopulacjaTTP().StworzPopulacjeBazowa(problem, ushort.Parse(parametry["rozmiarPopulacji"]), problem.ZwrocDlugoscGenotypu());

                return(new SEA(selekcja, rekombinacja, analityka, populacja, float.Parse(parametry["pwoKrzyzowania"])));
            }

            return(new SEA());
        }
示例#4
0
        public override IAlgorytm ZbudujAlgorytm(Dictionary <string, string> parametry, ProblemOptymalizacyjny problem)
        {
            AOsobnik      osobnik;
            ALosowanie    losowanie;
            AnalizaRLS_RS analiza;
            AWspinaczka   przeszukiwanieLokalne;

            int iloscRozwiazan = 100,
                iloscElementow = problem.ZwrocDlugoscGenotypu();

            switch (parametry["problem"])
            {
            case "Problem Plecakowy":
                osobnik   = new OsobnikKP(problem);
                losowanie = new LosowanieKP(osobnik);
                analiza   = new AnalizaRLS_RS(osobnik, short.Parse(parametry["liczbaIteracji"]), short.Parse(parametry["czasPoszukiwania"]));
                losowanie.SzukajNajlepszegoRozwiazania(iloscRozwiazan, iloscElementow);

                przeszukiwanieLokalne = new WspinaczkaKP(losowanie, int.Parse(parametry["parametrP"]));

                return(new HCA(przeszukiwanieLokalne, analiza));

            case "Problem Komiwojażera":
                osobnik   = new OsobnikTSP(problem);
                losowanie = new LosowanieTSP(osobnik);
                analiza   = new AnalizaRLS_RS(osobnik, short.Parse(parametry["liczbaIteracji"]), short.Parse(parametry["czasPoszukiwania"]));
                losowanie.SzukajNajlepszegoRozwiazania(iloscRozwiazan, iloscElementow);

                przeszukiwanieLokalne = new WspinaczkaTSP(losowanie, int.Parse(parametry["parametrP"]));

                return(new HCA(przeszukiwanieLokalne, analiza));

            case "Problem Podróżującego Złodzieja":
                osobnik   = new OsobnikTTP(problem);
                losowanie = new LosowanieTTP(osobnik);
                analiza   = new AnalizaRLS_RS(osobnik, short.Parse(parametry["liczbaIteracji"]), short.Parse(parametry["czasPoszukiwania"]));
                losowanie.SzukajNajlepszegoRozwiazania(iloscRozwiazan, iloscElementow);

                przeszukiwanieLokalne = new WspinaczkaTTP(losowanie, int.Parse(parametry["parametrP"]));

                return(new HCA(przeszukiwanieLokalne, analiza));
            }

            throw new Exception();
        }
示例#5
0
        public override ReprezentacjaRozwiazania[] LosujRozwiazania(ProblemOptymalizacyjny problemOptymalizacyjny, int iloscRozwiazan, int iloscElementow)
        {
            bool   startowyWektor = true;
            Random losowy         = new Random();

            ReprezentacjaRozwiazania[] rozwiazania = new ReprezentacjaRozwiazania[iloscRozwiazan];

            ushort[][]   dostepnoscPrzedmiotow = problemOptymalizacyjny.ZwrocDostepnePrzedmioty();
            LosowanieTSP losowanieTSP          = new LosowanieTSP();

            ReprezentacjaRozwiazania[] rozwiazaniaTSP = losowanieTSP.LosujRozwiazania(problemOptymalizacyjny, iloscRozwiazan, problemOptymalizacyjny.ZwrocDlugoscGenotypu());

            for (int i = 0; i < iloscRozwiazan; i++)
            {
                ushort[]   wektorTSP  = rozwiazaniaTSP[i].ZwrocGenotyp1Wymiarowy();
                ushort[][] macierzTTP = new ushort[wektorTSP.Length][];

                double polowa     = (Math.Pow(iloscRozwiazan, 2) / 2),
                       rozpietosc = Math.Abs(Math.Pow(iloscRozwiazan, 2) - (i + losowy.Next(iloscRozwiazan)) * iloscRozwiazan);

                for (int j = 0; j < wektorTSP.Length; j++)
                {
                    int index              = wektorTSP[j] - 1,
                        wartosc            = (int)Math.Abs(polowa - rozpietosc);
                    double dziesiecProcent = 0.1 * wartosc;

                    macierzTTP[j]    = new ushort[dostepnoscPrzedmiotow[0].Length + 1];
                    macierzTTP[j][0] = wektorTSP[j];

                    for (int k = 1; k < macierzTTP[j].Length; k++)
                    {
                        if ((dostepnoscPrzedmiotow[index][(k - 1)] == 1) && !startowyWektor)
                        {
                            if (polowa >= rozpietosc)
                            {
                                macierzTTP[j][k] = (ushort)((wartosc < dziesiecProcent) ? 1 : 0);
                                if (wartosc > 0)
                                {
                                    wartosc -= losowy.Next(wartosc);
                                }
                            }
                            else
                            {
                                macierzTTP[j][k] = (ushort)((wartosc < dziesiecProcent) ? 1 : 0);
                                if (wartosc > 0)
                                {
                                    wartosc -= (losowy.Next(wartosc) * 2);
                                }
                            }
                        }
                        else
                        {
                            macierzTTP[j][k] = 0;
                        }
                    }
                }

                rozwiazania[i] = new ReprezentacjaRozwiazania(macierzTTP);
                startowyWektor = false;
            }

            return(rozwiazania);
        }