Python 检查cvxpy中的约束是否符合实际值

Python 检查cvxpy中的约束是否符合实际值,python,optimization,convex-optimization,cvxpy,Python,Optimization,Convex Optimization,Cvxpy,在cvxpy中解决优化问题时,是否有一种很好的方法通过替换优化变量的实际值来检查约束是否有效 我有一个复杂的优化问题(100+约束),但我知道最佳解决方案应该是什么。但是,cvxpy失败,出现错误消息ValueError:Rank(A)=1.0 x+y我找到了一个好方法,使用约束的left属性,它确实有一个值属性: x.value = 3. y.value = 1. for c in [c1, c2, c3]: constraint_text = '%s %s %s' % (c.left

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

我有一个复杂的优化问题(100+约束),但我知道最佳解决方案应该是什么。但是,cvxpy失败,出现错误消息
ValueError:Rank(A)
我认为这是因为我在其中一个约束中有一个输入错误,使得它们不一致。是否有一种很好的方法来替换变量的实际值,以查看哪些约束被违反(因为它们可能有拼写错误)

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

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()
约束
c3
中的
-4
应该是
+4
。 此操作失败,并显示错误消息:
找到原始不可行性证书。
如果我输入
p.show()
我会得到:

maximize 2.0*x + y
subject to
x >= 1.0
y >= 1.0
x + y <= -4.0
最大化2.0*x+y
从属于
x>=1.0
y>=1.0

x+y我找到了一个好方法,使用约束的
left
属性,它确实有一个
属性:

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
x>=1.0变为3.0>=1.0,这是真的
y>=1.0变为1.0>=1.0,这是真的

现在,只要设置了相关的变量值,就可以执行constraint.value()。