Algorithm 具有不同约束的网络流

Algorithm 具有不同约束的网络流,algorithm,graph-algorithm,Algorithm,Graph Algorithm,考虑一个简单的网络流模型:G=(V,E)、源节点S、汇节点T。对于每条边E[i],其容量为C[i] 然后,边缘E[i]上的流F[i]被约束为C[i]或0,即F[i]属于{0,C[i]} 如何计算从S到T的最大流量?这仍然是一个网络流量问题吗?嗯,这不再是一个定义良好的流量问题,因为Heuster给出的原因是,给定通过节点连接的两条边(没有其他连接),流量必须为零,除非两个容量相等。大多数通用流算法都会失败,因为它们无法顺序增加流 考虑到这个条件在一般图上的极端限制性,我会回到游戏树上,从水槽向后

考虑一个简单的网络流模型:
G=(V,E)
、源节点
S
、汇节点
T
。对于每条边
E[i]
,其容量为
C[i]

然后,边缘
E[i]
上的流
F[i]
被约束为
C[i]
0
,即
F[i]
属于
{0,C[i]}


如何计算从
S
T
的最大流量?这仍然是一个网络流量问题吗?

嗯,这不再是一个定义良好的流量问题,因为Heuster给出的原因是,给定通过节点连接的两条边(没有其他连接),流量必须为零,除非两个容量相等。大多数通用流算法都会失败,因为它们无法顺序增加流

考虑到这个条件在一般图上的极端限制性,我会回到游戏树上,从水槽向后工作。游戏树的大多数节点都会很快终止,因为不会有流入节点的流的组合与所需的流出完全匹配。通过合理的启发式搜索,您可能会找到合理的搜索顺序并终止树,而无需搜索每个分支


事实上,您可能可以在开始之前排除大量节点并删除大量边,因为通过某些节点的流几乎是不可能的。

修改后的流问题的决策变量是NP完全的,这可以从以下事实得到证明:对于给定的项w_1,…,w_n和一个和w,只需创建一个源S,通过容量w_i的边S->i连接到每个项目i。然后通过容量为w_i的另一个边缘i->t将每个项目i连接到接收器t。添加容量W的边t->t。如果经过修改,图中的S-t最大流量为W,则存在累积重量为W的项目子集

也就是说,在任何情况下都可能没有有效解决此问题的算法,但对于并非专门设计为困难的实例,您可以尝试问题的公式,并使用通用ILP解算器来找到解决方案


如果您的容量是由输入大小中的值多项式限定的整数,则可能存在伪多项式算法

与一般算法相同。它将是最小切割的流量。你的约束没有多大变化。顺便说一句,它属于@UmNyobe,你确定吗?让我们考虑一个节点为<代码> {s,m,t}和边>代码> {e1=(s,m),e2=(m,t)}<代码> >图>(e1)=1</c>><代码> c(e2)=2</c>。在我看来,所述约束条件下的最大流量是
0
,这绝对不是最小切割。修改后的问题看起来是一个非常深刻和彻底的解释!“突然”的NP完整性让我有点吃惊。@Codor谢谢。这其实并不令人惊讶。通过修改,最小割/最大流二元性消失了,而且,在新的场景中,增加路径的概念没有明显的意义。因此,最大流算法(增量查找增广路径)采用的贪婪局部搜索算法无法应用。从另一个角度来看,经过修改,线性规划的解不再给出整数规划的解,这与最大流情形不同。这是因为额外的约束可能会破坏LP约束矩阵的整体单模性吗?@Codor这有点让我难以理解,我对LP理论知之甚少,无法自信地回答这个问题。我们完全可以用0-1变量来描述修改后的问题,所以从我的理解来看,完全的单模块性足以快速解决问题(因为解决方案是可行多面体的一个角)。我对这个问题也完全“生疏”,但无论如何,感谢你的评论!