1.模式搜索算法基础理论
模式搜索算法是一种无需导数信息的直接搜索算法,只依赖于计算函数值的方法,其核心内容为轴向探测和组合模式搜索,配合模式步长缩放寻优直到步长衰减到收敛位置。基本思想是从一个基点开始,交替实施轴向探测和组合模式搜索。轴向探测依次沿着n个坐标轴方向进行来确定新的基点和有利于函数值下降的方向。组合模式搜索则是沿着两个基点的连线方向进行,企图使函数值下降更快。
2.matlab代码实现
假设优化问题为:
其中n表示问题最大维度,该球面函数理论最小值为0
代码如下:
% function ps=psf01f(x0)
%-ps模式搜索算法-------------
%定义模式搜索算法初始参数
close all;clear;clc;
global lb ub w sp spr rr sm iter e ymv sp1 yz
lb=-30;ub=30;w=30;sp=1;sm=1E-5;spr=2;rr=0.5;iter=10000;yz=1E-5;
x0=lb+(ub-lb).*rand(1,w);%初始点l
trace(1,:)=f11f(x0);
% x0=[1.8 1 1 1 1 1.3 1 1 1 1.9];
e=eye(w,w);%模式矩阵
ymv=x0;x(1,:)=x0;xxl=2;
disp(["dai=",num2str(1),'xxxx',num2str(x(1,:)),'xxxx',num2str(f11f(x(1,:)))])
%-算法开始
while xxl<=iter
sp1=sp;
for xl=1:size(e,1)
if f11f(ymv+e(xl,:)*sp1)<f11f(ymv)
ymv=ymv+e(xl,:)*sp1;
else
sp1=0.382*sp;
if f11f(ymv+e(xl,:)*sp1)<f11f(ymv)
ymv=ymv+e(xl,:)*sp1;
else
sp1=-sp;
if f11f(ymv+e(xl,:)*sp1)<f11f(ymv)
ymv=ymv+e(xl,:)*sp1;
else
sp1=-0.382*sp;
if f11f(ymv+e(xl,:)*sp1)<f11f(ymv)
ymv= ymv+e(xl,:)*sp1;
else
ymv=ymv;
end
end
end
end
end
x(xxl,:)=ymv;
if f11f(x(xxl,:))<f11f(x(xxl-1,:))
ymv= x(xxl,:)+spr*(x(xxl,:)-x(xxl-1,:));
sp= spr*sp;
elseif f11f(x(xxl,:))>=f11f(x(xxl-1,:))&&sp<sm
break
end
if (sp>sm)&(x(xxl,:)~=x(xxl-1,:))
ymv=x(xxl,:);
else
ymv=x(xxl,:);sp=rr*sp;
end
disp(["dai=",num2str(xxl),'xxxx',num2str(x(xxl,:)),'xxxx',num2str(f11f(x(xxl,:)))])
trace=[trace;f11f(x(xxl,:))];
if f11f(x(xxl,:))<yz;break;end
xxl=xxl+1;
end
Xmin=x(end,:);y0=f11f(Xmin);disp(["当前最优",'xxxx',num2str(Xmin),'xxxx',num2str(y0)])
% end
plot(trace,'r*');title('30维球面函数优化最小值');xlabel('迭代次数');ylabel('适应度值')
%指标函数
function yy=f11f(x)
yy=sum(x.^2);
% dim=size(x,2);
% yy=sum(100*(x(2:dim)-(x(1:dim-1).^2)).^2+(x(1:dim-1)-1).^2);
% yy=sum(([1:30]-x).^2);
end
寻优结果如下图: