使用纸浆定义混合整数线性规划问题时,可以这样定义sos:
x1 = LpVariable('x1', cat = LpInteger)
x2 = LpVariable('x2', cat = LpInteger)
prob.sos1['sos'] = x1 + 2*x2
(“ sos”或特殊排序的集合是一个特殊的约束,它指定集合中只有一个变量可以为非零)。
我们看到,这允许为sos变量(在这种情况下为1,2)指定权重。大概它们定义了每个变量的优先级,即分支时哪些变量首先允许为非零。
但是权重是如何精确定义的?
底层求解器是coin-or-cbc,我找不到关于它们如何使用SOS权重的任何信息。
答案 0 :(得分:2)
权重可用于分支,尽管并非所有求解器都以这种方式使用权重。我相信CBC可以,但是您可能需要检查源代码以进行确认。
通常需要SOS2中的权重来指定顺序(SOS2具有邻居的概念)。 SOS1没有此问题。
最后,如果边界不错,则二进制变量通常比SOS1变量更好。使用二进制变量时,求解器的边界更好,并且可以产生更好的割线。我的规则是:如果可以使用具有良好的big-M值的二进制变量来表示SOS1结构,请使用二进制变量。如果找不到好的big-M值,请考虑使用SOS1。