外罰函式與內罰函式

2021-06-19 23:04:26 字數 2235 閱讀 4915

之前的兩篇blog討論了等式最優化的最優性條件和不等式最優化的最優性條件。

( )( )

關於無約束問題,我們通過最優性條件能夠直接求出解,那麼這種方法稱為解析法。

但是,對於有約束問題的一般情況是,我們很難通過最優性條件來得到最優解。通常情況下,使用kkt條件求解時,我們要求與約束個數同階的矩陣的逆。我們可以容易驗證某個點是否是最優解,但是很難直接求解。

由於無約束的最優化問題我們已經有了許多高效的解法,於是,對於有約束的問題,我們可以轉化為求解無約束問題,並且用迭代演算法來求解。這麼方法由稱為序列無約束極小化技術sumt(sequentialunconstrained minimization technique)

我們根據約束的特點,構造某種懲罰函式,然後加到目標函式中去,將約束問題求解轉化為一系列的無約束問題。這種「懲罰策略」,對於無約束問題求解過程中的那些企圖違反約束條件的目標點給予懲罰。如下圖:

通過上述方法,我們可以把有約束的問題化為無約束問題求解。也就是我們的外罰函式法。

例項:

我們改寫為無約束規劃:

其中,我們設

那麼,當x1,x2不在可行域上時,後一項由於乘了

也就是,最優化(2)式的前一部分,得到最優解;最優化後一部分,使得解在可行域上。

具體演算法:

我們用迭代演算法來求解,這裡直接給出迭代結束條件:

經證明,外罰函式法式收斂的,上式也隨著收斂到0.

當我們固定係數

步驟如下:

缺點:1.由於上述都是近似最優並且近似可行的,近似最優可以接受,但是近似可行在實際運用中讓人無法接受。這一點內罰函式可以解決;

2.根據收斂性,

相比於外罰函式法在不可行區域加懲罰,內罰函式法在可行域邊界築起高牆,讓目標函式無法穿過,就把目標函式擋在可行域內了。

這種懲罰策略只適用於不等式約束問題,並要求可行域的內點集非空,否則,每個可行點都是邊界點,都加上無窮大懲罰,懲罰也就失去意義了。

考慮不等式約束:

當x從可行域

的內部趨近於邊界時,則至少有乙個ci(x)趨近於零,因此,不難想到可構造如下的增廣的目標函式:

稱為內罰函式或障礙函式,引數r仍稱為罰因子。

上述的內罰函式,當x靠近邊界時,會迅速增大,迫使在可行域之內進行求解。

如下圖:

具體演算法:

同外罰函式法類似,我們考慮用迭代演算法來求解。每次變化得到乙個罰因子rk,從前一步關於罰因子rk-1的最優解出發,得到下一步關於rk的最優解;當滿足條件是,迭代結束,得到近似最優解。

經證明,內罰函式法也是收斂的,迭代結束的條件為

步驟如下:

1)        由於無約束最優化問題的解法目前已有許多很有效的演算法,如dfp,bfgs等,所以在求解複雜得多的約束優化問題是,工程技術人員一般樂於採用罰函式法——sumt外點法和內點法。

2)        內點法適用於解含不等式約束問題,並且每次迭代的點都是可行點,這是設計人員所希望的。但要求初始點為可行域的內點,需要相當的工作量,同時它不能處理等式約束;外點法適於解既含等式約束又含不等式約束的優化問題,初始點可以是可行域之外的點,卻不能保證近似最優解是可行的。

3)        罰函式法對於增廣的目標函式的hesse矩陣的條件數隨罰因子增大或減小而增大,造成在求解無約束最優化問題時的困難,如何選擇罰因子往往進退維谷。如外罰函式法,欲使得無約束問題接近於原約束問題,應該選擇盡可能大的罰因子;但為了減輕求解無約束問題的困難,又應選取較小的罰因子,否則增廣矩陣病態。這也是罰函式法的固有弱點。

解決這些問題,就要用到乘子法,關於乘子法,慢慢再整理出來。

php函式內不能訪問函式外的變數原因

執行如下 i 10 function my my xdebug顯示是 undefined variable 以前也知道有這個問題存在,即函式內部不可以訪問外部的變數,如果想訪問,如上,則在函式內部加 global i 或者寫成 globals i 使用者在php中定義的變數都可以在乙個hashtab...

php函式內不能訪問函式外的變數原因

執行如下 i 10 function my my xdebug顯示是 undefined variable 以前也知道有這個問題存在,即函式內部不可以訪問外部的變數,如果想訪問,如上,則在函式內部加 global i 或者寫成 globals i 使用者在php中定義的變數都可以在乙個hashtab...

全域性函式類內和類外實現

全域性函式類內實現 直接在類內宣告友元即可 全域性函式類外實現 需要讓編譯器提前知道全域性函式的存在 推薦使用全域性函式類內實現,編譯器可以直接識別 include include using namespace std 宣告person類 template classt1,class t2 cla...