【发布时间】:2022-01-05 23:32:29
【问题描述】:
我正在尝试为涉及二进制变量 v 和连续变量 i 的 MIP 问题制定一个约束,例如:
如果 i = 0,v = 0,并且 如果 i > 0,v = 1
我还没有想到解决方案,我不确定是否有解决方案。非常感谢任何建议。谢谢!
【问题讨论】:
标签: constraints cplex mixed-integer-programming
我正在尝试为涉及二进制变量 v 和连续变量 i 的 MIP 问题制定一个约束,例如:
如果 i = 0,v = 0,并且 如果 i > 0,v = 1
我还没有想到解决方案,我不确定是否有解决方案。非常感谢任何建议。谢谢!
【问题讨论】:
标签: constraints cplex mixed-integer-programming
您可以依赖逻辑约束。 在 OPL 中你可以写
dvar boolean v;
dvar float+ i;
subject to
{
v==!(i==0);
}
你也可以用all CPLEX APIs做同样的事情
【讨论】:
您还可以使用“传统”Big-M 公式对此进行建模,该公式在互联网上的许多地方和许多教科书中都有记载。
通常这是在一对这样的约束中完成的:
i <= M * v
如果 v 为零,则强制 i 为零,如果 i 不为零,则 v 必须为 1,这满足了您的大部分要求,但仍然允许 i = 0 和 v = 1。在许多情况下,目标试图最小化包括 v 在内的一些表达式,这可能足以在 i=0 时鼓励 v=0。但是不要陷入对 M 使用非常大的值的愚蠢错误,因为这会对您的线性松弛和可能的整体性能产生不利影响。
如果 i 为零,您可能还需要添加进一步的约束以强制 v 为零,例如:
v <= i
如果 i 为零,则直接将 v 强制为零。
【讨论】: