4

在 cvxpy 中解决优化问题时,是否有一种很好的方法可以通过用实际值替换优化变量来检查约束是否有效?

我有一个复杂的优化问题(100 多个约束),但我知道最佳解决方案应该是什么。但是,cvxpy 失败并显示错误消息ValueError: Rank(A) < p or Rank([G; A]) < n 我认为这是因为我在其中一个约束中有错字,使它们不一致。有没有一种很好的方法来替换变量的实际值,以查看违反了哪些约束(因为它们可能有拼写错误)?

我的实际问题很复杂,所以我做了一个简单的例子:

from cvxpy import *

x = variable(name='x')
y = variable(name='y')

c1 = greater_equals(x, 1.)
c2 = greater_equals(y, 1.)
c3 = less_equals(x + y, -4.) # typo: -4 should be +4

p = program(maximize(2. * x + y), [c1, c2, c3])

p.solve()

in-4约束c3应该是. +4这失败并显示错误消息:Certificate of primal infeasibility found. 如果我输入p.show()我得到:

maximize 2.0*x + y
subject to
x >= 1.0
y >= 1.0
x + y <= -4.0

是否有一个值可以替换正确的解决方案 ( x == 3., y == 1.) 以便看到违反了第三个约束?我试过搞乱x.value等,但还没有找到办法

4

1 回答 1

5

我找到了一种很好的方法,使用left约束的属性,它确实有一个value属性:

x.value = 3.
y.value = 1.
for c in [c1, c2, c3]:
    constraint_text = '%s %s %s' % (c.left.value, c.type, c.right)
    print '%s becomes %s which is %s' % (c, constraint_text, eval(constraint_text))

打印:

x >= 1.0 becomes 3.0 >= 1.0 which is True 
y >= 1.0 becomes 1.0 >= 1.0 which is True
x + y <= -4.0 becomes 4.0 <= -4.0 which is False

如果有人知道更好的方法,请随时分享。

于 2013-06-07T01:56:37.467 回答