無約束優(yōu)化方法-直接方法(Downhill Simplex)

Downhill simplex 方法又稱為Nelder-Mead算法迹蛤、Amoeba方法民珍,由Spendley、Hext和Himsworth于1962年提出盗飒;Nelder和Mead 1965年進(jìn)行了改進(jìn)嚷量。該方法是一種不使用導(dǎo)數(shù)求解無約束極小化問題的直接搜索方法。針對的問題是:
\min_{x\in R^n}f(x)

f(x)R^n上的連續(xù)函數(shù)逆趣。

算法思想是集合迭代式的搜索蝶溶,即從集合S_0\rightarrow S_1\rightarrow S_2,...,S_k\rightarrow,...每一個集合都是一個單純形,每次迭代使得單純形的頂點(diǎn)目標(biāo)函數(shù)值下降宣渗。什么是Simplex單純形呢抖所?舉個例子,在一維中痕囱,一個線段就是一個單純形田轧,在二維中,一個三角形為一個單純形鞍恢,三維中一個四面體為一個單純形.......

圖1 單純形示意圖

具體定義為:
設(shè)V^0,V^1,...,V^n\in R^n傻粘,如果V_j-V_0(j=1,2,3,..,n)線性無關(guān),則V^0,V^1,...,V^n的凸組合稱為由V^0,V^1,...,V^n構(gòu)成的單純形帮掉,記S=\{V^0,V^1,...,V^n\},即S=\{V^0,V^1,...,V^n\}=\{x|\sum_{j=0}^na_jV^j,\sum_{j=0}^na_j=1,a_j>0\}稱為V^0,V^1,...,V^n單純形S的頂點(diǎn)弦悉。

Downhill Simplex幾個關(guān)鍵的定義:
f(V^h)=max(f(V^0),f(V^1),..,f(V^n))
f(V^l)=min(f(V^0),f(V^1),..,f(V^n))
V^h可稱為劣點(diǎn)。

形心點(diǎn):\bar{V}=\frac{1}{n}\sum_{i\neq h}V^i
反射點(diǎn):V^r=\bar{V}+\alpha(\bar{V}-V^h),\alpha一般取1蟆炊;

Downhill Simplex一般規(guī)則為:
如果f(V^r)<f(V^l)稽莉,說明反射點(diǎn)比最小頂點(diǎn)還要小,這種情況涩搓,需要對單純形進(jìn)行延伸:

延伸點(diǎn):V^e=\bar{V}+\beta(V^r-\bar{V})污秆,\beta一般取2后室;若f(V^e)<f(V^l),則用V^e代替V^h構(gòu)建新的單純形混狠,否則用V^r代替V^h構(gòu)建新的單純形。

(這里其實很很好理解疾层,延伸點(diǎn)比反射點(diǎn)有更大的步長将饺,如果比原來的單純形的最小值還要小,將劣點(diǎn)替換點(diǎn)痛黎,如果延伸點(diǎn)沒有比原單純形的最小值小予弧,那用反射點(diǎn)替換劣點(diǎn),確保替換后的單純形湖饱,替換后的點(diǎn)最幸锤颉)。

如果f(V^r)\geq f(V^l)井厌,說明反射點(diǎn)比最小頂點(diǎn)要大蚓庭,這種情況,需要對單純形進(jìn)行收縮仅仆。收縮有分為兩種情況:

  1. 如果對于任意頂點(diǎn)器赞,不包含劣點(diǎn)都小于或等于f(V^r)f(V^r)\leq f(V^h),則令收縮點(diǎn):V^c=\bar V+\gamma(V^r-\bar V),\gamma = 0.5墓拜;若f(V^c)<f(V^h)港柜,則用V^c代替V^h構(gòu)建新的單純形;

(這種情況下咳榜,相當(dāng)于反射點(diǎn)和劣點(diǎn)之間有一個谷夏醉,且極小值偏向反射點(diǎn)這邊。)

2 . 如果f(V^r)>f(V^h)涌韩,則收縮點(diǎn)定義為:V^c=\bar V+\gamma(V^h-\bar V),\gamma = 0.5畔柔,若f(V^c)<f(V^h),則用V^c代替V^h構(gòu)建新的單純形贸辈;

(這種情況下释树,依然是反射點(diǎn)和劣點(diǎn)之間有一個谷,且極小值偏向劣點(diǎn)這邊)

規(guī)則都這里擎淤,還有一種情況奢啥,就是上述的兩種情況的收縮點(diǎn)大于等于劣點(diǎn)情況:

當(dāng)收縮點(diǎn)大于等于劣點(diǎn)時,則需要對單純形進(jìn)行壓縮嘴拢,向V^l點(diǎn)進(jìn)行棱長減半桩盲,即V^i=\frac{V^i+V^l}{2}(i=0,1,2,...,n).

