[英]Constraint with scipy
我有一个约束下的多目标优化问题(最大化),实际上我通过加权技术将其转换为单目标问题,并添加了 2 个变量 x1, x2(优化),约束0 <x1 + x2 <1
,因此它们的总和必须严格小于 1,才能产生第三个目标 function,如下面的代码中所述。
当我执行时,总和总是大于 1。
for i in range(len(f1)):
def f(x):
x1= x[0]
x2= x[1]
return -(x1*f1[i]+ x2*f2[i]+ (1-x1-x2)*f3[i])
def constraint(x):
return x[0]+x[1]-1
b= (0.2, 0.8)
bnds= (b, b)
x0=[0.5,0.4]
cons= ({'type': 'ineq','fun':constraint})
res = minimize(f,x0, method= 'SLSQP', bounds=bnds, constraints=cons)
print('Vect_ponderation : ', res.x)
Output:
Vect_ponderation : [0.8 0.8]
Vect_ponderation : [0.8 0.8]
Vect_ponderation : [0.8 0.8]
Vect_ponderation : [0.8 0.8]
文档说:
等式约束意味着约束 function 结果为零,而不等式意味着它是非负的。 请注意,COBYLA 仅支持不等式约束。
def constraint(x):
return x[0] + x[1] -1
方法:
x0 + x1 - 1 >= 0 # non-negative
<->
x0 + x1 >= 1
这在您的解决方案中受到尊重。
你可能想要:
def constraint(x):
return - x[0] - x[1] + 1
还要记住,没有严格不平等的概念。 您将需要先验引入一些epsilon常数,例如: eps = 1e-6
:
def constraint(x):
return - x[0] - x[1] + 1 - EPS
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.