深入淺出最優(yōu)化(8) 拉格朗日乘子法

1 拉格朗日乘子法的數(shù)學(xué)背景

當(dāng)使用前面介紹的罰函數(shù)法求解約束問題時,為獲得足夠好的近似解含末,罰參數(shù)需取足夠大的值猜拾,這將導(dǎo)致增廣目標(biāo)函數(shù)的黑森矩陣出現(xiàn)病態(tài),從而導(dǎo)致數(shù)值計算上的困難佣盒。因此提出拉格朗日乘子法挎袜。

學(xué)高數(shù)的時候我們就學(xué)過等式約束條件下的拉格朗日乘子法。延續(xù)前一節(jié)中對約束最優(yōu)化問題的定義沼撕,則拉格朗日函數(shù)L(x,\mu)=f(x)-\displaystyle\sum_{j\in E}\mu_jh_j(x)宋雏。局部最優(yōu)解的條件是對x求梯度及對所有\mu求導(dǎo)均為0

下面來討論不等式和等式同時約束條件下的拉格朗日乘子法务豺。拉格朗日函數(shù)L(x,\mu)=f(x)-\displaystyle\sum_{i\in I}\lambda_ig_i(x)-\displaystyle\sum_{j\in E}\mu_jh_j(x)磨总。對\lambda的情況需要討論:

  1. 最優(yōu)解在D內(nèi)部時,g(x^*)>0笼沥,約束條件無效蚪燕,有\lambda^*_i=0,i\in I
  2. 最優(yōu)解在D邊界上時娶牌,g(x^*)=0,約束條件有效馆纳。此時對x求梯度設(shè)為0诗良,有\nabla f(x^*)=\displaystyle\sum_{i\in I}\lambda_i^*\nabla g_i(x^*)+\sum_{j\in E}\mu^*_j\nabla h_i(x^*),\nabla f(x^*)指向D內(nèi)部(因為邊界處是最優(yōu)解),\nabla g_i(x^*)也指向D內(nèi)部(因為邊界處為0鲁驶,D內(nèi)大于0)鉴裹,所以\lambda^*_i>0,i\in I

可見,無論最優(yōu)解在何處钥弯,都有\lambda_i^*g_i(x^*)=0,i\in I径荔,這個條件被稱為互補松弛條件

因此針對不等式和等式同時約束條件下的拉格朗日乘子法脆霎,局部最優(yōu)解的條件可以用如下的KKT條件表示:

\begin{cases}\nabla_xL(x^*,\lambda^*,\mu^*)=\nabla f(x^*)-\displaystyle\sum_{i\in I}\lambda_i^*\nabla g_i(x^*)-\sum_{j\in E}\mu_j^*\nabla h_j(x^*)=0\\h_j(x^*)=0,j\in E\\g_i(x^*)\geq0,\lambda_i^*\geq0,\lambda_i^*g_i(x^*)=0,i\in I\end{cases}

滿足KKT條件的點被稱為KKT點总处。

2 拉格朗日乘子法的構(gòu)成

2.1 等式約束問題的乘子法

將外點罰函數(shù)法的思想引入拉格朗日函數(shù)的最優(yōu)化問題。設(shè)S(x)=\displaystyle\sum_{i\in E}h_i^2(x)睛蛛,構(gòu)造輔助函數(shù)L_\mu(x,\lambda)=L(x,\lambda)+\frac{1}{2}\mu S(x)=f(x)-\displaystyle\sum_{i\in E}\lambda_ih_i(x)+\frac{1}{2}\mu\sum_{i\in E}h_i^2(x)

求駐點鹦马,令\nabla_xL_\mu(x,\lambda)=\nabla f(x)-\displaystyle\sum_{i\in E}\lambda_i\nabla h_i(x)+\mu\sum_{i\in E}h_i(x)\nabla h_i(x)=0

根據(jù)KKT條件有\nabla f(x^*)-\displaystyle\sum_{i\in E}\lambda_i^*\nabla h_i(x^*)=0

