在python中使用scipy.optimize解决最小化问题



我有一个关于在python中使用scipy.optimize解决最小化问题的问题。我有一个包含大约2000个元素的一维数组(x(作为这个问题的变量,以及一个由{constraint,dict}个元素组成的list作为优化问题的约束
问题是,我想计算for循环中大量变量的总和,以定义目标函数和约束。我在下面附上了我的代码的一个简单示例,但应该考虑到,根据我的代码复杂性,如果没有for循环,就不可能进行计算。然而,通过这样做,我将面临这样的错误:'function' object is not iterable

def objective(x):
sum = 0
for i in range(1, 1000):
sum += x[i]
return sum
def constraints(x):
constraint = []
for i in range(1, 1000):
sum = 0
for j in range(1, 100):
sum += j*x[i]
constraint.append({'type': 'ineq', 'fun': 10 - sum})
return constraint
sol = minimize(objective, x0, method='slsqp', constraints=constraints)

查看了您引用的视频,认为您可能误解了几点。我将从一个基本的例子开始让你开始。

如果我们采用以下代码:

from scipy.optimize import minimize
def objective(x):
x1=x[0]
x2=x[1]
x3=x[2]
x4=x[3]
return x1+x2+x3+x4
x0=(1,1,1,1)
solution=minimize(objective,x0)    

简单的设置。您可以看到python函数目标正在返回

数学函数在上面的例子中,您没有定义x0,也没有方程。最后,sum是一个python函数(它接受列表的总和(。相反,为了做你想做的事情,让我们现在使用for循环重写上面的内容:

from scipy.optimize import minimize
import numpy as np
def objective(x):
equation = 0
for i in range(4):
equation += x[i]
return equation
x0=np.ones(4)
solution=minimize(objective,x0)

这将为您提供与上述完全相同的输出;然而,现在您可以看到,我已经将sum更改为equation(现在您不会遇到内置python函数的问题(,并且您现在已经定义了变量(。我不打算浏览你所有的代码,但我希望这个例子足够清晰,让你继续前进。

如果你想要x的1000s值,只需给x0一个1000值的数组。

编辑:

要解决代码第二部分中的问题:

假设您使用sum固定。同样,约束是输入函数(数学(的dict。我不明白你的错误,所以我不知道这是从哪里来的。但是您可以使用上面的例子创建一个约束函数。

def constraints(x):
constraint = []
for i in range(4):
value = 0
for j in range(4):
value += 10-j*x[i]
constraint.append(value)
return constraint

x0=np.ones(4)
con={'type': 'ineq', 'fun': constraints}
sol = minimize(objective, x0, method='slsqp', constraints=con)

编辑2:你可以使用与上面完全相同的思想来创建第二个约束:

from scipy.optimize import minimize
import numpy as np
def objective(x):
equation = 0
for i in range(4):
equation += x[i]
return equation
def constraints(x):
constraint = []
for i in range(4):
value = 0
for j in range(4):
value += 10-j*x[i]
constraint.append(value)
return constraint
def constraints2(x):
constraint2 = []
for a in range(4):
value = 0
for b in range(4):
value += 5-a*x[b]
constraint2.append(value)
return constraint2
x0=np.ones(4)
con={'type': 'ineq', 'fun': constraints}
con2={'type': 'eq', 'fun': constraints2}
combined=[con,con2]
sol = minimize(objective, x0, method='slsqp', constraints=combined)

这工作没有任何问题或错误,所以,我看不出你有什么问题。

最新更新