不精確線搜索方法


  精確線搜索花費的計算量一般較大。一般問題中,特別是初始迭代點具體目標點較遠時,不精確線搜索的效率往往要高於精確線搜索。並且牛頓法和擬牛頓法的收斂速度不依賴於步長的搜索,因此可以對α進行不精確線搜索。

 

  不精確線搜索包括Goldstein准則、Wofle准則和Armijo准則。

 

1. GoldStein准則

  

  其中0<ρ<1/2,第一個不等式是充分下降條件,第二個不等式表示αk不會太小.

  也可以寫成

  

 

 2. Wolfe准則

  Goldstein准則的第二個不等式可能造成把極小點排除在可接受區間外,為了解決這個問題,提出了下面的代替條件

  σ∈(ρ,1)

  即

  

  這個條件叫做曲率條件

  充分下降條件與曲率條件一起構成了Wolfe准則

  

  其中 

  但曲率條件的不足之處是即使σ→0時也不能精確線搜索,因此有了強Wolfe准則

  

3. Armijo准則

  給定β∈(0,1),ρ∈(0,1/2),τ>0,mk是使不等式

  

  成立的最小非負整數,令

  

  上面的不等式實際上就是充分下降條件,這個方法可以令α從1開始縮小(增大m),直到滿足充分下降條件

 

下面給出這幾種算法的python實現

Goldstein准則:

 1 from linear_search.Function import *
 2 from numpy import *
 3 
 4 
 5 def goldstein(f, val, d):
 6     a = 0
 7     b = 10000
 8     alpha = 1
 9 
10     def _fi(_alpha):
11         return f(val + _alpha * array(d))
12 
13     fi = Function(_fi)
14     fi0 = fi.value(0)
15     dfi0 = fi.diff(0)
16     while True:
17         fi_alpha = fi.value(alpha)
18         if fi_alpha > fi0 + 1 / 3 * alpha * dfi0:
19             b = alpha
20             alpha = (a + b) / 2
21         elif fi_alpha < fi0 + 2 / 3 * alpha * dfi0:
22             a = alpha
23             if b == 10000:
24                 alpha = 2 * alpha
25             else:
26                 alpha = (a + b) / 2.
27         else:
28             return alpha

Wolfe准則:

 1 from linear_search.Function import *
 2 from numpy import *
 3 
 4 
 5 def wolfe(_f, val, d):
 6     a = 0.0
 7     b = 10000.0
 8 
 9     def _fi(_alpha):
10         return _f(val + _alpha * array(d))
11 
12     fi = Function(_fi)
13     f = Function(_f)
14 
15     fi1 = f.value(val)
16     g=f.grad(val)
17     print(f.part(0,[1,2]))
18     print(f.part(1,[1,2]))
19     dfi1 = dot(g,array(d).T)
20     dfi0 = fi.diff(0)
21     alpha = 1.0
22 
23     while True:
24         fi_=fi.value(alpha)
25         if fi_-fi1>1/3*alpha*dfi1:
26             alpha_=a+(alpha-a)/2/(1+(fi1-fi_)/(alpha-a)/dfi1)
27             b=alpha
28             alpha=alpha_
29         else:
30             dfi_alpha=fi.diff(alpha)
31             if dfi_alpha<1/2*dfi1:
32                 alpha_=alpha+(alpha-a)*dfi_alpha/(dfi1-dfi_alpha)
33                 a=alpha
34                 fi1=fi_
35                 dfi1=dfi_alpha
36                 alpha=alpha_
37             else:
38                 return alpha

 Armijo准則:

 1 from linear_search.Function import *
 2 from numpy import *
 3 
 4 
 5 def armijo(_f, val, d):
 6     alpha=1
 7 
 8     def _fi(_alpha):
 9         return _f(val + _alpha * array(d))
10 
11     fi = Function(_fi)
12     f = Function(_f)
13     fi_=fi.value(alpha)
14     f_=f.value(val)
15     while True:
16         if fi_>f_+1/3*alpha*dot(f.grad(val),array(d).T):
17             alpha=0.7*alpha
18         else:
19             return alpha

 


免責聲明!

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



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