/// <summary> /// Metoda przeszukuje przestrzeń w celu znalezienia najlepszego rozwiązania dla tablicy 1 wymiarowej /// </summary> /// <param name="listaRozwiazan">Wartość pozwalająca ustalić, czy sprawdzamy ograniczenia</param> public void SzukajNajlepszegoRozwiazania(int iloscRozwiazan, int iloscElementow) { ProblemOptymalizacyjny problemOptymalizacyjny = osobnik.ZwrocInstancjeProblemu(); ReprezentacjaRozwiazania[] listaRozwiazan = LosujRozwiazania(problemOptymalizacyjny, iloscRozwiazan, iloscElementow); najlepszeRozwiazanie = listaRozwiazan[0]; najlepszyWynik = osobnik.FunkcjaDopasowania(listaRozwiazan[0]); int iterator = 1; while (problemOptymalizacyjny.CzyIstniejaOgraniczenia()) { //System.Console.WriteLine("while: "+osobnik.FunkcjaDopasowania(listaRozwiazan[iterator])["max"][0] + " " + osobnik.FunkcjaDopasowania(listaRozwiazan[iterator])["min"][0]); if (osobnik.FunkcjaDopasowania(listaRozwiazan[iterator])["min"][0] <= problemOptymalizacyjny.ZwrocOgraniczeniaProblemu()[0]) { najlepszeRozwiazanie = listaRozwiazan[iterator]; najlepszyWynik = osobnik.FunkcjaDopasowania(listaRozwiazan[iterator]); } iterator++; if (listaRozwiazan.Length == iterator) { break; } } foreach (ReprezentacjaRozwiazania rozwiazanie in listaRozwiazan) { Dictionary <string, float[]> wynikElementu = osobnik.FunkcjaDopasowania(rozwiazanie); if ((najlepszyWynik != null) && (wynikElementu["max"][0] > najlepszyWynik["max"][0])) { if (problemOptymalizacyjny.CzyIstniejaOgraniczenia() && (wynikElementu["min"][0] > problemOptymalizacyjny.ZwrocOgraniczeniaProblemu()[0])) { continue; } najlepszeRozwiazanie = rozwiazanie; najlepszyWynik = wynikElementu; } } }
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); }