\nabla_xL_{\mu_k}(x_k,\lambda_k)=\nabla f(x_k)-\displaystyle\sum_{i\in E}\lambda_i^{(k)}\nabla h_i(x_k)+\mu_k\sum_{i\in E}h_i(x_k)\nabla h_i(x_k)=0

\nabla f(x_k)-\displaystyle\sum_{i\in E}[\lambda_i^{(k)}-\mu_kh_i(x_k)]\nabla h_i(x_k)=0

  • 為了使得\lambda收斂向\lambda^*,有\lambda_i^{(k+1)}=\lambda_i^{(k)}-\mu_k h_i(x_k),i\in E
  • 為了使得h_j(x)→0,j\in E忆肾,每一步增加罰因子\mu_{k+1}=\sigma\mu_k\sigma為放大系數(shù))

由此得到等式約束問題乘子法的步驟:

  1. 選定初始點x_0\in R^n荸频,初始乘子估計\lambda_1,初始罰因子\mu_1>0难菌,常數(shù)\sigma>1试溯,\beta\in(0,1),精度\epsilon>0郊酒,置k=1
  2. 構(gòu)造增廣目標(biāo)函數(shù)L_{\mu_k}(x,\lambda_k)=L(x,\lambda_k)+\frac{1}{2}\mu_kS(x)
  3. x_{k-1}為初始點求解無約束問題minL_{\mu_{k}}(x,\lambda_k)遇绞,其解為x_{k}
  4. S(x_k)^{\frac{1}{2}}\leq\epsilon,則得解x_k燎窘,停止迭代
  5. \frac{S(x_k)^{\frac{1}{2}}}{S(x_{k-1})^{\frac{1}{2}}}\leq\beta成立摹闽,則令\mu_{k+1}=\mu_k,否則\mu_{k+1}=\sigma\mu_k
  6. \lambda_i^{(k+1)}=\lambda_i^{(k)}-\mu_kh_i(x_k),i\in E褐健,令k=k+1付鹿,轉(zhuǎn)步2

2.2 一般約束問題的乘子法

引入松弛變量z將不等式問題化為等價的等式約束問題:g_i(x)\geq 0,i\in I\Rightarrow g_i(x)-z_i^2=0,i\in I

構(gòu)造增廣拉格朗日函數(shù):\overline{L_\mu}(x,z,\lambda)=f(x)-\displaystyle\sum_{i\in I}\lambda_i[g_i(x)-z_i^2]+\frac{\mu}{2}\sum_{i\in I}[g_i(x)-z_i^2]^2

配方后可得:\overline{L_\mu}(x,z,\lambda)=f(x)-\displaystyle\sum_{i\in I}\{\frac{\mu}{2}[z_i^2-\frac{1}{\mu}(\mu g_i(x)-\lambda_i)]^2-\frac{\lambda^2_i}{2\mu}\}

將該式對z_i求偏導(dǎo),令偏導(dǎo)為0蚜迅,有2z_i\{\lambda_i-\mu[g_i(x)-z_i^2]\}=0

因此z_i^2=\frac{1}{\mu}max\{0,\mu g_i(x)-\lambda_i\}舵匾,代入消去z得L_\mu(x,\lambda)=f(x)+\frac{1}{2\mu}\displaystyle\sum_{i\in I}(max^2\{0,\lambda_i-\mu g_i(x)\}-\lambda_i^2)

\nabla_xL(x,\lambda)=\nabla f(x)-\displaystyle\sum_{i\in I}(max\{0,\lambda_i-\mu g_i(x)\})\nabla g_i(x)

根據(jù)KKT條件有\nabla f(x^*)-\displaystyle\sum_{i\in E}\lambda_i^*\nabla g_i(x^*)=0

為了使得\lambda收斂向\lambda^*,根據(jù)KKT條件谁不,有\lambda_i^{(k+1)}=max\{\lambda_i^{(k)}-\mu g_i(x_k),0\},i\in E

可以得到一般約束條件下的增廣目標(biāo)函數(shù)和\lambda的遞推公式:

