下面总结一下本人在学习智能算法的过程中所了解到的经典测试函数,参考书籍(matlab优化算法案例分析与应用)
特征
这些函数都是有许多局部最优值,所以可以用来测试智能算法寻找全局最优值的性能。
Griewank函数
全局最小值是在变量均为零时
下图为二维Griewank函数图像
function DrawGriewank()
x = [-20 : 0.3 : 20];
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
mesh(X,Y,z);
view([-15.5 30]);
shading interp
end
function y=Griewank(x)
[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;
end
Rastrigin函数
全局最小值是在变量均为零时
下图为二维Rastrigin函数图像
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
mesh(X,Y,z);
shading interp
end
function y = Rastrigin(x)
[row,col] = size(x);
if row > 1
error( ' 输入的参数错误 ' );
end
y = sum(x.^2 - 10 * cos( 2 * pi * x) + 10 );
y =y;
end
Schaffer函数
全局最大值是在变量均为零时
0.5
+
(
(
s
i
n
(
x
1
2
+
x
2
2
)
0.5
)
−
0.5
)
/
(
1
+
0.001
∗
(
x
1
2
+
x
2
2
)
)
2
0.5+((sin(x1^2+x2^2)^{0.5})-0.5)/(1+0.001*(x1^2+x2^2))^2
0.5+((sin(x12+x22)0.5)−0.5)/(1+0.001∗(x12+x22))2
下面为Schaffer函数图像
function DrawSchaffer()
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)=Schaffer([X(h,l),Y(h,l)]);
end
end
mesh(X,Y,z);
shading interp
end
function result=Schaffer(x1)
[row,col]=size(x1);
if row>1
error('输入的参数错误');
end
x=x1(1,1);
y=x1(1,2);
temp=x^2+y^2;
result=0.5-(sin(sqrt(temp))^2-0.5)/(1+0.001*temp)^2;
end
Ackley函数
最小值是在变量均为0时
下面是二维Ackley函数图像
function DrawAckley()
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)=Ackley([X(h,l),Y(h,l)]);
end
end
mesh(X,Y,z);
shading interp
end
function y=Ackley(x)
[row,col]=size(x);
if row>1
error('输入的参数错误');
end
y=-20*exp(-0.2*sqrt((1/col)*(sum(x.^2))))-exp((1/col)*sum(cos(2*pi.*x)))+exp(1)+20;
end
Rosenbrock函数
当变量全为1的时候,取得最小值0
下面为二维RosenBrock函数图像:
function DrawRosenbrock()
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)=Rosenbrock([X(h,l),Y(h,l)]);
end
end
mesh(X,Y,z);
shading interp
end
function y=Rosenbrock(x)
[row,col]=size(x);
if row>1
error('输入的参数错误');
end
y=100*(x(1,2)-x(1,1)^2)^2+(x(1,1)-1)^2;
y=-y;
end