日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一维搜索方法c语言,优化方法基础系列-非精确的一维搜索技术

發(fā)布時(shí)間:2023/12/8 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一维搜索方法c语言,优化方法基础系列-非精确的一维搜索技术 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

選擇最優(yōu)步長的精確搜索方法往往計(jì)算量大,特別是當(dāng)?shù)c(diǎn)遠(yuǎn)離最優(yōu)解時(shí),效率很低,而且很多最優(yōu)化算法的收斂速度并不依賴于精確的一維搜索過程。這促使一些研究者放寬了一維搜索的精確要求,而去保證目標(biāo)函數(shù)在每次迭代有滿意的下降量,這類方法稱為非精確的一維搜索方法或可接受的一維搜索方法,它可以大大節(jié)省計(jì)算量。

不精確的一維搜索方法核心問題是選取可接受的步長

使得

得到一個(gè)滿意的水平,即足夠的下降且大范圍收斂。因此,研究者提出了一些準(zhǔn)則,以滿足不精確搜索能也能收斂的條件。Armijo-Goldstein和Wolf-Powell準(zhǔn)則為非精確一維搜索的兩大準(zhǔn)則。

Armijo-Goldstein準(zhǔn)則

Armijo-Goldstein準(zhǔn)則核心思想就兩點(diǎn):

1、目標(biāo)函數(shù)值應(yīng)該有足夠的下降

2、一維搜索的步長

不應(yīng)該太小

這兩點(diǎn)意圖是非常明顯,由于最優(yōu)化問題就是尋找極小值,所以使得目標(biāo)函數(shù)值下降,是我們努力的方向,此外如果搜索步長太小,可能原地打轉(zhuǎn),影響收斂速度。具體方法如下:

假設(shè)

是一個(gè)下降方向,記

,有:

的一個(gè)合理的下界(保證下降):

再給其一個(gè)上界限制(

不能太小):

那么Armijo-Goldstein準(zhǔn)則可描述為:

可接受的

應(yīng)該滿足:

注:如果

不在這個(gè)范圍內(nèi),將影響其超線性收斂性。

圖1 Armijo-Goldstein準(zhǔn)則示例

,即固定

和方向

,求解滿足條件的步長,則Armijo-Goldstein可寫為:

從上圖和公式中,可以看出

的下方,

的下方,所以

區(qū)間都是在滿足條件的步長。然而,Armijo-Goldstein準(zhǔn)則可能會(huì)把極值點(diǎn)判斷在可接受的范圍之外,所以為了解決這一問題,Wolf-Powell準(zhǔn)則應(yīng)用而生。

圖 2 Armijo-Goldstein 準(zhǔn)則流程圖

Algorithm 9 Armijo-Goldstein準(zhǔn)則

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準(zhǔn)則,足夠的下降

if flamda>=f0+(1-ro)*lamda*g0 %滿足Goldstein,步長不會(huì)太小

break;

else %不滿足Goldstein,步長太小,左端的a設(shè)置為lamda

a = lamda;

if isinf(b)%右端的b為空的時(shí)候,說明Armijo準(zhǔn)則一直是滿足的,步長太小了,擴(kuò)大步長

lamda = apha*lamda;

else

lamda = (a+b)/2; %步長設(shè)定為區(qū)間的中值

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 準(zhǔn)則

Wolf-Powell準(zhǔn)則下界和Armijo-Goldstein準(zhǔn)則是一樣的,即:

為了保證足夠的步長以及可接受的區(qū)間包含極小值點(diǎn),上界被定義:

也就是:

其說明在點(diǎn)

處的斜率應(yīng)該大于起始點(diǎn)斜率的

倍。

是負(fù)值,所以上界的含義就是可接受的范圍中斜率應(yīng)該是接近零的負(fù)值或者正值。

此外,還有一種更為嚴(yán)苛的準(zhǔn)則,稱為強(qiáng)Wolf調(diào)節(jié),即:

強(qiáng)Wolf條件使得可接受的范圍的斜率的正值不至于過大,可以將遠(yuǎn)離極小值點(diǎn)的步長排除在外。一般

越小,線性搜索越精確,不過

越小,工作量越大,一般取

圖 3 強(qiáng)Wolf條件示意圖

Algorithm 10 Wolf-Powell 準(zhǔn)則

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準(zhǔn)則,足夠的下降

if gfunc(lamda)>=sigma*g0 %滿足wolf-powell,步長不會(huì)太小

break;

else %不滿足wolf-powell,步長太小,左端的a設(shè)置為lamda

a = lamda;

if isinf(b)%右端的b為空的時(shí)候,說明Armijo準(zhǔn)則一直是滿足的,步長太小了,擴(kuò)大步長

lamda = apha*lamda;

else

lamda = (a+b)/2; %步長設(shè)定為區(qū)間的中值

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條件示意圖

后退法(簡單準(zhǔn)則)

后退法僅采用了Armijo-Goldstein準(zhǔn)則的下界限制,即保證函數(shù)的下降,此外要求

不要太小即可。其基本思想是:

給定

Step1 令

Step2 如果

,則令

停止迭代,輸出

;否則轉(zhuǎn)Step3

Step3

,轉(zhuǎn)Step2

關(guān)于這些準(zhǔn)則的有效性,比如步長的存在性,大范圍收斂性質(zhì)可參閱劉紅英版本的數(shù)值規(guī)劃基礎(chǔ)或者Numerical Optimization。后來學(xué)者們又發(fā)展了Curry-Altman步長律、Danilin-Pshenichuyi步長律、De Leone-Grippo步長律等,這些步長律或者準(zhǔn)則會(huì)在后文的具體優(yōu)化算法中有所涉及,使用的過程中可能會(huì)大大加速優(yōu)化方法的收斂。

參考文獻(xiàn):

[1] Numerical Optimization. Jorge Nocedal

總結(jié)

以上是生活随笔為你收集整理的一维搜索方法c语言,优化方法基础系列-非精确的一维搜索技术的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。