无约束多变量寻优方法——步长加速法

        本文简述多变量无约束最优化问题

min f(x)  x\in R^n

的步长加速法。步长加速法主要由交替进行的“探测搜索”和“模式移动”组成,前者是为了寻找当前迭代点的下降方向,后者是沿着这个有利方向寻求新地迭代点。

        给定初始点x_0(x_0\in R^n),以它作为“探测搜索”的参考点R,在其周围以某一步长寻找比它更好的点作为基点B,即f(B)<f(R),得到下降方向B-R(称该方向为模式),然后从B出发沿模式B-R做直线搜索(称为模式移动)获得新的参考点,即\tilde{R}=B+\alpha(B-R)\alpha>0,一般取为1。然后继续“探测搜索”、“模式移动”……

         下面对“探测搜索”和“模式移动”进行详细说明。

        “探测搜索”又叫做“坐标循环试探”,我们以二维来举例说明。对于二维平面的一点X,沿着坐标共有四个方向,如下图所示。

 

我们用这样的方法来“探索”:从X_0开始,对于x_1维度,先以某步长试探它的正方向,若是较优点,从这个点Y开始进行x_2维度的搜索,若不是,再试探负方向,若没有较优点,则仍从开始X_0进行x_2维度的搜索,两个维度搜索完之后,有两种结果:

X_0=Y \implies所有方向搜索都失败了

X_0 \neq Y \implies找到X_0附近的更好的点

对于第一种结果,缩短步长继续搜索,若步长缩短到预定的最小的步长了,则X_0就是最优点。对于第二种结果,开始接下来的“模式加速移动”。

        由于f(Y)<f(X_0),我们猜测Y-X_0是一个有利方向,从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

 

 图中的小红圈即为所求得的最小值点。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值