我想實現罰函數方法來最小化函數。我需要找到最低Rosenbrok's 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)
答案是x
:array([ 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
是特定於我的約束,當然,當他們都是'不平等'類型。
您可以添加一些中間結果,並將它們與您對算法的期望/知識進行比較? – Dilettant
「懲罰方法」是一個相當普遍的術語,可以指代幾個不同的事情。在我看來,最常見的用法是引用一個強制約束的方法,它將對應於'Phi(x,a)'的第一項。我不確定第二個術語是什麼,但在我看來,你應該減少每個迭代的「i」。你能解釋一下你的「懲罰方法」是什麼意思嗎? – arghbleargh
我使用的公式是上述問題的圖片。主要想法是將約束優化問題轉化爲無約束優化問題。這可以通過最小化支持函數「F(x,a)」(見上圖)的順序來完成,其中a'是遞增序列(例如,eometric進程),並且「x」是前一個點上的點步。精度隨迭代次數而增加。 –