罚函数法

2024-09-29 03:35:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图实现罚函数法最小化函数。我需要求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])

然后,我尝试使用我的惩罚方法来找到最小值:

^{pr2}$

这给了我[ 2.27402022 1.4157964 ](如果我增加迭代次数,最终值会更大)。在

我的执行错误在哪里? 谢谢。在

p.S.函数curr_func对于我的约束是特定的,当然,当它们都是“不相等”类型时。在


Tags: lambda函数fromtypefunctionscipyoptimizefun
1条回答
网友
1楼 · 发布于 2024-09-29 03:35:21

你的问题是公式中的h_i是针对等式约束的,而您要解决的问题是针对不等式约束的,它对应于公式中的g_i。因此,您的惩罚函数应该使用像min(0, h_1(x))**2这样的术语,而不是{}。要想知道为什么会这样,只要想想如果i = 1000和{}是所需的解决方案(1, 1),会发生什么。然后,惩罚将包括一个术语i * h_1(x)**2 = 1000,这是巨大的。在

请注意,我使用了min而不是max,因为您想要实施的不等式似乎是h_1(x) >= 0。这意味着只要h_1(x) >= 0,惩罚应该是零,但是一旦{}变为负值,你就开始惩罚。如果它实际上是h_1(x) <= 0,那么您可以使用max(那么当您使用scipy.optimize.minimize时,您必须将h_1与{}切换)。在

顺便说一句,由于i通常是一个索引变量,所以最好将惩罚权重命名为其他名称,比如a。在

相关问题 更多 >