有人可以分享如何正确设置Scipy Optimize的约束吗?
这是用于将总和设置为>=100
:
def constraint1(x):
return (x[0]+x[1]-100)
您如何将其设置为=100
或<=100
我只是在文档或其他示例中没有看到这些情况。
当我尝试执行以下操作时,出现语法错误,但在其他示例中看到了该错误。
def constraint2(x):
return (x[0]%=0)
这是完整的示例:
import numpy as np
from scipy.optimize import minimize
profit_0=50
profit_1=25
# initial guesses
n = 2
x0 = np.zeros(n)
x[0]=0
x[1]=0
def objective(x):
return -1*(x[0]*profit_0 + x[1]*profit_1)
def constraint1(x):
return (x[0]+x[1]-100)
def constraint2(x):
return (x[0]%=0)
def constraint3(x):
return (x[1]%=0)
b = (0,100)
bnds = (b, b)
con1 = {'type': 'ineq', 'fun': constraint1}
con2 = {'type': 'eq', 'fun': constraint2}
con3 = {'type': 'eq', 'fun': constraint3}
cons = ([con1,con2,con3])
solution = minimize(objective,x0,method='SLSQP',bounds=bnds,constraints=cons)#constraints=cons
x=solution.x
print (solution)
答案 0 :(得分:1)
我将更详细地解释@sascha的评论。 首先,让我们看一下不平等和平等约束之间的区别。 documentation说:
等式约束表示约束函数结果为零,而不等式表示约束函数结果为非负。
因此对于x [0] + x [1] <= 100的约束,您可以使用不等式约束并按如下所示定义约束函数:
def constraint(x):
return 100 - x[0] - x[1]
如果满足条件,则为非负数。
对于x [0] + x [1] == 100的条件,您有两种可能性:
def constraint1(x):
return 100 - x[0] - x[1]
def constraint2(x):
return x[0] + x[1] - 100
con1 = {'type': 'ineq', 'fun': constraint1}
con2 = {'type': 'ineq', 'fun': constraint2}
def constraint(x):
return x[0] + x[1] - 100
con = {'type': 'eq', 'fun': constraint}
如果您觉得更直观,也可以考虑在约束函数中使用if语句:
def constraint(x):
return 1 if x[0] + x[1] <= 100 else 0
con = {'type': 'ineq', 'fun':constraint}
关于约束2和3,请注意x[0]%=0
是x[0] = x[0]%0
的缩写。这意味着,这是一项任务。尝试返回分配会给您带来语法错误。
此外,还应注意:未定义以零为模。例如5%0
会给您一个错误。 (尽管对于numpy数组x
x[0]%0
似乎只给出警告并返回0。)
您能解释一下在这种约束下要实现的目标吗?