【问题标题】:Scipy, optimize a function with argument dependent constraintsScipy,优化具有参数相关约束的函数
【发布时间】:2015-09-26 03:33:45
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你从哪里得到maximizescipy.optimize 中没有最大化功能(通常你只会最小化 -f(a, b, c, d))。
  • 请参阅 here 以了解使用 scipy.optimize.minimize 和 SLSQP 求解器进行约束优化的示例
  • 这正是我正在做的,我忘了在问题中提到这一点。请让我更新问题。
  • @ali_m 感谢您抽出宝贵时间,但我遇到的问题是创建一个约束,该约束将采用 x0 数组(x0 是内部传递的变量集)值并检查是否将所有值相加x0 * a0 值满足某些条件。请告诉我发布一些代码是否有助于更清楚地了解我的要求。

标签: python numpy scipy mathematical-optimization


【解决方案1】:

从您的描述中并不能完全清楚您正在优化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,)}

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

您对minimize 的调用将类似于:

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

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

【讨论】:

  • 非常感谢您的帮助,这几乎正是我想问的。我最初担心的一部分是minimize 函数如何知道将哪些值传递给约束函数lambda x, a 以及默认的x,我假设。 lambda 表达式的参数a 是否取决于作为 args 传递的元组中项的顺序(a 应该是元组中的第一项,因此是目标函数f 的第一个参数?跨度>
  • f(以及 jacobian、hessian 和/或约束函数)的第一个参数应该始终是 f 正在优化的参数向量。任何保持不变的附加参数都应该按照f 需要的顺序通过args 元组传递。因此,如果f 被称为f(x, a, b, c),那么您将使用args=(a, b, c) 调用minimize,并且您的约束函数还需要按该顺序接受x, a, b, c
  • 我的问题是我的约束是在f 中评估的。所以,我必须每次迭代运行我的模型两次来为 scipy 提供约束。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 2020-01-20
  • 1970-01-01
  • 2014-07-13
  • 2016-05-27
  • 2021-07-29
相关资源
最近更新 更多