我尝试使用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
文档而不是here。
如果问题不够明确,请考虑要求澄清。
答案 0 :(得分:3)
从您的描述中,您正在优化的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
传递约束以最小化dict(或者如果你有多个约束要应用,则为一系列dicts):
con = {'type': 'ineq',
'fun': lambda x, a: a.dot(x) - 10,
'jac': lambda x, a: a,
'args': (a,)}
为了提高效率,我还定义了一个返回雅可比行列式的函数(约束函数的偏导数序列与x
中的每个参数),虽然这不是必需的 - 如果未指定则会估计通过一阶有限差分。
您对minimize
的调用将类似于:
res = minimize(f, x0, args=(a,), method='SLSQP', constraints=con)
您可以在官方文档here中找到使用SLSQP进行约束优化的另一个完整示例。