(這種情況下,收縮點(diǎn)的函數(shù)值大于等于劣點(diǎn)的函數(shù)值席吴,說明極小值在單純形的內(nèi)部的可能性更高赌结,將原單純形向最小頂點(diǎn)進(jìn)行壓縮捞蛋,構(gòu)造新的單純形)

function [x_min,f_min] = AmoebaMethod(func,x0,options)
if nargin<3
    options.tol = 1e-12;
    options.iterNum = 1000;
    options.bracketMethod = '';
    options.linearSrcMethod = '';
    options.plot2.Flag = 0;
    options.plot2.x = [];
    options.plot2.y = [];
    options.plot2.z = [];
end
tol = options.tol;
iterNum = options.iterNum;

plot2 = options.plot2;
if length(x0)~=2
    plot2.Flag = 0;
end

x_min = x0;
f_min = func(x0);

%step1構(gòu)建初始單純形
n = length(x0);
E = eye(length(x0));
S = zeros(n,n+1);
f_S = zeros(1,n+1);
S(:,1) = x0;
f_S(1) = f_min;
sigma = 0.5;
afa = 1;
beta = 2;
gama = 0.5;

for i=1:1:n
    S(:,i+1) = S(:,i)+sigma.*E(:,i);
    f_S(i+1) = func(S(:,i+1));
end


[f_S,sIdx]=sort(f_S,'descend'); %將頂點(diǎn)按照函數(shù)值進(jìn)行排序,劣點(diǎn)Vh放在最前面
S = S(:,sIdx);

if plot2.Flag == 1
    figure,subplot(1,2,1),axis equal, hold on;
    contourf(plot2.x,plot2.y,plot2.z,30,'linestyle','-')
    colormap('jet');
    plot([S(1,1),S(1,2),S(1,3),S(1,1)],[S(2,1),S(2,2),S(2,3),S(2,1)],'-o');
    tempf =f_min;
end

while(iterNum)
    Vh = S(:,1);f_Vh = f_S(1); %step2 計算劣點(diǎn)和形心點(diǎn)
    Vl = S(:,end);f_Vl = f_S(end);
    Vx = mean(S(:,2:end),2);
    
    Vr = Vx+afa.*(Vx-Vh);f_Vr = func(Vr);%step 3 計算反射點(diǎn)
    
    if f_Vr<f_Vl %step4 延伸步
        Ve = Vx+beta.*(Vx-Vh);f_Ve = func(Ve);
        if f_Ve<f_Vl
            S(:,1) = [];S = [S,Ve];
            f_S(1) = [];f_S = [f_S,f_Ve];
        else
            S(:,1) = [];S = [S,Vr];
            f_S(1) = [];f_S = [f_S,f_Vr];
        end
    elseif f_Vr<f_S(2)%step5收縮步
        idx=find(f_S<f_Vr);
        f_S(1:idx(1)-2)=f_S(2:idx(1)-1);
        S(:,1:idx(1)-2) = S(:,2:idx(1)-1);
        f_S(idx(1)-1) = f_Vr;
        S(:,idx(1)-1) = Vr;
    elseif f_Vr<=f_Vh
        Vc = Vx+gama.*(Vr-Vx);f_Vc = func(Vc);
        if f_Vc<f_Vr %or f_Vh
            idx=find(f_S<f_Vc);
            if isempty(idx)
                S(:,1) = [];S = [S,Vc];
                f_S(1) = [];f_S = [f_S,f_Vc];
            else
                f_S(1:idx(1)-2)=f_S(2:idx(1)-1);
                S(:,1:idx(1)-2) = S(:,2:idx(1)-1);
                f_S(idx(1)-1) = f_Vc;
                S(:,idx(1)-1) = Vc;
            end
        else
            [S,f_S] = halfSimplex(S,func);
        end
    else
        Vc = Vx+gama.*(Vh-Vx);f_Vc = func(Vc);
        if f_Vc<f_Vh
            idx=find(f_S<f_Vc);
            if isempty(idx)
                S(:,1) = [];S = [S,Vc];
                f_S(1) = [];f_S = [f_S,f_Vc];
            else
                f_S(1:idx(1)-2)=f_S(2:idx(1)-1);
                S(:,1:idx(1)-2) = S(:,2:idx(1)-1);
                f_S(idx(1)-1) = f_Vc;
                S(:,idx(1)-1) = Vc;
            end
        else
            [S,f_S] = halfSimplex(S,func);
        end
    end
    
    if plot2.Flag == 1
        tempf = [tempf,f_S(end)];
        subplot(1,2,1),plot([S(1,1),S(1,2),S(1,3),S(1,1)],[S(2,1),S(2,2),S(2,3),S(2,1)],'-o');
        subplot(1,2,2),plot(tempf,'-b.','LineWidth',2); grid on;
        axis([0,60,0,func(x0)]);
        xlabel('Step');
        ylabel('Objective Function Value');
        pause();
    end
    
    if sqrt(sum((S(:,1)-S(:,end)).^2))<=tol
        break;
    end
    iterNum = iterNum-1;
    
