本文简述多变量无约束最优化问题
的步长加速法。步长加速法主要由交替进行的“探测搜索”和“模式移动”组成,前者是为了寻找当前迭代点的下降方向,后者是沿着这个有利方向寻求新地迭代点。
给定初始点,以它作为“探测搜索”的参考点R,在其周围以某一步长寻找比它更好的点作为基点B,即,得到下降方向(称该方向为模式),然后从B出发沿模式做直线搜索(称为模式移动)获得新的参考点,即,,一般取为1。然后继续“探测搜索”、“模式移动”……
下面对“探测搜索”和“模式移动”进行详细说明。
“探测搜索”又叫做“坐标循环试探”,我们以二维来举例说明。对于二维平面的一点X,沿着坐标共有四个方向,如下图所示。
我们用这样的方法来“探索”:从开始,对于维度,先以某步长试探它的正方向,若是较优点,从这个点Y开始进行维度的搜索,若不是,再试探负方向,若没有较优点,则仍从开始进行维度的搜索,两个维度搜索完之后,有两种结果:
①所有方向搜索都失败了
②找到附近的更好的点
对于第一种结果,缩短步长继续搜索,若步长缩短到预定的最小的步长了,则就是最优点。对于第二种结果,开始接下来的“模式加速移动”。
由于,我们猜测是一个有利方向,从Y开始沿着这个方向移动得到一个点,如果是更优点,则加速成功,以这个点为参考点继续“探测搜索”,若不是,则直接以Y为参考点“探测搜索”。
下面附上matlab代码
function[X,fX,k]=StepLengthAccelerationMethod(f,X0,Delta,Dlimit,alpha)
%--------------------------------------------------------------------------
% 步长加速法
% 设问题为min f(x),x in En
% 输入参数
% f:目标函数;X0:初始值;Delta:探索步长;Dlimit:迭代终止条件;alpha:加速因子
% 输出参数
% 最终确定的最小值点X和它对应的最小值fX,以及迭代次数k
% 从一个基点X0出发,依次沿着n个坐标轴方向用固定步长Delta[探测]目标值更小的点
% 基点记为Xi,动点记为Yi
%--------------------------------------------------------------------------
% 确定自变量的维数
En=length(X0);
% 构造单位向量
E=eye(En);
k=0;
if(nargin==4)
alpha=2; % 如果不输入参数alpha,则默认为2
end
while Delta>Dlimit
Y0=X0;
for i=1:En
Y=Y0+Delta*E(i,:);
if(f(Y)<f(Y0))
Y0=Y;% 成功了继续下一个维度
else
Y=Y0-Delta*E(i,:);
if(f(Y)<f(Y0))
Y0=Y; %继续下一个维度
end % 失败了也进行下一个维度的探索
end
end
if(isequal(Y0,X0)) %%判断两个向量相等不能单纯 Y0~=X0
% 各个方向都试了失败了,缩短步长
Delta=Delta/2;
% 返回前面for循环
else
% 成功找到一个新的基点Y0,并找到一个较优的方向
% 开始模式加速
L=Y0-X0;
Y=Y0+alpha*L;
if(f(Y)<f(Y0))
X0=Y;% 加速成功了,把这个点作为新一轮迭代的基点
else
X0=Y0;% 加速失败了,退回去把加速前的点作为新一轮迭代的基点
end
end
k=k+1;
end
% 模式加速成功了,上面循环还得继续,只有模式加速失败了,才会导致Delta的缩短,故最后的最优点是X0(也是Y0)
%--------------------------------------------------------------------------
% 输出结果
%--------------------------------------------------------------------------
X=X0;
fX=f(X);
对如下函数进行最小值求解
function [y] = camel3(xx)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% INPUTS:
%
% xx = [x1, x2]
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x1 = xx(1);
x2 = xx(2);
term1 = 2*x1^2;
term2 = -1.05*x1^4;
term3 = x1^6 / 6;
term4 = x1*x2;
term5 = x2^2;
y = term1 + term2 + term3 + term4 + term5;
end
图中的小红圈即为所求得的最小值点。