使用实际值检查cvxpy中的约束是否正常

时间:2013-06-06 23:55:11

标签: python optimization convex-optimization cvxpy

当解决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()

约束-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.),以便看到第3个约束被违反?我曾尝试弄乱x.value等等,但还没找到方法

1 个答案:

答案 0 :(得分:4)

我找到了一个好方法,使用约束的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

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