我试图使用scipy.optimize.minimize
的负值来最大化函数f (a, b, c, d)
。d
是猜测变量的numpy.array
。
我正试图在每个d
上设置一些界限。并且对每个d
进行约束,使得(d1 * a1 + d2 * a2 + ... + d3 * a3) < some_Value
(a
是主题函数f
的另一个参数)
我的问题是如何将这个约束定义为最大化函数的参数。
我在库中找不到任何maximize
函数,所以我们在这里使用minimize
的负数和minimize
文档。
如果问题不够清楚,请考虑要求澄清。
从您的描述中并不完全清楚您正在优化的f
的哪些参数。出于本例的目的,我将使用x
指代你正在优化的参数向量,而a
指代另一个具有相同长度且保持不变的参数向量。
现在让我们假设您想要执行以下不等式约束:
10 <= x[0] * a[0] + x[1] * a[1] + ... + x[n] * a[n]
首先,您必须定义一个函数,该函数接受x
和a
,并在满足约束时返回一个非负的值。在这种情况下,我们可以使用:
lambda x, a: (x * a).sum() - 10
或等价:
lambda x, a: x.dot(a) - 10
传递约束以在字典(或字典序列,如果有多个约束要应用)中最小化:
con = {'type': 'ineq',
'fun': lambda x, a: a.dot(x) - 10,
'jac': lambda x, a: a,
'args': (a,)}
为了提高效率,我还定义了一个返回雅可比矩阵的函数(约束函数的偏导数序列w.r.t. x
中的每个参数),尽管这不是必需的-如果未指定,它将通过一阶有限差分来估计。
你对minimize
的调用看起来像这样:
res = minimize(f, x0, args=(a,), method='SLSQP', constraints=con)
您可以在官方文档中找到使用SLSQP进行约束优化的另一个完整示例。