我试图实现罚函数法最小化函数。我需要求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])
然后,我尝试使用我的惩罚方法来找到最小值:
^{pr2}$这给了我[ 2.27402022 1.4157964 ]
(如果我增加迭代次数,最终值会更大)。在
我的执行错误在哪里? 谢谢。在
p.S.函数curr_func
对于我的约束是特定的,当然,当它们都是“不相等”类型时。在
你的问题是公式中的}。要想知道为什么会这样,只要想想如果}是所需的解决方案
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
。在相关问题 更多 >
编程相关推荐