#include <RosenbrockOptimal.h>
Diagram dziedziczenia dla RosenbrockOptimal
Metoda poszukiwań prostych.
Podobnie jak metoda Rosenbrocka z krokiem dyskretnym, polega na przeszukiwaniu w każdej iteracji ortogonalnych kierunków i obracaniu bazy w taki sposób, aby nowe kierunki były kierunkami największej dotychczasowej poprawy. W odróżnieniu od pierwotnego wariantu metody Rosenbrocka, w metodzie z krokiem optymalnym wzdłuż każdego z kierunków wykonywany jest tylko jeden krok - krok o optymalnej długości wyznaczonej przez metodę optymalizacji w kierunku. Dzięki temu każdy krok próbny jest krokiem udanym (kończącym się w punkcie o mniejszej niż poprzednio wartości funkcji celu). Upraszcza to znacznie procedurę.
Informacje wejściowe:
- minimalizowana funkcja
zmiennych,
- dowolnie wybrany punkt startowy,
- dokładność właściwego warunku stopu,
warunek stopu - do wyboru:
- minimalna długość kroku w całym etapie,
wybrana metoda minimalizacji w kierunku wraz z parametrami.
Oznaczenia:
- indeks aktualnego kierunku,
- numer aktualnej iteracji,
- aktualna baza kierunków,
- wektor sum długości udanych kroków próbnych w poszczególnych kierunkach,
- aktualny punkt próbny,
- najlepszy punkt w k-tym etapie,
- optymalna długość kroku w i-tym kierunku,
- wektory sum przesunięć wykorzystywane przy obrocie bazy,
- kwadraty norm wektorów
wykorzystywane przy normalizacji nowej bazy (
).
Procedura.
Krok wstępny:
Podstawiamy:
Krok 1:
Przy pomocy metody optymalizacji w kierunku wyznaczamy optymalną długość kroku i wykonujemy krok:
Zapamiętujemy długość kroku i aktualny punkt:
Podstawiamy i sprawdzamy, czy
. Jeśli tak, ponownie wykonujemy krok 1. Jeśli nie, podstawiamy
i przechodzimy do kroku 2.
Krok 2:
Sprawdzamy warunek stopu. Jeśli jest on spełniony, to STOP. Wynikiem jest .
W przeciwnym wypadku przechodzimy do kroku 3.
Krok 3:
Dokonujemy obrotu bazy, według algorytmu Palmera:
1) Dla :
Wyliczamy wektory sum przesunięć:
oraz wektor :
2) Tworzymy nowe kierunki ortonormalne :
a) Dla :
b) Na koniec tworzymy kierunek największej poprawy .
W ten sposób otrzymujemy nową bazę kierunków .
Następnie podstawiamy:
i przechodzimy do kroku 1.
Uwagi.
Oryginalna metoda Rosenbrocka wykorzystywała przy ortonormalizacji nowej bazy metodę Grama-Schmidta. W tej implementacji użyto metody Palmera, bardziej wydajnej i tworzącej poprawną bazę również w przypadku, gdy w iteracji istnieją kierunki, w których nie wykonano żadnego udanego kroku.
Metody publiczne | |
~RosenbrockOptimal (void) | |
Destruktor. | |
virtual std::auto_ptr< Method > | Clone () const |
Tworzy kopię metody. | |
virtual const wxString & | Name () const |
Zwraca nazwę metody. | |
virtual MethodIdType | Id () const |
Zwraca ID metody. | |
virtual bool | CanHandle (const ProblemBase *pProblem) const |
Sprawdza, czy dany problem może być rozwiązany tą metodą. | |
virtual StopConditions | AllowedStopConditions () const |
Zwraca listę warunków stopu odpowiednich dla danej metody. | |
Statyczne metody publiczne | |
static MethodIdType | ClassId () |
Zwraca ID metody. | |
Metody chronione | |
RosenbrockOptimal (void) | |
Konstruktor domyślny. | |
RosenbrockOptimal (const RosenbrockOptimal &from) | |
Konstruktor kopiujący. | |
void | SearchAllDirections (const FunctionBase &function, ColumnVector &rxBest, const SquareMatrix &D, ColumnVector &rLambda, RosenbrockOptimalIteration &rIterationData) const |
Przeszukuje kierunki. | |
void | RotateBase (SquareMatrix &rD, const ColumnVector &lambda, RosenbrockOptimalIteration &rIterationData) const |
Dokonuje obrotu bazy kierunków. | |
virtual wxString & | rName () |
Przyjaciele | |
class | MethodWithLineSearchPanel< RosenbrockOptimal > |
|
Konstruktor kopiujący.
|
|
Dokonuje obrotu bazy kierunków.
Na podstawie sum długości udanych kroków
Metoda wykorzystuje ortogonalizację Palmera:
gdzie:
oraz wektor
Następnie wykonana zostaje procedura utworzenia nowych kierunków ortonormalnych
2.
|
|
Przeszukuje kierunki.
Dla każdego kierunku
Długość kroku jest zapamiętywana jako
|