【问题标题】:Using Scipy minimize (scipy.optimize.minimize) with a large equality constraint matrix使用具有大型等式约束矩阵的 Scipy 最小化 (scipy.optimize.minimize)
【发布时间】:2014-08-14 08:40:31
【问题描述】:

我需要最小化一个函数,比如说五个变量(x[0] 到 x[4])

要最小化的标量函数由X'*H*X 给出。目标函数看起来类似于:

def objfun(x):
    H = 0.1*np.ones([5,5])
    f = np.dot(np.transpose(x),np.dot(H,x))[0][0]
    return f

这将返回单个标量值。

问题是,我如何实现由以下给出的约束方程:

A*X - b = 0

其中 A 和 b 在每次运行中都会发生变化。一个随机的例子是:

A = 
array([[ 1,  2,  3,  4,  5],
       [ 2,  1,  3,  4,  5],
       [-1,  2,  3,  0,  0],
       [ 0, -5,  6,  3,  2],
       [-3,  5,  6,  2,  8]])

B = 
array([[ 0],
       [ 2],
       [ 3],
       [-2],
       [-7]])

A 和 B 不能硬编码到约束函数中,因为它们在每次运行中可能不同。变量没有界限,不需要指定优化方法。

编辑

我意识到,对于具有 5 个变量的优化问题,只有 5 个约束方程可以通过求解方程得到唯一的解决方案。 那么 A 可以定义为的情况如何:

A = 
array([[ 1,  2,  3,  4,  5],
       [ 2,  1,  3,  4,  5],
       [-1,  2,  3,  0,  0],
       [ 0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0]])


B = 
array([[ 0],
       [ 2],
       [ 3],
       [ 0],
       [ 0]])

所以我们有一个带有 3 个线性约束的 5 变量优化问题。

【问题讨论】:

    标签: python python-2.7 scipy mathematical-optimization


    【解决方案1】:

    您可以尝试使用scipy.optimize.fmin_cobyla 函数,我不知道数字细节,因此您应该使用您知道预期答案的值检查它,看看它是否适合您的需要,使用公差参数@ 987654323@ 和 rhobeg 看看你是否得到了预期的答案,一个示例程序可能是这样的:

    import numpy as np
    import scipy.optimize
    
    A = \
    np.array([[ 1,  2,  3,  4,  5],
              [ 2,  1,  3,  4,  5],
              [-1,  2,  3,  0,  0],
              [ 0,  0,  0,  0,  0],
              [ 0,  0,  0,  0,  0]])
    
    B = \
    np.array([[0],
              [2],
              [3],
              [0],
              [0]])
    
    def objfun(x):
        H = 0.1*np.ones([5,5])
        f = np.dot(np.transpose(x),np.dot(H,x))
        return f
    
    def constr1(x):
        """ The constraint is satisfied when return value >=0 """
        sol = A*x
        if np.allclose(sol, B):
            return 0.01
        else:
            # Return the negative distance between the expected solution
            # and the actual solution for a somehow meaningful value
            return -np.linalg.norm(B-sol)
    
    scipy.optimize.fmin_cobyla(objfun, [0.0, 0.0, 0.0, 0.0,0.0], [constr1])
    #np.linalg.solve(A, b)
    

    请注意,这个给定的示例没有解决方案,请尝试解决方案。我不完全确定约束函数是否正确定义,请尝试找到适合您的东西。您应该尝试提供一个初步猜测,即这是一个实际的解决方案,而不是 [0.0, 0.0, 0.0, 0.0,0.0],以获得更好的结果。

    查看官方文档了解更多详情:http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin_cobyla.html#scipy.optimize.fmin_cobyla

    编辑:另外,根据您正在寻找的解决方案类型,您可能会形成更好的约束函数,即使不完全准确,也可能允许与预期解决方案有一定容差距离的值, 并返回一个大于 0 的值,它们越接近公差,而不是总是 0.1,等等......

    【讨论】:

    • 实际的目标函数和约束有点不同。关于给予宽容的建议是一个很好的建议。谢谢。
    【解决方案2】:

    NLopt doc 提到了一个简洁的通用方法:
    Ax = b 的所有解决方案都具有xany + nullspace(A) z 的形式,
    其中xany 是一种解决方案,dim(z) < dim(x) .
    因此,将f( xany + nullspace(A) z ) 最小化到不受约束的z

    例如,在 3d 中,约束 x0 + x1 + x2 = 1 具有零空间矩阵

    [  1  0 ]  : [z0 z1] -> [z0, -z0 + z1, -z1]  -- sum 0
    [ -1  1 ]
    [  0 -1 ]
    

    ("在数值计算零空间时需要注意...")

    【讨论】:

      猜你喜欢
      • 2015-03-07
      • 2014-08-15
      • 2017-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      • 2018-05-23
      相关资源
      最近更新 更多