Metody obliczeniowe optymalizacji – zadanie 5

Transkrypt

Metody obliczeniowe optymalizacji – zadanie 5
Metody obliczeniowe optymalizacji – zadanie 5
Mateusz Grotek 186816
1
Paweł Tarasiuk 186875
Cel
Celem zadania było zapoznanie się z metodą sukcesywnego programowania
liniowego (SLP – successive linear programming) i jej implementacja.
2
Wprowadzenie
Metoda sekwencyjnego programowania liniowego to aproksymacyjna metoda
optymalizacji nieliniowej funkcji wielu zmiennych z nieliniowymi ograniczeniami. Oznacza to, że funkcja, którą usiłujemy zoptymalizować może być dowolne,
podobnie jak ograniczenia. Tak jest w przypadku idealnym, jednak sama metoda sekwencyjnego programowania liniowego działa dobrze tylko dla ograniczeń,
które można dobrze przybliżać liniowo (czyli takie, które mają sensowne przybliżenia dla pierwszego (licząc od zera) wyrazu szeregu Taylora dla funkcji wielu
zmiennych). Metoda ta jest metodą aproksymacyjną, więc nie ma gwarancji
uzyskania prawidłowego wyniku w sensownym czasie. Jednakże jej zaletą jest
prostota implementacji, o ile został zaimplementowany wcześniej algorytm simplex, gdyż metoda ta na nim bazuje (aczkolwiek tak naprawdę możliwe jest
użycie dowolnego algorytmu rozwiązującego problem programowania liniowego). Idea algorytmu jest następująca. W pewnym obszarze ograniczonym (każda zmienna jest ograniczona przez tzw. „movable limits”), którego środkiem
jest pewne przybliżone rozwiązanie zagadnienia optymalizacji nieliniowej wykonujemy optymalizację liniową na bazie liniowych przybliżeń nieliniowej funkcji
celu i nieliniowych ograniczeń. Jest to algorytm iteracyjny, więc każda iteracja
przybliża nas do rozwiązania. W kolejnych krokach algorytm znajduje coraz lepsze przybliżenia rozwiązania. Zastosowanie ograniczonego obszaru jestkonieczne,
gdyż liniowe przybliżenia ograniczeń i funkcji celu mają sens tylko w pewnym
obszarze dookoła punktu w którym dokonujemy przybliżenia. Poza tym obszarem funkcje mogą przeiegać już zupełnie inaczej i liniowe przybliżenie nie
miałoby zastosowania. Sam obszar musi zostać dobrany metodą pró i błędów,
aczkolwiek można też zastosować odmianę algorytmu w którym rozmiar obszaru jest modyfikowany z zależności od tego, czy algorytm porusza się w pobliżu
danego punktu, czy raczej się od niego oddala. Jeżeli algorytm porusza się w
pobliżu danego punktu (czyli wszystkie kolejne wektory znajdują się blisko siebie, a algorytm oscyluje w pewnym obszarze), to można zmniejszać obszar. W
przeciwnym wypadku warto zwiększyć obszar, aby zapewnić szybszą zbieżnośc
algorytmu.
1
3
Implementacja
Implementacja została wykonana w środowisku Octave. Wybrany został najprostszy wariant metody ze stałym rozmiarem obszaru, więc przed wykonaniem
obliczeń należy dobrać empirycznie właściwy rozmiar. Ze względu na szybkość obliczeń została użyta implementacja metody simplex z biblioteki Octave,
aczkolwiek można także podpiąć naszą implementację z poprzedniego zadania.
Do testów zostały stworzone dwa problemy na bazie materiałów dostarczonych
przez prowadzącego ćwiczenia. Dla obydwu problemów program wykonuje poprawne i zgodne z opisem obliczenia. Poniżej prezentujemy najważniejszą funkcję programu:
f u n c t i o n [ optimum_arg , optimum]=
sukcesywne_programowanie_liniowe
[ dokladn osc , punkt_poczatkowy , zakres_poczatkowy ,
typ_optymalizacji , funkcja_celu , gradient_celu ,
funkcje_ograniczen , gradienty_ograniczen ,
t y p y _ o g r a n i c z e n ]= problem1 ;
przyblizone_argumenty_optimum = [ punkt_poczatkowy ] ;
i l o s c _ z m i e n n y c h = l e n g t h ( punkt_poczatkowy ) ;
licznik = 0;
do
licznik = licznik + 1;
aktualny_punkt = przyblizone_argumenty_optimum ( : ,
columns ( przyblizone_argumenty_optimum ) ) ;
z a k r e s y _ g o r n e = aktualny_punkt + zakres_poczatkowy ;
z a k r e s y _ d o l n e = aktualny_punkt − zakres_poczatkowy ;
[ a , b]= z l i n e a r y z u j ( f u n k c j a _ c e l u , g r a d i e n t _ c e l u ,
aktualny_punkt ) ;
C=a ;
A= [ ] ;
B= [ ] ;
f o r i = 1 : length ( typy_ograniczen )
[ a , b]= z l i n e a r y z u j ( f u n k c j e _ o g r a n i c z e n { i } ,
g r a d i e n t y _ o g r a n i c z e n { i } , aktualny_punkt ) ;
A=[A; a ] ;
B=[B ; b ] ;
endfor
[ s t a t u s , optimum_arg , optimum]= dwufazowy_sympleks (
t y p _ o p t y m a l i z a c j i , C, A, B, typy_ograniczen ,
zakresy_dolne , z a k r e s y _ g o r n e ) ;
i f ( s t a t u s != 1 8 0 )
d i s p ( [ " Wystąpił błąd : " , num2str ( s t a t u s ) ] ) ;
optimum_arg=NA;
optimum=NA;
return ;
endif
2
d i s p ( [ " P r z y b l i ż o n e argumenty optimum : " , m a t 2 s t r (
optimum_arg ) ] ) ;
d i s p ( [ " P r z y b l i ż o n e optimum : " , num2str ( optimum ) ] ) ;
przyblizone_argumenty_optimum = [
przyblizone_argumenty_optimum , optimum_arg ] ;
u n t i l ( norm ( przyblizone_argumenty_optimum ( : , columns (
przyblizone_argumenty_optimum ) )−
przyblizone_argumenty_optimum ( : , columns (
przyblizone_argumenty_optimum ) −1) ) < d o k l a d n o s c | |
l i c z n i k > 1000) ;
endfunction
4
Wyniki
10
sqrt(25-x**2)
-sqrt(25-x**2)
sqrt(x**2-7)
-sqrt(x**2-7)
-2*x
5
0
-5
-10
-10
-5
0
5
10
Rysunek 1: Problem 1
Interesujący problem przedstawiony jest na rysunku 1. Prosta widoczna na
tym rysunku została dodana aby wskazać nachylenie funkcji celu (która akurat
w tym wypadku jest liniowa, choć w ogólnym wypadku nie jest to konieczne).
Celem jest maksymalizacja. Dozwolone obszary znajdują się na przecięciu wnętrza koła z wewnętrzną częścią hiperboli. Oznacza to, że punkt (0,0 znajduje
się w dozwolonym obszarze. Z rysunku od razu widać, że prawe górne przecięcie
okręgu i hiperboli jest rozwiązaniem zadania. Pozostaje tylko dokładne wyznaczenie tego punktu. Nasz program zaczyna z arbitralnie wybranego punktu (1,1.
Kolejne punkty coraz bardziej przybliżają się do rozwiązania zadania. Wyjście
programu przedstawione jest poniżej:
Przybliżone argumenty optimum: [2;2]
3
Przybliżone
Przybliżone
Przybliżone
Przybliżone
Przybliżone
Przybliżone
Przybliżone
Przybliżone
Przybliżone
Przybliżone
Przybliżone
ans =
optimum: 6
argumenty optimum:
optimum: 9
argumenty optimum:
optimum: 11.167
argumenty optimum:
optimum: 11.004
argumenty optimum:
optimum: 11
argumenty optimum:
optimum: 11
[3;3]
[4;3.1666666666666665]
[4;3.0043859649122808]
[4;3.0000032014342422]
[3.9999999999999996;3.000000000001708]
4.0000
3.0000
Jak widać algorytm znalazł punkt 4,3 będący rozwiązaniem zadania.
5
Dykusja
Jako, że wybraliśmy najprostszy wariant metody można dokonać w nim
kilku ulepszeń. Jednym z nich jest dynamiczna zmiana obszaru przeszukiwania na podstawie sposobu w jaki zachowują się kolejne rozwiązania. Poza tym
nie trzeba od razu zaczynać od linearyzacji wszystkich warunków, a można zastosować algorytm, który w każdym kroku dodaje do listy ograniczeń kolejne
ograniczenie. W ten sposób lista ograniczeń coraz bardziej się powiększa. Ta
wersja jednak wydaje nam się jednak dość ryzykowna, gdyż zwiększanie ilości
warunków spowalnia działanie metody sympleks. Natomiast nasza wersja algorytmu nie zmienia ilości warunków między iteracjami, przez co nie zwiększa
złożoności obliczeniowej problemu. Ma to duże znaczenie, jeżeli punkt wybrany
jako punkt początkowy jest w dużej odległości od rozwiązania. W takim wypadku algorytm musi dokonać wielu kroków w celu przesunięcia się w pobliże
rozwiązania, a każdy krok dodaje nowe ograniczenie, co powoduje sukcesywne
spowalnianie algorytmu. Wersja algorytmu zaimplementowana przez nas nie ma
tego problemu i w każdej iteracji działa z taką samą prędkością.
4