【问题标题】:scipy.optimize.minimize with matrix constraintsscipy.optimize.minimize 与矩阵约束
【发布时间】:2014-08-15 07:57:40
【问题描述】:

我是 scipy.optimize 模块的新手。我正在使用它的最小化函数试图找到一个 x 来最小化一个多元函数,该函数接受矩阵输入但返回一个标量值。我有一个等式约束和一个不等式约束,都采用向量输入和返回向量值。特别是,这里是约束列表:

sum(x) = 1 ;

AST + np.log2(x) >= 0

其中AST 只是一个参数。我将约束函数定义如下:

对于等式约束:lambda x: sum(x) - 1

对于不等式约束:

def asset_cons(x):

      #global AST

      if np.logical_and.reduce( (AST + np.log2(x)) >= 0):
        return 0.01
      else:
        return -1   

然后我打电话

cons = ({'type':'eq', 'fun': lambda x: sum(x) - 1},

            {'type':'ineq', 'fun': asset_cons})

res = optimize.minize(test_obj, [0.2, 0.8], constraints = cons)

但我仍然收到错误,抱怨我的约束功能。是否允许为约束函数返回向量值,或者我必须返回一个标量才能使用这个最小化函数?

谁能帮我看看我指定约束的方式是否有问题?

【问题讨论】:

  • 请发布确切的错误和asset_cons的代码,可能会重现问题。

标签: python scipy constraints mathematical-optimization minimize


【解决方案1】:

原则上,这看起来一点也不错。但是,如果没有看到有关 test_obj 和实际错误的信息,就很难说。它会抛出异常(暗示编程错误)还是抱怨收敛(暗示数学挑战)?

你的基本思路是对的;您需要有一个函数接受具有 N 个元素的输入向量并返回要最小化的值。您的边界条件还应接受相同的输入向量并返回单个标量作为其输出。

在我看来,您的边界条件有问题。第一个 (sum(x) - 1) 很好,但第二个在数学上具有挑战性,因为您已将其定义为逐步函数。许多优化算法都希望有连续的函数,具有较好的非常平滑的行为。 (不知道这个函数使用的算法是否能很好地处理逐步函数,所以这只是一个猜测。

如果上述情况成立,您可以通过以下方式使事情变得更容易:

np.amin(AST + np.log2(x))

如果所有AST + log2(x[n]) >= 0,该函数将为非负数。 (它仍然不是很流畅,但如果这是一个问题,它很容易改进。)现在它也适合一个lambda

如果您在收敛方面遇到困难,您可能应该同时尝试 COBYLA 和 SLSQP,除非您已经知道其中一种更适合您的问题。

【讨论】:

    猜你喜欢
    • 2015-03-07
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 2021-11-13
    • 2014-08-14
    • 1970-01-01
    相关资源
    最近更新 更多