黄金分割寻优算法(0.618法)的Matlab实现

最近我们开学了,今年选修了“优化算法”,最近都在学习算法,所以想着把书本上的算法用Matlab实现,说不定以后能直接用上呢。废话不多说,直接开始,主要是代码的分享,原理请自行了解。

1. 代码实现的思路(这是课上老师讲解的笔记,所以这应该算是我们老师的成果,我仅仅代码撰写工)

2. 具体代码:

function[Optx,Opty,ValueRange,IteNum,OptTime]=opt_goldensection(a0,b0,delta)
% 黄金分割优化算法,亦称0.618优化算法
% 0.618的由来:是为了减少计算量,通过解析计算得出的值
% 参数设置:delta--精度设置;[a,b]--初始搜索区间;区间更新为[A(i),B(i)];
% 输出为:Optx--寻优结果(最终区间的均值);Opty--优化函数的最优值;ValueRange--最优解所在区间;
%           IteNum--迭代次数;OptTime--代码执行时间
% 插值点分别用u和v表示;精度更新为dist(i)
% 该代码需要在phi函数(目标函数)变化时进行修改
tic;
A(1) = a0;
B(1) = b0;
u(1) = a0+0.382*(b0-a0);
v(1) = a0+0.618*(b0-a0);
phi1 = phi(u(1));
phi2 = phi(v(1));
dist(1) = delta+1;   %预置dist>delta
i = 1;
while dist(i)>delta
    if phi1>phi2
        if dist(i)<=delta
            break
        else
            A(i+1) = u(i);
            B(i+1) = B(i);
            u(i+1) = v(i);
            v(i+1) = A(i+1)+0.618*(B(i+1)-A(i+1));
            phi1 = phi2;
            phi2 = phi(v(i+1));
        end
    else
        if dist(i)<=delta
            break
        else
            A(i+1) = A(i);
            B(i+1) = v(i);
            v(i+1) = u(i);
            u(i+1) = A(i+1)+0.382*(B(i+1)-A(i+1));
            phi2 = phi1;
            phi1 = phi(u(i+1));
        end
    end 
  dist(i+1) = B(i+1)-A(i+1);
  i = i+1;  
end
IteNum = i-1;
Optx = (A(i)+B(i))/2;
Opty = phi(Optx);
ValueRange = [A(i) B(i)];
toc; 
OptTime = toc;
function[y]=phi(x)
    %函数定义,根据我们的需求进行修改
    y =  1-21.6*x-3*x^2;
end  
end

-----------------------------------------------谦虚学习分割线------------------------------------------------------------

我本科电力专业的,所以代码可能写得不是那么好,如果大家使用过程中出现什么问题,欢迎不吝赐教!

  • 10
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值