微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

设置 x0 scipy python 的特定数组子集的边界

如何解决设置 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 举报,一经查实,本站将立刻删除。