【问题标题】:Check constraints are ok in cvxpy with actual values检查约束在 cvxpy 中可以使用实际值
【发布时间】:2013-06-03 04:07:10
【问题描述】:

在 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()

约束c3 中的-4 应该是+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 等,但还没有找到方法

【问题讨论】:

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

标签: python optimization convex-optimization cvxpy


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    相关资源
    最近更新 更多