用参数依赖约束优化函数



我试图使用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]

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

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进行约束优化的另一个完整示例。

最新更新