Проверьте ограничения в 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 ответ
Я нашел хороший способ сделать это, используя 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
Если кто-нибудь знает лучший способ, не стесняйтесь поделиться.