Python最小化函数:将附加参数传递给约束字典
Posted
技术标签:
【中文标题】Python最小化函数:将附加参数传递给约束字典【英文标题】:Python minimize function: passing additional arguments to constraint dictionary 【发布时间】:2013-02-15 09:31:57 【问题描述】:我不知道如何通过最小化函数将附加参数传递给约束字典。我可以成功地将其他参数传递给目标函数。
有关最小化功能的文档在这里: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 已经说过的内容:问题的代码中似乎存在语法错误:检查结束大括号之前 'args'
参数。
感谢您的 cmets。是的,这确实有效。但是,如果我理解正确,我相信 p0 没有通过最小化函数传递给约束字典。即,如果我要将最小化参数 'args'=(p0,) 更改为 'args'=(p1,),则 p1 将用于目标函数 f_to_min,但 p0 将用于约束字典。
是的,你是对的语法错误。我一定是在这里手工编辑了这篇文章,而不是从 Python 代码中复制粘贴。已更新。
再次感谢您的评论。只是为了确认。无法从最小化调用将附加参数传递给约束函数。如果是这样,我不明白为什么以这种方式设置最小化函数,即可以将附加参数传递给成本函数,但不能传递给约束函数。
【参考方案1】:
答案很简单,就是 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 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)
【讨论】:
以上是关于Python最小化函数:将附加参数传递给约束字典的主要内容,如果未能解决你的问题,请参考以下文章