background image

Zadana funkcja:

 

2

2

2

2

1

2

1

1

( )

100

1

f x

x

x

x

 

Rozpatrywany przedział funkcji: 

1;1

x

 

 

Wykres funkcji: 

 

Funckja 

ga 

patternsearch 

simulannealbnd 

Liczba iteracji 

10 

100 

10 

100 

10 

100 

Minimum globalne 

0.02 

0.0083 

0.7349 

0.1368 

0.006 

5e-7 

Maksimum globalne 

399.91 

399.97 

404 

404 

395.61 

400 

Czas poszukiwania rozw. [s] 

0.1 

0.09 

0.02 

0.06 

0.01 

0.03 

 

min

1; 1 v

1;1

x

 

 

  

max

1;1 v

1; 1

x

 

 

-1

-0.5

0

0.5

1

-1

-0.5

0

0.5

1

0

50

100

150

200

250

300

350

400

450

background image

Kod funkcji: 

 

options=psoptimset(

'MaxIter'

,10);

 

 clk=tic;

 

 [Px_min Pf_min] = patternsearch(@rosen,[0 0],[],[],[],[],[-1 -1],[1 1],options);

 

 Ptime=toc(clk);

 

 [Px_max Pf_max] = patternsearch(@rosen_inv,[0 0],[],[],[],[],[-1 -1],[1 
1],options);

 

 

 

 clk=tic; 

 

 [Gx_min Gf_min] = ga(@rosen,2,[],[],[],[],[-1 -1],[1 1],[],options);

 

  Gtime=toc(clk);

 

 [Gx_max Gf_max] = ga(@rosen_inv,2,[],[],[],[],[-1 -1],[1 1],[],options);

 

 

 

 

 

clk=tic; 

 

[Sx_min Sf_min]=simulannealbnd(@rosen,[-0 -0],[-1 -1],[1 1],options);

 

Stime=toc(clk);

 

[Sx_max Sf_max]=simulannealbnd(@rosen_inv,[-0 -0],[-1 -1],[1 1],options);

 

 

 

  clc;

 

  disp([

'Funkcja ga: Min/Max = '

 num2str(Gf_min) 

' / '

 num2str(-Gf_max) 

' t= '

 

num2str(Gtime) 

's'

 ]);

 

  disp([

'Funkcja Patternsearch: Min/Max = '

 num2str(Pf_min) 

' / '

 num2str(-Pf_max) 

' t= '

 num2str(Ptime) 

's'

 ]);

 

  disp([

'Funkcja Simulannealbnd: Min/Max = '

 num2str(Sf_min) 

' / '

 num2str(-Sf_max) 

' t= '

 num2str(Stime) 

's'

]);

 

  

 

 

function

 y = rosen(x)

 

 

% Rosenbrock function

 

% Matlab Code by A. Hedar (Nov. 23, 2005).

 

% The number of variables n should be adjusted below.

 

% The default value of n = 2.

 

 

n = 2;

 

sum = 0;

 

for

 j = 1:n-1;

 

    sum = sum+100*(x(:,j).^2-x(:,j+1)).^2+(x(:,j)-1).^2;

 

end

 

y = sum;

 

 

function

 y = rosen_inv(x)

 

 

% Rosenbrock function

 

% Matlab Code by A. Hedar (Nov. 23, 2005).

 

% The number of variables n should be adjusted below.

 

% The default value of n = 2.

 

 

n = 2;

 

sum = 0;

 

for

 j = 1:n-1;

 

    sum = sum+100*(x(:,j).^2-x(:,j+1)).^2+(x(:,j)-1).^2;

 

end

 

y = -sum;

 

 

 

background image

Wnioski: 

 

 

Aby uwzględnić wydajność algorytmów, dla każdego z nich przyjęto taką samą liczbę iteracji 

100. Każdy z algorytmów poszukuje minimum funkcji w określonym obszarze dwóch zmiennych. Żeby 
znaleźć  maksimum,  skorzystano  z  funkcji  rosen  odbitej  symetrycznie  względem  płaszczyzny  x,y  (tj. 
f(x1,x2)*=-f(x1,x2) ) i dla tej funkcji poszukiwano minimum. Ekstrema poszukiwano dla przedziału <-
1,1>. Najlepszy z algorytmów okazał się algorytm symulowanego wyżarzania simulannealbnd, dzięki 
któremu  otrzymano  najdokładniejsze  wyniki  oraz  w  najkrótszym  czasie.  Jednak  przy  zbyt  małej 
liczbie  iteracji  niekiedy  otrzymywano  duże  błędy.  Najgorzej  pod  względem  dokładności  spisał  się 
algorytm patternsearch, natomiast najmniej wydajnym jest algorytm ga.  

 

Patternsearch  jako  jedyny  z  użytych  algorytmów  jest  algorytmem  determistycznym,  tzn  nie 

zawiera  elementów  losowości.  Skutkowało  to  tym,  że  każde  wywołanie  opisanej  funkcji  dawało  te 
same  wyniki.  Pozostałe  algorytmy  ga  oraz  simulannealbnd  są  algorytmami  stochastycznymi 
(zawierające  elementy  losowości).  Każde  kolejne  poszukiwanie  ekstremum  funkcji  za  pomocą  tych 
algorytmów dawało inne wyniki. Wyniki te natomiast nie wiele się różniły od siebie.  

 

Algorytm  simulannealbnd  wymaga  większej  liczby  iteracji  lecz  jego  wydajność  jest  na  tyle 

duża, że z powodzeniem można liczbę iteracji zwiększyć. Czas wykonania algorytmu simulannealbnd 
dla 100 iteracji jest porównywalny z czasem wykonania algorytmu patternsearch dla 10 iteracji.