我正在使用cplex.conflict解决问题,当我使用cplex.conflict.refine然后要求cplex.conflict.get时,它给出了某些约束的值5(一个不可行的例子)。有谁知道这意味着什么?
这是python中的示例:
> 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。
最佳答案
c.conflict.get()
也可能返回conflict.constraint_type
。在您的情况下,这两个约束是冲突的成员,并且cplex返回约束的类型:
>>> c.conflict.group_status[5]
None
>>> c.conflict.constraint_type[5]
SOS
即您的约束是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()
以获得更多信息。编辑:
如果在定义所有内容时指定变量的类型,则可以正常工作:
>>> 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]