Python最小化函数:将额外参数传递给约束字典

7
我不知道如何通过最小化函数将额外的参数传递给约束字典。我可以成功地将额外的参数传递给目标函数。
最小化函数的文档在这里:http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html#scipy.optimize.minimize 约束参数是一个包含“args”字段的字典,其中args是一个序列。我确定这就是我需要传入额外参数的地方,但我不知道语法。我最接近的尝试如下:
from scipy.optimize import minimize
def f_to_min (x, p):
    return (p[0]*x[0]*x[0]+p[1]*x[1]*x[1]+p[2])

f_to_min([1,2],[1,1,1]) # test function to minimize

p=[] # define additional args to be passed to objective function
f_to_min_cons=({'type': 'ineq', 'fun': lambda x, p : x[0]+p[0], 'args': (p,)}) # define constraint

p0=np.array([1,1,1])
minimize(f_to_min, [1,2], args=(p0,), method='SLSQP', constraints=f_to_min_cons)

我收到了以下错误信息。
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-19-571500063c9e> in <module>()
      1 p0=np.array([1,1,1])
----> 2 minimize(f_to_min, [1,2], args=(p0,), method='SLSQP', constraints=f_to_min_cons)

C:\Python27\lib\site-packages\scipy\optimize\_minimize.pyc in minimize(fun, x0, args,     method, jac, hess, hessp, bounds, constraints, tol, callback, options)
    356     elif meth == 'slsqp':
    357         return _minimize_slsqp(fun, x0, args, jac, bounds,
--> 358                                constraints, **options)
    359     else:
    360         raise ValueError('Unknown solver %s' % method)

C:\Python27\lib\site-packages\scipy\optimize\slsqp.pyc in _minimize_slsqp(func, x0,     args, jac, bounds, constraints, maxiter, ftol, iprint, disp, eps, **unknown_options)
    298     # meq, mieq: number of equality and inequality constraints
    299     meq = sum(map(len, [atleast_1d(c['fun'](x, *c['args'])) for c in     cons['eq']]))
--> 300     mieq = sum(map(len, [atleast_1d(c['fun'](x, *c['args'])) for c in     cons['ineq']]))
    301     # m = The total number of constraints
    302     m = meq + mieq

<ipython-input-18-163ef1a4f6fb> in <lambda>(x, p)
----> 1 f_to_min_cons=({'type': 'ineq', 'fun': lambda x, p : x[0]+p[0], 'args': (p,)})

IndexError: list index out of range

我正在访问附加参数的第一个元素,所以不应该出现范围错误。

如果从最小化函数中删除constraints=f_to_min_cons参数,则上面的代码将正常工作。


我在这台电脑上有scipy 0.9,所以没有minimize,也无法测试它。但是你的代码中有一个p = [],因此当你尝试获取p[0]时会出现index out of range。更改你的f_to_min_cons定义,使其具有'args' : (p0,),然后你就可以继续了。 - Jaime
1
除了@Jaime已经说的之外:问题代码中似乎存在语法错误:请检查'args'参数之前的闭合大括号。 - ev-br
谢谢您的评论。是的,这个确实有效。但是,如果我理解您的意思正确的话,我认为p0没有通过最小化函数传递到约束字典中。也就是说,如果我将最小化参数“args”=(p0,)更改为“args”=(p1,),那么p1将用于目标函数f_to_min,但p0将用于约束字典。 - user2121724
是的,你关于语法错误的说法是正确的。我可能是手动编辑了这里的帖子,而不是从Python代码中复制粘贴。已经更新了。 - user2121724
3
再次感谢您的评论。只是确认一下,从最小化调用中无法传递额外参数给约束函数。如果是这样的话,我不明白为什么最小化函数被设置成可以传递额外参数给成本函数,但不能传递到约束函数。 - user2121724
显示剩余2条评论
1个回答

2
答案很简单,p = [] 没有元素和长度,所以 p[0] 越界了。
下面这个例子中,我们将 p 设置为 [0],没有出现错误。当然,根据给定的信息,我们无法回答 p 应该实际保存什么内容。
import numpy as np

from scipy.optimize import minimize
def f_to_min (x, p):
    return (p[0]*x[0]*x[0]+p[1]*x[1]*x[1]+p[2])

f_to_min([1,2],[1,1,1]) # test function to minimize

p=[0] # define additional args to be passed to the constraint
f_to_min_cons=({'type': 'ineq', 'fun': lambda x, p : x[0]+p[0], 'args': (p,)},) # define constraint

p0=np.array([1,1,1]) # args to be passed to the objective function
minimize(f_to_min, [1,2], args=(p0,), method='SLSQP', constraints=f_to_min_cons)

你的回答显示了一个关键点,即传递给约束条件的参数与传递给目标函数的参数不同,因为有人可能错误地假设这两个参数列表是相同的,并且从最小化传递给约束条件和目标函数。此外,分配的变量必须在约束条件的定义时存在。 无论如何,为了完整起见,请更正代码中“p #传递给约束条件”的注释,并添加一个注释“p0 #传递给目标函数”。 - Dominik Kern

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接