#include <RosenbrockDiscrete.h>
Diagram dziedziczenia dla RosenbrockDiscrete
Metoda poszukiwań prostych.
Podobnie jak algorytm Hooke'a i Jeevesa, oparta jest na wykonywaniu w każdej iteracji kroków próbnych wzdłuż ortogonalnych kierunków. Kierunki te, inaczej niż w metodzie HJ, mogą się zmieniać - na końcu każdej iteracji baza kierunków jest obracana w taki sposób, aby zawierała kierunek największej poprawy i pozostałych wzajemnie ortonormalnych kierunków.
Informacje wejściowe:
- minimalizowana funkcja zmiennych,
- dowolnie wybrany punkt startowy,
- n-wymiarowy wektor początkowych długości kroku,
- współczynnik wydłużania kroku (),
- współczynnik skracania kroku (),
- wstępny warunek stopu - minimalna długość kroku próbnego,
- dokładność właściwego warunku stopu,
warunek stopu - do wyboru:
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,
- wartość funkcji w punkcie ,
- najlepsza wartość funkcji przed rozpoczęciem przeszukiwania kierunków z bazy,
- wektory sum przesunięć wykorzystywane przy obrocie bazy,
- kwadraty norm wektorów wykorzystywane przy normalizacji nowej bazy ().
Procedura.
Krok wstępny:
Podstawiamy:
Krok 1:
Badamy wartość funkcji w nowym punkcie próbnym (wykonując krok w i-tym kierunku):
Jeśli krok był udany (), to dodajemy długość kroku do sumy , wydłużamy krok w bieżącym kierunku i zapamiętujemy aktualny punkt jako najlepszy:
Jeśli krok był nieudany (), to skracamy krok w bieżącym kierunku i odwracamy jego zwrot:
Podstawiamy i sprawdzamy, czy . Jeśli tak, ponownie wykonujemy krok 1. Jeśli nie, podstawiamy i przechodzimy do kroku 2.
Krok 2:
Sprawdzamy, czy przy ostatnim przeszukiwaniu kierunków nastąpiła poprawa.
Jeśli tak (), to podstawiamy:
i przechodzimy do kroku 1. W przeciwnym wypadku przechodzimy do kroku 3.
Krok 3:
Sprawdzamy wstępny warunek stopu:
i zapamiętujemy jego wartość logiczną.
Następnie sprawdzamy, czy w całej iteracji nastąpiła poprawa - jeśli tak (), to przechodzimy do kroku 4.
W przeciwnym wypadku (), jeśli wstępny warunek stopu jest spełniony, to STOP. Jeśli nie jest, podstawiamy i przechodzimy do kroku 1.
Krok 4:
Sprawdzamy główny warunek stopu. Jeśli ten oraz wstępny warunek stopu z kroku 2 są spełnione, to STOP. W przeciwnym razie przechodzimy do kroku 5.
Krok 5:
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.
Metoda zaimplementowana na podstawie programu Franka Vanden Berghena (http://iridia.ulb.ac.be/%7Efvandenb/download.php?id=33), który powstał na podstawie publikacji:
1) Rosenbrock, H. H., An Automatic Method for Finding the Greatest or Least Value of a Function (1960). (http://iridia.ulb.ac.be/~fvandenb/optimization/paper_rosenbrock.zip)
2) Palmer, J. R., An improved procedure for orthogonalising the search vectors in Rosenbrock's and Swann's direct search optimisation methods (1969). (http://iridia.ulb.ac.be/~fvandenb/optimization/paper_palmer.zip)