一维搜索方法c语言,优化方法基础系列-非精确的一维搜索技术
選擇最優步長的精確搜索方法往往計算量大,特別是當迭代點遠離最優解時,效率很低,而且很多最優化算法的收斂速度并不依賴于精確的一維搜索過程。這促使一些研究者放寬了一維搜索的精確要求,而去保證目標函數在每次迭代有滿意的下降量,這類方法稱為非精確的一維搜索方法或可接受的一維搜索方法,它可以大大節省計算量。
不精確的一維搜索方法核心問題是選取可接受的步長
使得
得到一個滿意的水平,即足夠的下降且大范圍收斂。因此,研究者提出了一些準則,以滿足不精確搜索能也能收斂的條件。Armijo-Goldstein和Wolf-Powell準則為非精確一維搜索的兩大準則。
Armijo-Goldstein準則
Armijo-Goldstein準則核心思想就兩點:
1、目標函數值應該有足夠的下降
2、一維搜索的步長
不應該太小
這兩點意圖是非常明顯,由于最優化問題就是尋找極小值,所以使得目標函數值下降,是我們努力的方向,此外如果搜索步長太小,可能原地打轉,影響收斂速度。具體方法如下:
假設
是一個下降方向,記
,有:
則
的一個合理的下界(保證下降):
再給其一個上界限制(
不能太小):
那么Armijo-Goldstein準則可描述為:
可接受的
應該滿足:
注:如果
不在這個范圍內,將影響其超線性收斂性。
圖1 Armijo-Goldstein準則示例
令
,即固定
和方向
,求解滿足條件的步長,則Armijo-Goldstein可寫為:
從上圖和公式中,可以看出
在
的下方,
在
的下方,所以
區間都是在滿足條件的步長。然而,Armijo-Goldstein準則可能會把極值點判斷在可接受的范圍之外,所以為了解決這一問題,Wolf-Powell準則應用而生。
圖 2 Armijo-Goldstein 準則流程圖
Algorithm 9 Armijo-Goldstein準則
function lamda = ArmijoGoldstein(func,gfunc,lamda0,ro,apha,iterNum,plotFlag)
if nargin<7
plotFlag = 1;
end
if nargin<6
iterNum = 100;
end
if nargin<5
apha = 2;
end
if nargin<4
ro = 0.1;
end
if nargin<3
lamda0 = 1;
end
a = 0;
b = inf;
lamda =lamda0;
f0 = func(0);
g0 = gfunc(0);
if plotFlag == 1
figH = figure();
end
while iterNum
flamda = func(lamda);
if plotFlag == 1
pause(1)
plot(0:0.01:4,func(0:0.01:4),'-b');
hold on;
plot([0,4],[f0,f0],'-y');
plot([0,4],[f0,f0+ro*4*g0],'-or');
plot([0,4],[f0,f0+(1-ro)*4*g0],'-og');
plot([0,lamda],[f0,flamda],'-*k');
plot(a,func(a),'-*g');
if ~isinf(b)
plot(b,func(b),'-*r');
end
hold off;
end
if flamda<=f0+ro*lamda*g0 %滿足Armijo準則,足夠的下降
if flamda>=f0+(1-ro)*lamda*g0 %滿足Goldstein,步長不會太小
break;
else %不滿足Goldstein,步長太小,左端的a設置為lamda
a = lamda;
if isinf(b)%右端的b為空的時候,說明Armijo準則一直是滿足的,步長太小了,擴大步長
lamda = apha*lamda;
else
lamda = (a+b)/2; %步長設定為區間的中值
end
end
else%下降不足,縮小b和步長
b = lamda;
lamda = (a+b)/2;
end
iterNum = iterNum - 1;
end
%示例
%lamda = ArmijoGoldstein(@(x)(sin(-4+x)-1),@(x)(cos(-4+x)),1,0.4,2,100,1)
Wolf-Powell 準則
Wolf-Powell準則下界和Armijo-Goldstein準則是一樣的,即:
為了保證足夠的步長以及可接受的區間包含極小值點,上界被定義:
也就是:
其說明在點
處的斜率應該大于起始點斜率的
倍。
是負值,所以上界的含義就是可接受的范圍中斜率應該是接近零的負值或者正值。
此外,還有一種更為嚴苛的準則,稱為強Wolf調節,即:
強Wolf條件使得可接受的范圍的斜率的正值不至于過大,可以將遠離極小值點的步長排除在外。一般
越小,線性搜索越精確,不過
越小,工作量越大,一般取
圖 3 強Wolf條件示意圖
Algorithm 10 Wolf-Powell 準則
function lamda = WolfPowell(func,gfunc,lamda0,ro,sigma,apha,iterNum,plotFlag)
if nargin<8
plotFlag = 1;
end
if nargin<7
iterNum = 100;
end
if nargin<6
apha = 2;
end
if nargin<5
ro = 0.1;
end
if nargin<4
sigma = 0.7;
end
if nargin<3
lamda0 = 1;
end
a = 0;
b = inf;
lamda =lamda0;
f0 = func(0);
g0 = gfunc(0);
if plotFlag == 1
figH = figure();
for i=0:0.01:4
if gfunc(i)>=sigma*g0;
gs_i = i;
break;
end
end
end
while iterNum
flamda = func(lamda);
if plotFlag == 1
pause(1)
plot(0:0.01:4,func(0:0.01:4),'-b');
hold on;
plot([0,4],[f0,f0],'-y');
plot([0,4],[f0,f0+ro*4*g0],'-or');
plot([gs_i-0.5,gs_i+0.5],[func(gs_i)+(-0.5)*sigma*g0,func(gs_i)+(0.5)*sigma*g0],'-og');
plot([0,lamda],[f0,flamda],'-*k');
plot(a,func(a),'-*g');
if ~isinf(b)
plot(b,func(b),'-*r');
end
hold off;
end
if flamda<=f0+ro*lamda*g0 %滿足Armijo準則,足夠的下降
if gfunc(lamda)>=sigma*g0 %滿足wolf-powell,步長不會太小
break;
else %不滿足wolf-powell,步長太小,左端的a設置為lamda
a = lamda;
if isinf(b)%右端的b為空的時候,說明Armijo準則一直是滿足的,步長太小了,擴大步長
lamda = apha*lamda;
else
lamda = (a+b)/2; %步長設定為區間的中值
end
end
else%下降不足,縮小b和步長
b = lamda;
lamda = (a+b)/2;
end
iterNum = iterNum - 1;
end
%example
%lamda = WolfPowell(@(x)(sin(-4+x)-1),@(x)(cos(-4+x)),1,0.4,0.45,2,100,1)
圖4 Wolf-Powell條件示意圖
后退法(簡單準則)
后退法僅采用了Armijo-Goldstein準則的下界限制,即保證函數的下降,此外要求
不要太小即可。其基本思想是:
給定
Step1 令
Step2 如果
,則令
停止迭代,輸出
;否則轉Step3
Step3
,轉Step2
關于這些準則的有效性,比如步長的存在性,大范圍收斂性質可參閱劉紅英版本的數值規劃基礎或者Numerical Optimization。后來學者們又發展了Curry-Altman步長律、Danilin-Pshenichuyi步長律、De Leone-Grippo步長律等,這些步長律或者準則會在后文的具體優化算法中有所涉及,使用的過程中可能會大大加速優化方法的收斂。
參考文獻:
[1] Numerical Optimization. Jorge Nocedal
總結
以上是生活随笔為你收集整理的一维搜索方法c语言,优化方法基础系列-非精确的一维搜索技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Thinkphp 操作提示 ThinkP
- 下一篇: 字节(b)转换为千字节(kb)和兆(mb