TECHNIKA OPTYMALIZACJI laboratorium |
---|
Ćwiczenie III: Zadanie programowania nieliniowego bez ograniczeń algorytmy optymalizacji lokalnej |
1.Cel ćwiczenia
Celem ćwiczenia jest zapoznanie się z jedną z metod rozwiązywania nieliniowego zadania optymalizacji bez ograniczeń na przykładzie algorytmu optymalizacji lokalnej.
Algorytm optymalizacji lokalnej dla zadania nieliniowej optymalizacji bez ograniczeń pozwala na wyliczenie takiego wektora zmiennych decyzyjnych $\hat{x}$, dla którego funkcja celu f(x) osiąga minimum:
$$\operatorname{}{f\left( x \right) = f(\hat{x})}$$
2. Wykonanie ćwiczenia
2.1 Zadanie testowe numer 1
f(x) = (x1 − 2)2 + (x2 − 2)2
Punkt startowy x0 = [5, 3] , f(x0) = 10,0
Punkt optymalny: $\hat{x} = \left\lbrack 2,0\ ;2,0 \right\rbrack,$ $f\left( \hat{x} \right) = 0$
Wizualizacja poziomicy z kolejnymi iteracjami została przedstawiona dla funkcji fminunc (nieużytej w tym przypadku na zajęciach) , ze względu na czytelność wykresu(ilość iteracji):
(przyjęte kryterium stopu TolX = 10^-2,użyta funkcja fminunc)
x = 2.0000 2.0000 fval = 6.6669e-16 iterations = 2
exitflag = 1 algorithm: 'medium-scale: Quasi-Newton line search'
Rys. 1 Poziomica funkcji z naniesionymi kolejnymi iteracjami (funkcja fminunc, TolX = 10-2 )
Analiza wyników uzyskanych na zajęciach:
Wyniki optymalizacji otrzymane za pomocą programu matlab (funkcje: fminsearch/fminunc):
(przyjęte kryterium stopu TolX = 10^-2)
x = 1.9972 2.0023 fval = 1.2933e-005 iterations = 27
exitflag = 1 algorithm: ’Nelder-Mead simplex direct search’
Rys. 2 Wykres funkcji( TolX = 10-2 )
Rys. 3 Zmiany wartości przy kolejnych iteracjach( TolX = 10-2 )
Wyniki po zmianie kryterium (przyjęte kryterium stopu TolX = 10^-8 ):
x = 2.000 2.000 fval = 5.6324e-18 iterations = 73
exitflag = 1 algorithm: ’Nelder-Mead simplex direct search’
Rys. 4 Zmiany wartości przy kolejnych iteracjach( TolX = 10-8 )
Postać naszej funkcji : f(x) = (x1 − 2)2 + (x2 − 2)2
Gradient funkcji:
Wyznaczanie punktu stacjonarnego:
grad f(x)=0 (zależność na punkt stacjonarny)
2x1 − 4 = 0 → x1 = 2
2x2 − 4 = 0 → x2 = 2
Możliwe ekstremum w punkcie: P=(2,2)
Przechodzimy do macierzy Hessego :
Wyznacznik z powyższej macierzy:
Jako , że wyznacznik >0 (4>0) w punkcie (2,2) znajduje się ekstremum lokalne.
Następnie z odpowiedniej zależności:
wnioskujemy , że P(2,2) jest minimum ,gdyż 2>0.
f(2,2) = (2 − 2)2 + = (2 − 2)2 = 0
Wartość funkcji w minimum to 0(zgodnie z podanymi założeniami).
2.1 Zadanie podane przez prowadzącego
f(x) = (x1 − 2)2 + (x1 − x22)2
Z wykresu wywnioskować można , że funkcja posiada dwa minima leżące do siebie równolegle względem osi y. Do obliczenia gradientów oraz hesjanów wykorzystano funkcje fminunc . Oba obliczenia zostały wykonane dla dwóch minimów przy TolX = 10^-8)
I minimum
Punkt startowy x0 = [2 1.6]
Wyniki optymalizacji otrzymane za pomocą programu matlab (funkcje: fminsearch/fminunc):
(przyjęte kryterium stopu TolX = 10^-2)
Wizualizacja poziomicy z kolejnymi iteracjami została przedstawiona dla funkcji fminunc również ze względu na większą czytelność wykresu(ilość iteracji):
x = 2.0476 1.4313 fval = 0.0023 iterations = 2
exitflag = 1 algorithm: 'medium-scale: Quasi-Newton line search'
Rys.5 Poziomica funkcji z naniesionymi kolejnymi iteracjami ( funkcja fminunc,TolX = 10-2)
Analiza wyników uzyskanych na zajęciach:
x = 2.0033 1.4133 fval = 4,5044e-005 iterations = 19
exitflag = 1 algorithm: ’Nelder-Mead simplex direct search’
Rys. 6 Wykres funkcji( TolX = 10-2 )
Rys. 7 Zmiany wartości przy kolejnych iteracjach( TolX = 10-2 )
Wyniki po zmianie kryterium (przyjęte kryterium stopu TolX = 10^-8 ):
x = 2.0000 1.4142 fval = 3,6486e-017 iterations = 65
exitflag = 1 algorithm: ’Nelder-Mead simplex direct search’
Wartości zaczerpnięte z zadania(funkcja fminunc):
Otrzymany gradient: $\mathbf{\nabla}\mathbf{f}\mathbf{(}\hat{\mathbf{x}\mathbf{)}}\mathbf{=}$ 1.0e-06*$\begin{bmatrix} \mathbf{\text{\ \ }}\mathbf{0}\mathbf{.}\mathbf{1381} \\ \mathbf{\ -}\mathbf{0}\mathbf{.}\mathbf{3026} \\ \end{bmatrix}$
$\nabla f(\hat{x)}\ \cong 0$ : możemy wywnioskować , że spełniony jest warunek stacjonarności
Otrzymany hesjan: H =$\begin{bmatrix} \mathbf{\ }\mathbf{4}\mathbf{.}\mathbf{000} & \mathbf{- \ }\mathbf{5}\mathbf{.}\mathbf{6572} \\ \mathbf{\ \ -}\mathbf{5}\mathbf{.}\mathbf{6572} & \mathbf{\ 16.0059} \\ \end{bmatrix}$
W naszym punkcie znajduje się ekstremum , jest ono minimum.
Rys. 8 Zmiany wartości przy kolejnych iteracjach( TolX = 10-8 )
II minimum
Punkt startowy x0 = [2 − 1.6]
Wyniki optymalizacji otrzymane za pomocą programu matlab (funkcje: fminsearch/fminunc):
(przyjęte kryterium stopu TolX = 10^-2)
x = 2.0033 -1.4133 fval = 4,5044e-005 iterations = 19
exitflag = 1 algorithm: ’Nelder-Mead simplex direct search’
Rys. 9 Zmiany wartości przy kolejnych iteracjach( TolX = 10-2 )
Zmiana kryterium stopu TolX = 10^-8:
x = 2.0000 -1.4142 fval = 3,6486e-017 iterations = 65
exitflag = 1 algorithm: ’Nelder-Mead simplex direct search’
Wartości zaczerpnięte z zadania(funkcja fminunc):
Otrzymany gradient: $\mathbf{\nabla}\mathbf{f}\mathbf{(}\hat{\mathbf{x}\mathbf{)}}\mathbf{=}$ 1.0e-06*$\begin{bmatrix} \mathbf{\text{\ \ }}\mathbf{0}\mathbf{.}\mathbf{1381} \\ \mathbf{\text{\ \ }}\mathbf{0}\mathbf{.}\mathbf{3026} \\ \end{bmatrix}$
$\nabla f(\hat{x)}\ \cong 0$ : możemy wywnioskować , że spełniony jest warunek stacjonarności
Otrzymany hesjan: H =$\begin{bmatrix} \mathbf{\ }\mathbf{4}\mathbf{.}\mathbf{000} & \mathbf{\ }\mathbf{5}\mathbf{.}\mathbf{6572} \\ \mathbf{\text{\ \ \ }}\mathbf{5}\mathbf{.}\mathbf{6572} & \mathbf{\ 16.0059} \\ \end{bmatrix}$
W naszym punkcie znajduje się ekstremum , jest ono minimum.
Rys. 10 Zmiany wartości przy kolejnych iteracjach( TolX = 10-8 )
3.Opis algorytmu
Metoda MelderaMetoda ta polega na utworzeniu w przestrzeni En+1 n-wymiarowego simplexu o n+1 wierzchołkach tak, aby można było go wpisać w powierzchnię reprezentującą badaną funkcję celu. Jednowymiarowym simplexem jest odcinek o dwóch wierzchołkach, simplexem dwuwymiarowym jest trójkąt i ogólnie simplexem n-wymiarowym o n+1 wierzchołkach jest zbiór wszystkich punktów określonych przez wektory:
czyli jest to wielościan o n+1 wierzchołkach rozpiętych na n+1 wektorach bazowych (Sj). Współrzędne punktów simplexu oznaczono jako xj.
Na początku procedury wylicza się współrzędne punktów wierzchołkowych simplexu Pj (dla j = 1 .. n+1) przy założeniu pewnej odległości między tymi wierzchołkami (czyli kroku). W następnych iteracjach dokonuje się przekształceń simplexu aż odległość pomiędzy jego wierzchołkami w pobliżu poszukiwanego ekstremum będzie mniejsza od założonej dokładności obliczeń e. To właśnie zostało przyjęte jako kryterium zbieżności dla tej metody.
Podczas wykonywania algorytmu metody simplex stosuje się trzy podstawowe operacje:
- odbicie punktu Ph względem P': P* = (1 + a)P' - aPh
- ekspansja punktu P** względem P': P** = (1 - c)P* - cP'
-kontrakcja punktu Ph względem P': P*** = bPh + (1 - b)P'
Oznaczenia:
x0 - punkt startowy
e - wymagana dokładność obliczeń
Ph - wybrany punkt wierzchołkowy simplexu spośród n+1 wierzchołków Pi, w którym wartość badanej funkcji osiąga maksimum.
PL - wybrany punkt wierzchołkowy simplexu spośród n+1 wierzchołków Pi, w którym wartość badanej funkcji osiąga minimum.
P' - środek symetrii simplexu z wyłączeniem punktu Ph zdefiniowany jako:
d - początkowa odległość pomiędzy wierzchołkami wyjściowego simplexu
a - współczynnik odbicia (a>0)
b - współczynnik kontrakcji (0<b<1)
c - współczynnik ekspansji (c>1)
n - liczba zmiennych niezależnych
Wartości współczynników a, b, c dobiera się w sposób eksperymentalny, choć w przykładach rozpatrywanych przez autorów metody jako optymalne przyjęto wartości a = 1, b = 0,5 oraz c = 2.
Algorytm:
1) Obliczenie wartości funkcji celu w punktach wierzchołkowych simplexu Fj = f(Pj) dla j = 1 .. n+1
2) Wyznaczenie h i L takich, że f(Ph) = max oraz f(PL) = min spośród zbioru Fj.
3) Obliczenie środka symetrii simplexu P'.
4) Odbicie P* punktu Ph względem P'.
5) Obliczenie wartości funkcji Fs = f(P') oraz Fo = f(P*).
Jeśli Fo < min, to:
6) Obliczenie P** (ekspansja) i wartości funkcji Fe = f(P**).
7) Jeśli Fe < max, to podstawiamy Ph = P**, w przeciwnym przypadku podstawiamy Ph = P*.
8) Powtórzenie procedury od kroku 1), o ile nie jest spełnione kryterium na minimum.
Jeśli Fo > min, to:
6) Jeśli Fo >= f(Pj) dla j = 1 .. n+1 (z pominięciem j = h) i Fo >= max, przejście do następnego kroku.
Jeśli zaś Fo < max, to podstawiamy Ph = P*.
7) Wykonanie kontrakcji P*** punktu Ph względem P'.
8) Obliczenie Fk = f(P***).
9) Jeżeli Fk >= max to wykonujemy redukcję simplexu wg wzoru: Pj = 0,5*(Pj + PL) dla j = 1 .. n+1.
Jeżeli natomiast Fk < max, to podstawiamy Ph = P*** i przechodzimy do kroku 11).
10) Jeśli Fo < f(Pj) dla j = 1 .. n+1 (z pominięciem j = h), podstawiamy Ph = P*.
11) Powtórzenie procedury od kroku 1), jeśli nie zostało spełnione kryterium na minimum.
Źródło: http://www.kmg.zut.edu.pl/opt/wyklad/bezgrad/simplex.html
Metoda Quasi-Newtona może być używana, gdy obliczenie Hessianu (macierzy drugich pochodnych funkcji) wymaganego przez metodę Newtona jest trudne lub czasochłonne. Idea metody polega na przybliżeniu Hessianu lub jego odwrotności za pomocą pierwszych pochodnych.
W każdym kroku algorytmu przybliżenie Hessianu (H) lub jego odwrotności (B) jest uaktualniane przy pomocy informacji o gradiencie. Informacje o krzywiźnie funkcji są gromadzone w trakcie wykonywania obliczeń.
Oznaczenia:
H – Hessian
B – odwrotność macierzy H –
x0 – pierwsze przybliżenie rozwiązania (punkt startowy)
xi – i-te przybliżenie rozwiązania
H0, B0 – macierze początkowe
Hi, Bi – i-te macierze przybliżone
Hiu, Biu – i-te poprawki wartości macierzy Hi, Bi
ε – wymagana dokładność
Metody przybliżania wartości H i B:
Istnieją różne metody obliczania przybliżeń, z których dwie najpopularniejsze to:
- DFP (Davidon-Fletcher-Powell)
-BFGS (Broyden-Fletcher-Goldfarb-Shanno)
co po odwróceniu daje:
Ponadto istnieje cała rodzina metod znana jako Broyden family:
, gdzie Φ jest dowolną liczbą rzeczywistą
Algorytm:
Ustal i = 0, x0, B0 oraz kryterium zatrzymania ε.
, gdzie macierz początkowa H0 może być dowolną symetryczną, dodatnie określoną macierzą. W szczególności .
Sprawdź, czy punkt xi spełnia kryterium stopu – np. jeślito xi jest rozwiązaniem
Wyznacz kierunek poprawy
Wyznacz kolejne przybliżenie rozwiązania , gdzieto długość kroku minimalizująca jednowymiarową funkcję
Wyznacz poprawkęzgodnie z wybraną metodą (DFP, BFGS), używając wartości , oraz
Uaktualnij
i = i+1
Idź do punkt 2.
Źródło: http://optymalizacja.w8.pl/QuasiNewton.html
4.Wnioski
Metoda z której korzysta funkcja „fminunc” wykonuje dużo mniej iteracji niż metoda Neldera-Meada używana przez funkcję „fminsearch”.Znaczący zysk w ilości iteracji jest jednak okupiony kosztami. Dodatkowym kosztem użycia metody Quasi-Newtonoskiej jest zwiększona potrzeba obliczeniowa. W każdej z iteracji obliczany jest hessian oraz gradient – czego nie zauważamy przy Nelderze-Meadzie. Metoda Quasi-Newtonoska pozwala na aproksymację hesjanu za pomocą pierwszych pochodnych , co ułatwia obliczenia z nim związane. Eksperymenty związane ze zmianą kryterium stopu TolX z 10-8 na 10-2 pozwalają na wyciagnięcie dwóch wniosków. Zmiana tego kryterium wpływa na ilość iteracji (znacząco mniejsza ilość przy kryterium ustawionym na 10-2 ) . Również wynik jest przedstawiony z różną dokładnością , co ma związek z ilością iteracji oraz długością obliczeń wykonywanych przez nasz algorytm.