2016-03-11 8 views
1

Я использую cplex.conflict для проблемы, и когда я использую cplex.conflict.refine, а затем запрашиваю cplex.conflict.get, он дает значение 5 для некоторых ограничений (неосуществимый пример). Кто-нибудь знает, что это значит? Ниже приведен пример в Python:Что означает значение 5 как возвращение конфликта в cplex?

> python 
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import cplex 
>>> c = cplex.Cplex() 
>>> c.variables.add(names = ["x0"]) 
>>> c.linear_constraints.add(lin_expr = [[[0], [-1.0]], [[0], [1.0]]], senses = "LL", rhs = [-10,9]) 
>>> c.conflict.refine(c.conflict.linear_constraints()) 
>>> c.conflict.get() 
[5, 5] 
>>> 

API-интерфейс относится только к возвращаемым значениям -1, 0 или 3.

ответ

1

c.conflict.get() может возвращать conflict.constraint_type, а также. В вашем случае два ограничения являются членами конфликта и CPLEX возвращает типы ограничений:

>>> c.conflict.group_status[5] 
None 
>>> c.conflict.constraint_type[5] 
SOS 

т.е. ваши ограничения являются SOS-типа, который как ни странно СОС ограничения для целочисленных переменных (двоичный). Если вы добавите избыточное ограничение, например.

>>> c.linear_constraints.add(lin_expr = [[[0], [-1.0]], [[0], [1.0]], \ 
[[0], [1.0]]], senses = "LLL", rhs = [-10,9,10]) 
>>> c.conflict.refine(c.conflict.linear_constraints()) 
[5, 5, -1] 

Значение последнего исключается как не являющийся участником конфликта. Я бы рекомендовал вам использовать c.conflict.get_groups() для получения дополнительной информации.

Edit:

Если указать типы переменных при определении все работает отлично:

>>> c.variables.add(names = ["x0"], obj=[1.0], types=[c.variables.type.continuous]) 
...etc... 
>>> c.conflict.refine(c.conflict.linear_constraints()) 
Refine conflict on 3 members... 

Iteration Max Members Min Members 
    1   2   0 
    2   2   1 
    3   2   2 

[3, 3, -1] 
+0

Спасибо, это очень полезно. Есть ли способ узнать, когда вывод c.conflict.get() является конфликтом.constraint_type? –

+0

Я не думаю, что cplex должен возвращать 'constraint_type' при вызове' c.conflict.get() ', это может быть ошибка в этом случае или просто непредсказуемое поведение. –