2016-06-14 64 views
2

我想實現罰函數方法來最小化函數。我需要找到最低Rosenbrok's function罰函數方法

我使用這個點球功能:

Penalty Function

Penalty Function

首先,我發現使用scipy.optimize.minimize最低:

from scipy.optimize import minimize, rosen 
rz = lambda x: (1-x[0])**2 + 100*(x[1] - x[0]**2)**2; 
h_1 = lambda x: (x[0] - 2 * x[1] + 2); 
h_2 = lambda x: (-x[0] - 2 * x[1] + 6); 
h_3 = lambda x: (-x[0] + 2 * x[1] + 2); 

x0 = [2.3, 5]; 
cons = ({'type': 'ineq', 'fun': h_1}, 
     {'type': 'ineq', 'fun': h_2}, 
     {'type': 'ineq', 'fun': h_3}) 
minimize(rz, x0, constraints=cons) 

答案是xarray([ 0.99971613, 0.99942073])

然後我試圖找到使用我實現刑罰方法的最低:

x_c = [2.3, 3]; 
i = 1; 
while i < 1000: 
    curr_func = lambda x: rz(x) + i*(h_1(x)**2 + h_2(x)**2 + h_3(x)**2) 
    x_c = minimize(curr_func, x_c).x; 
    i *= 1.2; 
print(answer.x); 

這給了我​​(如果我增加迭代次數,最終值甚至更大)。

我的執行錯誤在哪裏? 謝謝。

P.S.功能curr_func是特定於我的約束,當然,當他們都是'不平等'類型。

+2

您可以添加一些中間結果,並將它們與您對算法的期望/知識進行比較? – Dilettant

+0

「懲罰方法」是一個相當普遍的術語,可以指代幾個不同的事情。在我看來,最常見的用法是引用一個強制約束的方法,它將對應於'Phi(x,a)'的第一項。我不確定第二個術語是什麼,但在我看來,你應該減少每個迭代的「i」。你能解釋一下你的「懲罰方法」是什麼意思嗎? – arghbleargh

+0

我使用的公式是上述問題的圖片。主要想法是將約束優化問題轉化爲無約束優化問題。這可以通過最小化支持函數「F(x,a)」(見上圖)的順序來完成,其中a'是遞增序列(例如,eometric進程),並且「x」是前一個點上的點步。精度隨迭代次數而增加。 –

回答

2

你的問題是,你的公式中​​是平等約束,而你要解決的問題是針對不平等的限制,這對應於g_i你的配方食品中。因此,您的罰款函數應該使用如min(0, h_1(x))**2而不是h_1(x)**2。要明白爲什麼會出現這種情況,請考慮如果i = 1000x是期望的解決方案(1, 1)會發生什麼情況。然後,罰款將包括一個術語i * h_1(x)**2 = 1000,這是巨大的。

請注意,我使用min而不是max,因爲它似乎是您要強制執行的不等式爲h_1(x) >= 0。這意味着只要h_1(x) >= 0,罰款應該是零,但只要h_1(x)變負,你就開始懲罰。如果它實際上是你想要的h_1(x) <= 0,那麼你使用max(那麼當你使用scipy.optimize.minimize時,你必須切換h_1-h_1)。

順便說一句,由於i通常是一個指數變量,所以最好命名其他的懲罰權重,比如a

+0

謝謝!它似乎有效。 –