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); }
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(); }
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()); }
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(); }
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); }