关于一般循环问题:
我同意@Helen;尽管设想下限的实际使用可能不那么直观,但它是一个必须满足的约束。我不相信你能忽视这个约束,即使那个流量为零。
flow = 0 的情况适用于更直观的最大流量问题(正如@KillianDS 所指出的)。在这种情况下,如果一对节点之间的流量为零,则它们不会影响“流量和守恒”:
当没有给出下限时(假设流量为非负数),零流量不会影响结果,因为
- 它不能违反约束
- 它不能影响总和(因为它添加了一个零项)。
由于某些外部约束,可能存在最小流量的实际示例(相关问题需要至少 X 水通过某个管道,正如@Helen 所指出的那样)。下限约束也可能来自等效对偶问题,该问题使流最小化以使某些边缘具有下限(并找到与具有上限的最大化问题等效的最佳等价物)。
对于您的具体问题:
似乎您正试图在一组固定的时隙中完成尽可能多的事件(在一个时隙中没有两个事件可以重叠)。
考虑可以分配给给定事件的时隙集:
E1 -- { 9:10 }
E2 -- { 9:00 }
E3 -- { 9:20, 9:30, 9:40, 9:50 }
E3 -- { 9:00, 9:10, 9: 20, 9:30 }
因此,您希望最大化任务分配的数量(即事件发生在“打开”的边上),结果集是成对不相交的(即没有一个分配的时隙重叠)。
我相信这是 NP-Hard 因为如果你能解决这个问题,你可以用它来解决最大集打包问题(即最大集打包减少到这个问题)。你的问题可以用整数线性规划来解决,但实际上这些问题也可以用贪心方法/分支定界很好地解决。
例如,在您的示例问题中。事件 E1 与 E3 发生“冲突”,而 E2 与 E3 发生冲突。如果 E1 被赋值(只有一个选项),那么 E3 只剩下一个可能的赋值(后面的赋值)。如果对 E3 进行此分配,则 E2 只剩下一个分配。此外,不相交的子图(不可能在资源上发生冲突的事件集)可以单独解决。
如果是我,我会从一个非常简单的贪婪解决方案开始(首先分配具有较少可能“槽”的任务),然后将其用作分支定界求解器的种子(如果贪婪解决方案找到 4 个任务分配,那么如果您的分配的递归子树不能超过 3),则绑定。您甚至可以通过创建集合之间的成对交集图并仅在进行分配时通知相邻集合来挤出一些额外的性能。您还可以在继续分支和绑定时更新您的最佳作业数量(我认为这是正常的),所以如果您很幸运,您会很快收敛。
我用同样的想法找到了最小的一组蛋白质,可以解释一组已识别的肽(蛋白质片段),并发现它对于实际问题来说绰绰有余。这是一个非常相似的问题。
如果您需要最前沿的性能:
重新表述后,整数线性规划几乎可以解决您想要的任何此问题的变体。当然,在非常糟糕的情况下,它可能会很慢(实际上,它可能对您有用,尤其是在您的图形连接不紧密的情况下)。如果不是,则常规线性规划松弛近似于 ILP 的解决方案,并且通常非常适合此类问题。
希望这可以帮助。