最优化算法【线搜索-黄金分割(0.618)算法】

使用条件

优化函数在搜索区间内为单峰函数

算法

算法类似于二分查找算法,能够求单峰函数在搜索区间的极值

算法如下:
\(step0:\)
\(\qquad\)确定单峰函数\(f(x)\)的搜索区间\([a_0,b_0]\);容错误差\(\delta=a-b\), \(\epsilon=f(b)-f(a)\) ,t=0.618;\(p=a_0+(1-t)(b_0-a_0)\),\(q=a_0+t(b_0-a_0)\)
\(step1:\)

\[f(p) <=f(q)\begin{cases} yes, & \text{to step 2}\\ no, & \text{to step 3} \end{cases} \]

\(step2:\)

    if |f(b)-f(a)| >= $\epsilon or |b-a|>=\delta$
        b=q,f(b)=f(q), q=p, f(q)=f(p);
        p=a+(1-t)(b-a), resolve f(p);
    else
        stop;
        print p;\\p为求得极值点

\(step3:\)

    if |f(b)-f(a)| >= $\epsilon or |b-a|>\delta$
        a=p,f(a)=f(p), p=q, f(p)=f(q);
        q=a+t(b-a), resolve f(q);
    else
        stop;
        print q;\\p为求得极值点   

算法实现函数:

function [R,loos,loos_t] = xiansousuo_golds(func,a,b,delta,epsilon,iterate)
    t = (sqrt(5)-1)/2;
    p = a+(1-t)*(b-a);
    q = a+t*(b-a);
    f_a=func(a);
    f_b=func(b);
    f_p = func(p);
    f_q = func(q);

    R=zeros(1,2);
    loos_t = zeros(iterate,1);
    loos = zeros(1,2);
    %step1
    k=0;
    while abs(f_b-f_a)>=epsilon || abs(b-a) >= delta || k < iterate
        k=k+1;
        loos_t(k,1)=abs(f_b-f_a);
        if f_p <= f_q
            
            b=q;
            f_b=f_q;
            q=p;
            f_q =f_p;
            p=a+(1-t)*(b-a);
            f_p = func(p);    
        else
           
            a=p;
            f_a=f_p;
            p=q;
            f_p =f_q;
            q=a+t*(b-a);
            f_q=func(q);  
        end
        
        %disp([p,abs(f_b-f_a)]);
    end
    if f_p <= f_q
        R(1,1)=p;
        R(1,2)=func(p);
    else
        R(1,1)=q;
        R(1,2)=func(q);
    end
    
    loos=[abs(b-a),abs(f_b-f_a)];   
end

main函数

clc;
close all;

iterate=30;
func=@(s) s^2-sin(s);
[R,loos,loos_t]=xiansousuo_golds(func,0,1,1e-4,1e-5,iterate);
disp(R);
disp(loos);
figure(1);
plot(1:iterate,loos_t);
figure(2);
t=linspace(0,1,iterate);
y=zeros(iterate,1);
for i =1:iterate
    y(i,1)=func(t(i));
end
plot(t,y);
hold on;
minimum = fminbnd(func,0,1);
f_min=func(minimum);
plot(minimum,f_min,'rp','MarkerSize',10);
text(minimum,f_min,['(',num2str(minimum),',',num2str(f_min),')'],'color','b');
disp([minimum,f_min]);

epsilon随迭代变化

Image

所求函数及极小值

Image

conclusion

  1. 算法求得结果和matlab极小值函数结果相同,精度较高;
  2. 对于应用范围有限制【单峰函数】。
posted @ 2020-08-04 15:45  ldfm  阅读(1434)  评论(0编辑  收藏  举报