Scipy,使用参数相关约束优化函数

Scipy, optimize a function with argument dependent constraints

我正在尝试使用 scipy.optimize.minimize 的负数来最大化函数 f (a, b, c, d)dnumpy.array 个猜测变量。

我试图对每个 d 设置一些界限。还有对每个 d 的约束,使得 (d1 * a1 + d2 * a2 + ... + d3 * a3) < some_Valuea 是主题函数 f 的另一个参数)。

我的问题是如何将此约束定义为最大化函数的参数。

我在库中找不到任何 maximize 函数,所以我们使用 minimize 的负数和 minimize 文档而不是 here.

如果问题不够清楚,请考虑要求澄清。

从您的描述中不能完全清楚您正在优化 f 的哪些参数。出于本示例的目的,我将使用 x 来引用您正在优化的参数向量,并使用 a 来引用另一个长度相同且保持不变的参数向量。

现在假设您想强制执行以下不等式约束:

10 <= x[0] * a[0] + x[1] * a[1] + ... + x[n] * a[n]

首先,您必须定义一个函数,该函数接受 xa 以及 returns 满足约束条件时为非负值。在这种情况下,我们可以使用:

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,)}

为了提高效率,我还定义了一个 returns 雅可比行列式的函数(约束函数 w.r.t 的偏导数序列。x 中的每个参数),尽管这不是必需的 - 如果未指定,将通过一阶有限差分进行估计。

您对 minimize 的调用将类似于:

res = minimize(f, x0, args=(a,), method='SLSQP', constraints=con)

您可以在官方文档中找到另一个使用 SLSQP 进行约束优化的完整示例 here