L_\mu(x,\lambda)=f(x)+\frac{1}{2\mu}\displaystyle\sum_{i\in I}(max^2\{0,\lambda_i-\mu g_i(x)\}-\lambda_i^2)-\displaystyle\sum_{j\in E}\lambda_jh_j(x)+\frac{1}{2}\mu\sum_{j\in E}h_j^2(x)

\begin{cases}\lambda_i^{(k+1)}=max\{\lambda_i^{(k)}-\mu g_i(x_k),0\},i\in I\\\lambda_j^{(k+1)}=\lambda_j^{(k)}-\mu h_j(x_k),j\in E\end{cases}

由此得到一般約束問題乘子法的步驟:

  1. 選定初始點x_0\in R^n坐梯,初始乘子估計\lambda_1,初始罰因子\mu_1>0刹帕,常數(shù)\sigma>1吵血,\beta\in(0,1)谎替,精度\epsilon>0,置k=1
  2. 構(gòu)造增廣目標(biāo)函數(shù)
  3. x_{k-1}為初始點求解無約束問題minL_{\mu_{k}}(x,\lambda_k)蹋辅,其解為x_{k}
  4. (\displaystyle\sum_{j\in E}h_j^2(x_k))^{\frac{1}{2}}+(\displaystyle\sum_{i\in I}min^2\{g_i(x_k),0\})^{\frac{1}{2}}\leq\epsilon钱贯,則得解x_k,停止迭代
  5. \frac{(\displaystyle\sum_{j\in E}h_j^2(x_k))^{\frac{1}{2}}+(\displaystyle\sum_{i\in I}min^2\{g_i(x_k),0\})^{\frac{1}{2}}}{(\displaystyle\sum_{j\in E}h_j^2(x_{k-1}))^{\frac{1}{2}}+(\displaystyle\sum_{i\in I}min^2\{g_i(x_{k-1}),0\})^{\frac{1}{2}}}\leq\beta成立侦另,則令\mu_{k+1}=\mu_k秩命,否則\mu_{k+1}=\sigma\mu_k
  6. 計算\lambda^{(k+1)},令k=k+1褒傅,轉(zhuǎn)步2

3 實戰(zhàn)測試

對于上節(jié)深入淺出最優(yōu)化(7) 罰函數(shù)法中提出的約束最優(yōu)化問題硫麻,x_1,x_2,x_3的初值均在[0,4]的范圍內(nèi)隨機生成,總共生成100組起點樊卓。統(tǒng)計迭代成功(在1000步內(nèi)得到最優(yōu)解且單次步長搜索迭代次數(shù)不超過1000次)的樣本的平均迭代步數(shù)、平均迭代時間和得到的最優(yōu)解及開銷函數(shù)最小值杠河。

迭代步數(shù) 迭代時間 最優(yōu)解 函數(shù)最小值
17 24.3729s x_1=1.1051~x_2=1.1969~x_3=1.5352 0.03257

代碼實現(xiàn)

本博客所有代碼在https://github.com/HarmoniaLeo/optimization-in-a-nutshell開源碌尔,如果幫助到你,請點個star券敌,謝謝這對我真的很重要唾戚!

你可以在上面的GitHub鏈接或本文集的第一篇文章深入淺出最優(yōu)化(1) 最優(yōu)化問題概念與基本知識中找到Function.py和lagb.py

使用共軛梯度PRP+法的拉格朗日乘子法

import numpy as np
from Function import Function   #定義法求導(dǎo)工具
from lagb import *  #線性代數(shù)工具庫
from scipy import linalg

n=3 #x的長度
mu=2
lj=np.ones(1)   #λj初值,長度等于等式限制條件個數(shù)
li=np.ones(2)   #λi初值待诅,長度等于不等式限制條件個數(shù)

def func(x):    #目標(biāo)函數(shù)叹坦,x是一個包含所有參數(shù)的列表
    return (x[0]-1)**2+(x[0]-x[1])**2+(x[1]-x[2])**2

def hj(x):  #構(gòu)造數(shù)組h,第j位是第j+1個等式限制條件計算的值卑雁,x是一個包含所有參數(shù)的列表
    return np.array([x[0]*(1+x[1]**2)+x[2]**4-4-3*np.sqrt(2)])

