最優化算法【線搜索-黃金分割(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. 對於應用范圍有限制【單峰函數】。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM