如何解决设置 x0 scipy python 的特定数组子集的边界
我需要在 scipy.optimize.minimize() 函数中为 x0 数组的每个子集设置不同的边界。
这是我目前尝试过的:
x0 = np.zeros(20)
# disp = x0[0:5]
# w = x0[5:10]
# qi = x0[10:15]
# qai = x0[15:20]
#bonds
bnds = (((-np.inf,np.inf) for i in x0[0:5]),((0,1) for i in x0[5:10]),np.inf) for i in x0[10:15]),((int(-1000000),int(100000000)) for i in x0[15:20]))
cons = [{'type': 'ineq','fun': lambda x: x[10:15] - lotMin * x[5:10]},{'type': 'eq','fun': lambda x: x[15:20] - x[10:15] / arrot},{'type': 'ineq','fun': lambda x: x[0:5]},'fun': lambda x: x[15:20] - D},'fun': lambda x: -(x[10:15] - M * x[5:10])},'fun': lambda x: x[10:15] - x[5:10]},'fun': lambda x: x[0:5] - disp_0 - x[10:15] + D}]
res = minimize(fun=lambda x: sum(x[0:4]*ho)+co*sum(x[5:9]),constraints=cons,x0=x0,bounds=bnds,method='SLSQP',options=dict(ftol=1e-6))
这是我得到的错误:
Traceback (most recent call last):
File "C:\Users\davide.tamagnini.con\AppData\Roaming\JetBrains\PyCharmCE2021.1\scratches\scratch_1.py",line 84,in <module>
res = minimize(fun=lambda x: sum(x[0:4]*ho)+co*sum(x[5:9]),File "C:\Python\python395\lib\site-packages\scipy\optimize\_minimize.py",line 627,in minimize
return _minimize_slsqp(fun,x0,args,jac,bounds,File "C:\Python\python395\lib\site-packages\scipy\optimize\slsqp.py",line 259,in _minimize_slsqp
new_bounds = old_bound_to_new(bounds)
File "C:\Python\python395\lib\site-packages\scipy\optimize\_constraints.py",line 323,in old_bound_to_new
lb,ub = zip(*bounds)
ValueError: too many values to unpack (expected 2)
有人遇到过同样的问题吗?
提前致谢, 大卫
解决方法
正如评论中已经提到的,bounds
必须是一个元组序列。因此,您可以执行以下操作:
# Bounds
bnds = []
for i,_ in enumerate(x0):
if i <= 4:
bnds.append((-np.inf,np.inf))
elif 5 <= i <= 9:
bnds.append((0,np.inf))
else:
bnds.append(-1000000,100000000)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。