Scipy,优化具有参数依赖约束的函数

Nik*_*raj 4 python numpy mathematical-optimization scipy

我正在尝试使用负数scipy.optimize.minimize最大化功能f (a, b, c, d)d是一个numpy.array猜测变量。

我试图给每一个划定界限d。以及对每个d这样的约束(d1 * a1 + d2 * a2 + ... + d3 * a3) < some_Valuea作为主题函数的另一个参数f)。

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

maximize在库中找不到任何函数,因此我们在此处使用minimizewith minimize文档的负面内容。

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

ali*_*i_m 5

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

现在,假设您要实施以下不平等约束:

10 <= x[0] * a[0] + x[1] * a[1] + ... + x[n] * a[n]
Run Code Online (Sandbox Code Playgroud)

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

lambda x, a: (x * a).sum() - 10
Run Code Online (Sandbox Code Playgroud)

或等效地:

lambda x, a: x.dot(a) - 10
Run Code Online (Sandbox Code Playgroud)

传递约束以最大程度地减少dict(如果要应用多个约束,则传递一系列dict):

con = {'type': 'ineq',
       'fun': lambda x, a: a.dot(x) - 10,
       'jac': lambda x, a: a,
       'args': (a,)}
Run Code Online (Sandbox Code Playgroud)

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

您的呼叫minimize将如下所示:

res = minimize(f, x0, args=(a,), method='SLSQP', constraints=con)
Run Code Online (Sandbox Code Playgroud)

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