350 likes | 504 Views
Systemy wspomagania decyzji. Zagadnienia optymalizacji. Podstawowy problem optymalizacji bez ograniczeń (ang. unconstrained optimization ) można sformułować następująco. Dana jest funkcja zmiennych x 1 ,…,x n (zwana funkcją celu). Szukamy teraz punktu x* takiego, że.
E N D
Systemy wspomagania decyzji Zagadnienia optymalizacji
Podstawowy problem optymalizacji bez ograniczeń (ang. unconstrainedoptimization) można sformułować następująco. Dana jest funkcja zmiennych x1,…,xn (zwana funkcją celu) Szukamy teraz punktu x* takiego, że Często jednak w zastosowaniach zmienne funkcji celu spełniają pewne dodatkowe warunki (ograniczenia). Wtedy mówimy o optymalizacji z ograniczeniami (ang. constrainedoptimization). Ograniczenia te można najogólniej wyrazić poprzez pewien zbiór Ω Rn, tak więc mamy teraz zagadnienie poszukiwania x* Ω takiego, że
Przykład 1 W tym przypadku funkcja ma globalne minimum. Wartość przybliżoną można uzyskać stosując odpowiednie procedury numeryczne. Posłużono się metodą „podziału na trzy” i uzyskano następujący wynik:
Przykład 2. Niech będzie dana wzorem Wykres funkcji jest podany poniżej. Widać z niego, że globalne minimum funkcja osiąga nie we wnętrzu zbioru Ω=[-1, 4,5], ale na jego brzegu, xmin=-4,5.
Optymalizacja funkcji jednej zmiennej Jednym ze sposobów znajdowania minimum funkcji f:[a,b] Rjest rozwiązywanie równania które jest warunkiem koniecznym na istnienie ekstremum we wnętrzu przedziału Oczywiście metodę tę można stosować, gdy funkcja jest różniczkowalna i najlepiej w sytuacji, gdy możemy ją obliczyć wzorem. Ponadto należy pamiętać, że daje ona w zasadzie tylko punkty „podejrzane” o ekstremum, czego klasycznym przykładem jest funkcja f(x)=x3, dla której równanie f’(x)=3x2=0 daje x=0. Nie jest to jednak punkt, w którym funkcja ta osiąga ekstremum. W praktyce najbardziej skuteczne algorytmy znajdowania minimum dla funkcji jednej zmiennej to metody podziału.
Przykładowe algorytmy opisane w tej sekcji dają ciąg zbieżny do minimum pod warunkiem, że funkcja y=f(x) jest unimodalna. W innych przypadkach ciąg nie musi być zbieżny. Definicja. Funkcja f:[a,b]Rjest unimodalna, gdy (i) jest ciągła; (ii) istnieje punkt (a,b) taki, że f jest malejąca dla x<oraz rosnąca dla x>. Na przykład, metoda podziału z wyborem dwóch punktów t1, t2 (a, b) polega na porównaniu wartości f(t1) i f(t2), a następnie wybraniu odpowiedniego przedziału, [a, d] lub [c, b] zawierającego element optymalny x*(a, b). Mamy mianowicie: jeżeli f(t1) f(t2), to wybieramy [a, t2] jeżeli f(t1) > f(t2), to wybieramy [t1, b] W ten sposób otaczamy szukany element coraz mniejszymi przedziałami, czyli lokalizujemy go z coraz większą dokładnością. Oczywiście wyboru punktów t1 i t2 możemy dokonywać na wiele sposobów, i w ten sposób powstają różne szczegółowe warianty metody podziału.
Metoda podziału na równe trzy części Jako punkty podziału (dwa) wybieramy t1,t2(a, b) tak, aby odległości pomiędzy punktami a, t1, t2 i b były równe. Zatem
W każdej iteracji następuje zmniejszenie długości przedziału 3/2 razy. Po n iteracjach długość przedziału, w którym znajduje się minimum wynosi (2/3)n(b-a). Implementacja tego prostego algorytmu jest przedstawiona poniżej.
Przykład. Znajdziemy numerycznie minimum funkcji określonej wzorem W tym prostym przypadku można wyznaczyć ekstrema lokalne metodami analitycznymi (skończone operacje na wzorach) z warunku f’(x)=0. Mamy bowiem co daje x1=-2, x2=1. Ponieważ f’’(x)=6x+3, zatem Oznacza to, że dla x=-2 mamy maksimum, a dla x=1 minimum.
Po uruchomieniu naszego programu z przedziałem początkowym [a,b]=[0,4] otrzymujemy Tak więc minimum xmin=1 zostało poprawnie zlokalizowane.
W przypadku algorytmów optymalizacji (podobnie jest dla równań nieliniowych), najbardziej kosztowną operacją jest właśnie wartościowanie funkcji f(x). Może da się wybierać punkty podziału t1 i t2 tak, że w każdym kroku iteracji (z wyjątkiem pierwszego) wystarczy tylko jedno nowe wartościowanie, aby rozstrzygnąć wybór kolejnego podprzedziału? Okazuje się, że przez odpowiedni wybór podziału, jeden z punktów z aktualnej iteracji pokryje się z odpowiednim punktem z iteracji kolejnej, a zatem nie trzeba będzie wykonywać drugiego wartościowania, bo będzie już znane z poprzedniego kroku! W ten sposób uzyskamy metodęzłotego podziału. Nazwa „złoty podział” bierze się stąd, że proporcja, która to gwarantuje,(t2-a)/(b-a) jest słynnym złotym podziałem.
Metoda złotego podziału Załóżmy, że punkty podziału t1,t2(a, b) określone są wzorami gdzie 0<<1 jest jeszcze nieznanym współczynnikiem. Chcemy tak go dobrać, aby w kolejnym kroku iteracji, niezależnie od tego czy wybierzemy przedział czy jeden z punktów nowego przedziału pokrył się z którymś z poprzedniego. Bliższa analiza pokazuje, że wymóg ten prowadzi do następującego równania na Dodatni pierwiastek tego równania wynosi Wartość ta wyraża właśnie złoty podział znany już w starożytnej Grecji.
Implementacja metody złotego podziału do znajdowania minimum funkcji jednej zmiennej f:[a,b]R.
Przykład. Znajdziemy numerycznie minimum funkcji określonej wzorem Interesuje nas optymalizacja z ograniczeniami Ω=[0, 3].
Po uruchomieniu programu uzyskamy następujący rezultat Zatem przybliżona wartość xmin=0,325729. W punkcie tym funkcja osiąga minimum fmin=0,625681.
Optymalizacja funkcji wielu zmiennych Jest to zagadnienie dużo trudniejsze niż stosunkowo prosty przypadek funkcji jednej zmiennej. Dlatego podamy tu tylko krótkie wprowadzenie. Metody gradientowe wykorzystują pojęcie gradientu funkcji wielu zmiennych. Przypomnijmy, że dla funkcji która jest różniczkowalna, definiujemy gradient f(x), jako wektor z Rn, określony następująco Sens wektora f(x) jest taki, że wskazuje on w punkcie x kierunek, w którym funkcja ma największy wzrost.
Przykład. Funkcja dwóch zmiennych dana jest wzorem Zatem Oznacza to, że np. w punkcie (x1,x2)=(1, -2) największy wzrost funkcja ma w kierunku wektora a w punkcie (x1,x2)=(2, 2) największy wzrost funkcja ma w kierunku wektora
Koncepcyjnie najprostsze są metody najszybszego spadku. Można je sformułować następująco: dla danego punktu startowego obliczmy kolejne punkty wg schematu wg schematu jest odpowiednio dobieranym kierunkiem (wektorem) oraz gdzie jest dodatnim parametrem (czasami zwanym długością kroku, ang. step size). Podstawowy pomysł w powyższym schemacie polega na tym, aby w każdym kroku iteracji poruszać się w kierunku, w którym funkcja f maleje. Ponieważ kierunek największego wzrostu funkcji jest wyznaczony przez gradient, więc naturalne jest, aby szukać kierunku przeciwnego do tego gradientu (czyli kierunku największego spadku) lub ogólniej kierunku, który jest pod kątem rozwartym względem f(x). Tak więc żądanie na d(k) jest następujące
Różne warianty metody spadku powstają teraz przez konkretny sposób wyboru d(k) spełniającego warunek d(k)·f(d(k)) < 0. W szczególności można spotkać następujące metody: Metoda gradientu (inaczej zwana metodą największego spadku, ang. steepestdescentmethod): Otrzymujemy więc schemat Metodygradientusprzężonego (ang. conjugate gradient methods): gdzie współczynniki kdobiera się w taki sposób, aby kierunki d(k) d(k-1) były wzajemnie prostopadłe w odpowiednio wybranym iloczynie skalarny. Ponieważ może być tutaj wiele strategii, więc w gruncie rzeczy jest to dość szeroka klasa metod.
Metoda Newtona: gdzie H(x) jest tzw. hesjanem funkcji w punkcie x. W tym przypadku zakładamy, że funkcja f jest klasy C2 (istnieje druga pochodna i jest ciągła). Hesjan jest macierzą kwadratową, której elementami są pochodne cząstkowe drugiego rzędu
Jeżeli już wybierzemy jakąś metodą właściwe d(k), to aby możena było wykonać następny krok (przejście kk+1) musimy jeszcze wyznaczyć k>0. Generalnie można posłużyć się następującym kryterium gdzie co sprowadza wyznaczanie współczynnika do zagadnienia minimalizacji funkcji jednej zmiennej.
Narzędzia optymalizacji dostępne w Excelu Używając dodatku Solver w programie Excel znajdź minima i maksima podanych niżej funkcji jednej zmiennej.
Narzędzia optymalizacji dostępne w Excelu (c.d) Używając dodatku Solver w programie Excel znajdź minima i maksima podanych niżej funkcji dwóch zmiennych.
Narzędzia optymalizacji dostępne w Excelu (c.d) W fabryce mamy trzy maszyny M1, M2, M3 do wytwarzania dwóch produktów P1, P2. Aby wytworzyć P1 maszyny te muszą pracować kolejno 5, 3 i 4 minuty. Dla produktu P2 czasy te wynoszą 1, 4 i 3 minuty. Zysk ze sprzedaży P1 to 30, a ze sprzedaży P2 to 20 zł. Jak powinniśmy zorganizować produkcję, aby zysk był największy? Funkcja celu: Wsk. Obliczyć ile można wyprodukować P1 i P2 w ciągu jednej godziny tak, aby uzyskać maksymalny zysk.
Algorytmy ewolucyjne Inspiracją do rozwinięcia algorytmów ewolucyjnych było naśladowanie natury, a przede wszystkim sposobu zmian w organizmach żywych na drodze dziedziczenia i mutowania. Za twórcę idei tych algorytmów, opartych na zasadach podobnych do tych znanych z genetyki, uważany jest amerykański uczony John Holland, który opublikował pracę z tego zakresu w 1975 r. (Adaptation in Natural and Artificial Systems). Algorytmy genetyczne znajdują wiele zastosowań, m.in. w optymalizacji, i są zaliczane do grupy metod niedeterministycznych. Podstawą algorytmów genetycznych jest znana hipoteza z teorii ewolucji, że największe prawdopodobieństwo przeżycia mają jednostki o najwyższym stopniu przystosowania i to ich potomstwo kształtuje w głównej mierze następne generacje osobników.
Przykład Pokażemy na prostym przykładzie działanie algorytmu genetycznego. Będziemy poszukiwali maksimum funkcji dla Oczywiście, rozwiązaniem jest x=31, ale chcemy na tym przykładzie zilustrować podstawowe kroki klasycznego algorytmu genetycznego. Można na ten przykład spojrzeć tak: funkcja przystosowania dla osobników (chromosomów) dana jest wzorem jak wyżej. Jak będzie przebiegała ewolucja losowej populacji chromosomów?
W klasycznym algorytmie genetycznym kodujemy zadanie w postaci ciągów zero-jedynkowych, które kodują liczby całkowite. W tym przypadku wystarczą ciągi o długości 5. Przyjmujemy liczność populacji np. na 8. Losujemy pulę początkową. Przykładowa pula osobników jest poniżej. ch1=[00110] ch2=[00101] ch3=[01101] ch4=[10101] ch5=[11010] ch6=[10010] ch7=[01000] ch8=[00101]
Dekodujemy informacje z chromosomów. Chromosomy traktujemy jak zapis binarny liczby naturalnej). ch1 6, ch2 5, ch3 13, ch4 21, ch5 26, ch6 18, ch7 8, ch8 5. Obliczamy przystosowania (wzór: f(ch)=2·ch+1 ) osobników z puli. f(ch1)=13, f(ch2)=11, f(ch3)=27, f(ch4)=43, f(ch5)=53, f(ch6)=37, f(ch7)=17, f(ch8)=11. Średnia wartość przystosowanie dla tej generacji wynosi 26,5.
Selekcja (metoda koła ruletki) Kolejny krok to selekcja chromosomów. Posłużymy się metodą koła ruletki. Wycinki mają wartości procentowe: =B2/$B$10 Sektory na kole mają więc następujące procentowe „udziały”: v(ch1)=6,13, v(ch2)=5,19, v(ch3)=12,74, v(ch4)=20,28, v(ch5)=25,0, v(ch6)=17,45, v(ch7)=8,02, v(ch8)=5,19.
Można to zilustrować w następujący sposób na wykresie kołowym:
Selekcja (c.d.) Teraz chcemy wybrać spośród osobników naszej populacji tych, którzy się będą ewentualnie rozmnażać. Losujemy więc 8 liczb z przedziału procentowego [0, 100], np. 79 44 9 74 45 86 48 23 Oznacza to wybór (selekcję) następujących chromosomów: ch6 ch4 ch2 ch6 ch5 ch6 ch5 ch3 Jest to tzw. pula rodzicielska, w której może dojść do krzyżowania.
Krzyżowanie Prowadzimy krzyżowanie z prawdopodobieństwem krzyżowania pk=0,75. Kojarzymy osobniki w pary i losujemy dla każdej pary liczbę z przedziału [0, 1], aby określić, czy dana para będzie się krzyżowała czy nie. Do krzyżowania dochodzi wtedy, gdy wylosowana liczba dla danej pary jest pk. Np. wylosowaliśmy cztery liczby: 0,12 0,73 0,65 0,33 Widać, że krzyżowanie będzie zachodziło dla każdej pary. Dalej zastosujemy najprostsze krzyżowanie – tzw. krzyżowanie jednopunktowe. Dla każdej pary znajdujemy punkt krzyżowania poprzez wylosowanie liczby ze zbioru {1,2,3,4}, gdyż mamy ciągi 5-cio elementowe, więc pozycji do krzyżowania jest 5-1=4.
Krzyżowanie (c.d.) ch6=[100|10] ch4=[101|01] lk=3 Ch1=[10001] Ch2=[10110] krzyżowanie Podobnie dla pozostałych par, gdzie zakładamy, że wylosowano następujące miejsc krzyżowania: lk=4, 3, 2.
Po wykonaniu krzyżowania we wskazanych punktach otrzymamy więc następującą populację potomków: Ch1=[10001], Ch2=[10110], Ch3=[00100], Ch4=[10011], Ch5=[11010], Ch6=[10010], Ch7=[11101], Ch8=[01010]. W klasycznym algorytmie genetycznym wykonujemy teraz jeszcze operację mutacji, ale w tym przykładzie przyjęliśmy, że prawdopodobieństwo mutacji jest zero, pm=0. Oznacza to, że nie wykonujemy mutacji. Obliczając teraz wartości funkcji przystosowania mamy: f(Ch1)=35, f(Ch2)=45, f(Ch3)=9, f(Ch4)=39, f(Ch5)=53, f(Ch6)=37, f(Ch7)=59, f(Ch8)=21. Populacja potomków ma średnią wartością przystosowania 37,25. Populacja rodziców miała 26,5.