我试图最小化一个带有两个变量x,x1的函数。A、B和C是尺寸为10x10的数据格式。当我不使用约束时,优化的工作原理是一样的,但是我也关心约束的情况。对于受约束的案子,我想
A.iloci,j*x*B.iloci,j*x1*C.iloci,j
要使i和j的所有组合等于或大于零。为此,我以下列方式定义了约束:
cons=[]
def f(a):
def g(x):
return A.iloc[i,j]*x[0]*B.iloc[i,j]*x[1]*C.iloc[i,j]
return g
for i in range (10):
for j in range(10):
cons.append({'type':'ineq', 'fun': f(t)})当我得到适当数量的约束(即len(cons) = 100)时,优化结果并不满足我所想到的约束,这意味着它导致x、x1和x2的值。
A.iloci,j*x*B.iloci,j*x1*C.iloci,j
对于许多j,i是小于零的,我已经确定result.success = True,所以突然停止的优化可以排除为一个潜在的问题。在寻找这个问题的解决方案时,我发现了一些人试图在this中迭代约束的情况,但是他们只在一个范围内迭代,而不是在两个范围上迭代,而且我无法修改他们的解决方案来处理我的情况。
发布于 2022-03-09 09:39:32
您的函数f没有任何意义,因为函数g不依赖于a。如果您真的希望f返回一个新函数,这取决于索引i和t,那么f应该是这两个索引的函数:
cons=[]
def f(t, i):
def g(x):
return A.iloc[t,i]+(x[0]*B.iloc[t,i]+x[1]*C.iloc[t,i]+x[2]*D.iloc[t,i])/33
return g
for t in range (72):
for i in range(33):
cons.append({'type':'ineq', 'fun': f(t, i)})还请注意,由于lambda表达式,您可以轻松地动态定义约束函数:
cons = []
for t in range(72):
for i in range(33):
cons.append({'type': 'ineq', 'fun': lambda x, t=t, i=i: A.iloc[t,i]+(x[0]*B.iloc[t,i]+x[1]*C.iloc[t,i]+x[2]*D.iloc[t,i])/33}) https://stackoverflow.com/questions/71406747
复制相似问题