end

x_min = mean(S,2);
f_min = func(x_min);
end

function  [S,f_S] = halfSimplex(S,func)
S(:,1:end-1) = (S(:,1:end-1)+S(end))./2;
f_S = zeros(1,size(S,2));
for i=1:1:size(S,2)
    f_S(i) = func(S(:,i));
end
end

Downhill Simplex 方法就像變形蟲在一個山谷里面柬姚,為了達(dá)到谷底拟杉,變形蟲通過幾個頂點(diǎn)的試探,不斷的改變自己的形狀量承,或伸縮搬设,或收縮。所以這種方法又叫Amoeba方法撕捍。其收斂速度較慢拿穴,但對于目標(biāo)函數(shù)的要求并不苛刻,在不確定具體表達(dá)式的情況下可以采用此方法忧风。

模式搜索

直接方法默色,最后再簡單介紹一種簡單的搜索方法,叫模式搜索狮腿。模式搜索和 powell 方法非常相似,也稱作步長加速法,hooke-jeeves 法,比 powell 方法更早提出(1961 年),其是對坐標(biāo)輪換法的改進(jìn)腿宰。基本思想是從初始基點(diǎn)開始,交替實施兩 種搜索:軸向搜索和模式搜索蚤霞。軸向搜索依次沿 n 個坐標(biāo)軸的方向進(jìn)行,用來確定新的基點(diǎn) 和有利于函數(shù)值下降的方向酗失。模式搜索則沿著相鄰兩個基點(diǎn)的連線方向進(jìn)行,試圖使函數(shù)值 下降更快。收斂速度是線性的,原始的一維搜索采用的是后退法,也可以采用其他一維搜索 方法來加速迭代昧绣。

圖2 模式搜索示意圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末规肴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子夜畴,更是在濱河造成了極大的恐慌拖刃,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贪绘,死亡現(xiàn)場離奇詭異兑牡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)税灌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門均函,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人菱涤,你說我怎么就攤上這事苞也。” “怎么了粘秆?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵如迟,是天一觀的道長。 經(jīng)常有香客問我,道長殷勘,這世上最難降的妖魔是什么此再? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮玲销,結(jié)果婚禮上输拇,老公的妹妹穿的比我還像新娘。我一直安慰自己贤斜,他們只是感情好淳附,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蠢古,像睡著了一般。 火紅的嫁衣襯著肌膚如雪别凹。 梳的紋絲不亂的頭發(fā)上草讶,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音炉菲,去河邊找鬼堕战。 笑死,一個胖子當(dāng)著我的面吹牛拍霜,可吹牛的內(nèi)容都是我干的嘱丢。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼祠饺,長吁一口氣:“原來是場噩夢啊……” “哼越驻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起道偷,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤缀旁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后勺鸦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體并巍,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年换途,在試婚紗的時候發(fā)現(xiàn)自己被綠了懊渡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡军拟,死狀恐怖剃执,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吻谋,我是刑警寧澤忠蝗,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站漓拾,受9級特大地震影響阁最,放射性物質(zhì)發(fā)生泄漏戒祠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一速种、第九天 我趴在偏房一處隱蔽的房頂上張望姜盈。 院中可真熱鬧,春花似錦配阵、人聲如沸馏颂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽救拉。三九已至,卻和暖如春瘫拣,著一層夾襖步出監(jiān)牢的瞬間亿絮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工麸拄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留派昧,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓拢切,卻偏偏與公主長得像蒂萎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子淮椰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,090評論 1 32
  • 1.python字符串格式化中五慈,%s和.format的主要區(qū)別是什么 python用一個tuple將多個值傳遞給模...
    hsiaojun閱讀 885評論 0 22
  • ?一般來說凸優(yōu)化(Convex Optimization, CO)中最一般的是錐規(guī)劃 (Cone Programm...
    史春奇閱讀 5,057評論 1 6
  • 這個月有半個月的日任務(wù)沒有能夠完成,原因一是給自己定了太多任務(wù)主穗,無形中事情越來越多豺撑,就越來越不想做,事情積壓黔牵,形成...
    camply078閱讀 171評論 0 0
  • 我們認(rèn)為自己好聪轿,自己就會更好;認(rèn)為自己壞猾浦,自己就會更壞陆错。所有我們生命中的痛苦和愉快,都完全是自己造成的金赦。我們所思...
    蜜蜂81閱讀 173評論 0 0