2013-06-06 8 views
1

При решении задач оптимизации в 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 

Есть ли значение substitue правильного решения (x == 3., y == 1.) так видно, что третье ограничение нарушается? Я пытался возиться с x.value и т.д., но не нашел способ

ответ

3

Я нашел ОК способ сделать это, используя атрибут ограничения 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 

Если кто-то знает лучше, не стесняйтесь поделиться.

 Смежные вопросы

  • Нет связанных вопросов^_^