下面給出幾個適應度評價函數,並給出圖形表示
頭幾天機子種了病毒,重新安裝了系統,不小心把程式全部格式化了,痛哭!!!沒辦法,好多程式不見了,現在把這幾個典型的函數重新編寫了,把他們給出來,就算粒子群演算法的一個結束吧!痛恨病毒!!!!
第一個函數:Griewank函數,圖形如下所示:
適應度函數如下:(為了求最大值,我去了所有函數值的相反數)
function y
=
Griewank(x)
%
Griewan函數
%
輸入x,給出相應的y值,在x
=
(
0
,
0
,…,
0
)處有全域極小點0.
%
編製人:
%
編製日期:
[row,col]
=
size(x);
if
row
>
1
error(
'
輸入的參數錯誤
'
);
end
y1
=
1
/
4000
*
sum(x.
^
2
);
y2
=
1
;
for
h
=
1
:col
y2
=
y2
*
cos(x(h)
/
sqrt(h));
end
y
=
y1
-
y2
+
1
;
y
=-
y;
繪製函數映像的代碼如下:
function DrawGriewank()
%
繪製Griewank函數圖形
x
=
[
-
8
:
0.1
:
8
];
y
=
x;
[X,Y]
=
meshgrid(x,y);
[row,col]
=
size(X);
for
l
=
1
:col
for
h
=
1
:row
z(h,l)
=
Griewank([X(h,l),Y(h,l)]);
end
end
surf(X,Y,z);
shading interp
第二個函數:Rastrigin函數,圖形如下所示:
適應度函數如下:(為了求最大值,我去了所有函數值的相反數)
function y
=
Rastrigin(x)
%
Rastrigin函數
%
輸入x,給出相應的y值,在x
=
(
0
,
0
,…,
0
)處有全域極小點0.
%
編製人:
%
編製日期:
[row,col]
=
size(x);
if
row
>
1
error(
'
輸入的參數錯誤
'
);
end
y
=
sum(x.
^
2
-
10
*
cos(
2
*
pi
*
x)
+
10
);
y
=-
y;
繪製函數映像的代碼如下:
function DrawRastrigin()
%
繪製Rastrigin函數圖形
x
=
[
-
5
:
0.05
:
5
];
y
=
x;
[X,Y]
=
meshgrid(x,y);
[row,col]
=
size(X);
for
l
=
1
:col
for
h
=
1
:row
z(h,l)
=
Rastrigin([X(h,l),Y(h,l)]);
end
end
surf(X,Y,z);
shading interp
第三個函數Schaffer函數,圖形如下所示:
函數的代碼如下,因為該函數在(0,...,0)處有最大值1,因此不需要取相反數。
function result=Schaffer(x1)<br />%Schaffer 函數<br />%輸入x,給出相應的y值,在x=(0,0,…,0) 處有全域極大點1.<br />%編製人:<br />%編製日期:<br />[row,col]=size(x1);<br />if row>1<br /> error('輸入的參數錯誤');<br />end<br />x=x1(1,1);<br />y=x1(1,2);<br />temp=x^2+y^2;<br />result=0.5-(sin(sqrt(temp))^2-0.5)/(1+0.001*temp)^2;
繪製函數代碼圖形的代碼如下:
function DrawSchaffer()<br />x=[-5:0.05:5];<br />y=x;<br />[X,Y]=meshgrid(x,y);<br />[row,col]=size(X);<br />for l=1:col<br />for h=1:row<br />z(h,l)=Schaffer([X(h,l),Y(h,l)]);<br />end<br />end<br />surf(X,Y,z);<br />shading interp
第四個函數:Ackley函數,函數圖形如下:
函數的代碼如下,因為
該函數在(0,...,0)處有最小值0,因此需要取相反數
function result=Ackley(x)<br />%Ackley 函數<br />%輸入x,給出相應的y值,在x=(0,0,…,0) 處有全域極小點0,為得到最大值,傳回值取相反數<br />%編製人:<br />%編製日期:<br />[row,col]=size(x);<br />if row>1<br /> error('輸入的參數錯誤');<br />end<br />result=-20*exp(-0.2*sqrt((1/col)*(sum(x.^2))))-exp((1/col)*sum(cos(2*pi.*x)))+exp(1)+20;<br />result=-result;
繪製函數代碼圖形的代
碼如下:
function DrawAckley()<br />%繪製Ackley函數圖形<br />x=[-8:0.1:8];<br />y=x;<br />[X,Y]=meshgrid(x,y);<br />[row,col]=size(X);<br />for l=1:col<br /> for h=1:row<br /> z(h,l)=Ackley([X(h,l),Y(h,l)]);<br /> end<br />end<br />surf(X,Y,z);<br />shading interp
第五個函數是:Rosenbrock函數,該函數在(1,...,1)處有最小值0,為了得到最大值,取函數值的相反數。
函數圖形如下所示
函數的代碼:
function result=Rosenbrock(x)<br />%Rosenbrock 函數<br />%輸入x,給出相應的y值,在x=(1,1,…,1) 處有全域極小點0,為得到最大值,傳回值取相反數<br />%編製人:<br />%編製日期:<br />[row,col]=size(x);<br />if row>1<br /> error('輸入的參數錯誤');<br />end<br />result=100*(x(1,2)-x(1,1)^2)^2+(x(1,1)-1)^2;<br />result=-result;
繪製函數圖形的代碼如下:
function DrawRosenbrock()<br />%繪製Rosenbrock函數圖形,大鐵鍋函數,哈哈<br />x=[-8:0.1:8];<br />y=x;<br />[X,Y]=meshgrid(x,y);<br />[row,col]=size(X);<br />for l=1:col<br /> for h=1:row<br /> z(h,l)=Rosenbrock([X(h,l),Y(h,l)]);<br /> end<br />end<br />surf(X,Y,z);<br />shading interp
這樣粒子群演算法不得不草草收場。