def gi(x):  #構(gòu)造數(shù)組g募书,第i位是第i+1個不等式限制條件計算的值,x是一個包含所有參數(shù)的列表
    return np.array([x[0]+10,-x[0]+10])

def myFunc(x):
    return  func(x)+\
        1/(2*mu)*np.sum(np.power(np.where(li-mu*gi(x)>0,li-mu*gi(x),0),2)-np.power(li,2))-\
            np.sum(lj*hj(x))+0.5*mu*np.sum(np.power(hj(x),2))

def cdt(x):
    return np.sqrt(np.sum(np.power(hj(x),2)))+np.sqrt(np.sum(np.power(np.where(gi(x)>0,0,gi(x)),2)))

sigma2=1.5  #放大因子
e2=0.001
beta=0.5
x=np.array([2.0,2.0,2.0])   #初值點
k1=0
while cdt(x)>=e2:
    e=0.001
    beta1=1
    sigma=0.4
    rho=0.55
    tar=Function(myFunc)
    k=0
    d=-tar.grad(x)
    x1=x
    while tar.norm(x)>e:
        a=1
        if not (tar.value(x+a*d)<=tar.value(x)+rho*a*dot(turn(tar.grad(x)),d) and \
            np.abs(dot(turn(tar.grad(x+a*d)),d))>=sigma*dot(turn(tar.grad(x)),d)):
            a=beta1
            while tar.value(x+a*d)>tar.value(x)+rho*a*dot(turn(tar.grad(x)),d):
                a*=rho
            while np.abs(dot(turn(tar.grad(x+a*d)),d))<sigma*dot(turn(tar.grad(x)),d):
                a1=a/rho
                da=a1-a
                while tar.value(x+(a+da)*d)>tar.value(x)+rho*(a+da)*dot(turn(tar.grad(x)),d):
                    da*=rho
                a+=da
        lx=x
        x=x+a*d
        beta=np.max((dot(turn(tar.grad(x)),tar.grad(x)-tar.grad(lx))/(tar.norm(lx)**2),0))  #PRP+
        d=-tar.grad(x)+beta*d
        k+=1
        print(k1,k)
    if cdt(x)/cdt(x1)>beta:
        mu*=sigma2
    k1+=1
print(x)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末测蹲,一起剝皮案震驚了整個濱河市膊爪,隨后出現(xiàn)的幾起案子瓤摧,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芍锦,死亡現(xiàn)場離奇詭異,居然都是意外死亡凌受,警方通過查閱死者的電腦和手機决摧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來示辈,“玉大人寥茫,你說我怎么就攤上這事⊥缍” “怎么了坠敷?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵妙同,是天一觀的道長。 經(jīng)常有香客問我膝迎,道長粥帚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任限次,我火速辦了婚禮芒涡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卖漫。我一直安慰自己费尽,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布羊始。 她就那樣靜靜地躺著旱幼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪突委。 梳的紋絲不亂的頭發(fā)上柏卤,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機與錄音匀油,去河邊找鬼缘缚。 笑死,一個胖子當(dāng)著我的面吹牛敌蚜,可吹牛的內(nèi)容都是我干的桥滨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼弛车,長吁一口氣:“原來是場噩夢啊……” “哼齐媒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起纷跛,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤里初,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后忽舟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體双妨,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年叮阅,在試婚紗的時候發(fā)現(xiàn)自己被綠了刁品。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡浩姥,死狀恐怖挑随,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情勒叠,我是刑警寧澤兜挨,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布膏孟,位于F島的核電站,受9級特大地震影響拌汇,放射性物質(zhì)發(fā)生泄漏柒桑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一噪舀、第九天 我趴在偏房一處隱蔽的房頂上張望魁淳。 院中可真熱鬧,春花似錦与倡、人聲如沸界逛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽息拜。三九已至,卻和暖如春净响,著一層夾襖步出監(jiān)牢的瞬間该溯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工别惦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人夫椭。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓掸掸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蹭秋。 傳聞我的和親對象是個殘疾皇子扰付,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355