【问题标题】:Pulp & coin-or-cbc: What are the meaning of SOS weights?Pulp & coin-or-cbc:SOS 权重的含义是什么?
【发布时间】:2019-02-20 02:46:12
【问题描述】:

当使用纸浆定义混合整数线性规划问题时,可以这样定义 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 权重的信息。

【问题讨论】:

    标签: linear-programming pulp integer-programming mixed-integer-programming coin-or-cbc


    【解决方案1】:

    权重可用于分支,尽管并非所有求解器都以这种方式使用它们。我相信 CBC 确实如此,但您可能需要检查源代码才能确认。

    通常需要 SOS2 中的权重来指定排序(SOS2 有邻居的概念)。 SOS1 没有这个问题。

    最后,如果你有良好的界限,二进制变量通常比 SOS1 变量更好。求解器在使用二元变量时可以进行更好的边界并生成更好的切割。我的规则是:如果您可以使用良好的 big-M 值来制定具有二进制变量的 SOS1 结构,请使用二进制变量。如果找不到好的大 M 值,请考虑 SOS1。

    【讨论】:

    • 是的,看来我无法让 SOS 对我的问题产生任何积极影响,因为那里已经存在约束 sum(bin_var_i, i=0..n) = 1。这适用于 cbc-coin-or 和 gurobi。我猜你是对的,当变量不知道上限时,SOS 更像是一种后备。
    猜你喜欢
    • 2016-12-19
    • 2022-10-01
    • 2022-01-14
    • 2021-01-20
    • 2019-12-27
    • 2013-12-31
    • 2021-07-19
    • 2013-04-26
    • 2014-03-22
    相关资源
    最近更新 更多