algorithm - 在 DAG 中找到断开特定部分路径的最小顶点集

标签 algorithm math complexity-theory graph-theory minimum-cut

问题给出如下: 给定一个 DAG 和一个数字 0 < p ≤ 1 , 返回断开至少 p 的顶点的最小基数集- 从源(即没有传入弧)到汇(即没有传出弧)的路径的分数。 对于 p = 1 ,这个问题相当于最小割。对于 p 的其他值,但是,我不确定答案是什么。

我正在考虑的一种算法是首先计算 DAG 的最小割集,然后尝试对其进行修剪以满足条件。这本身很有趣,看看我们找到的子集是否实际上是特定 p 的最小割集。那是给定的。这个算法的问题是它很浪费,因为它计算了很多我们在最终答案中不需要的节点,实际上,它首先解决了“更大”的问题。

有解决这个问题的方法吗?有没有可能对于min-cut的一些算法,我们把这个额外的约束条件作为早停标准?

为了检查有多少条路径被移除,假设我们已经为每个顶点建立了索引(并在需要时保持更新)以便我们知道有多少条路径因它们的移除而断开连接。请不要担心正在更新的索引的复杂性。最后一件事,在大小或任何方面对生成的组件没有限制。

最佳答案

这里有一个获得近似最优解的想法。

有一个集合覆盖的变体,我想称之为部分集合覆盖,其中我们有集合和元素,并且想要最小数量的集合,其并集包含元素的 p 部分。为了解决这个问题,集合对应于节点,元素对应于最大路径。 (是的,有太多路径无法天真地做到这一点;见下文。)当且仅当节点包含在路径中时,集合才包含一个元素。

将部分集覆盖写成整数程序并不难。

minimize sum_{sets S} x_S
subject to
for all elements e, sum_{sets S containing e} x_S >= y_e
sum_{elements e} y_e >= p * number of elements
for all sets S, x_S in {0, 1}      # 1 if set S is chosen
for all elements e, y_e in [0, 1]  # 1 if element e is covered

这个程序可以用整数程序求解器求解。求解器出奇地好,尽管它们当然不能为这个 NP-hard 集覆盖泛化提供最优解。

在一个有趣的 DAG 中,当然有太多的路径无法列举。抽样来拯救!由于很容易计算 DAG 中的最大路径,因此很容易对它们进行随机均匀采样。采样多个路径并将它们用作整数程序中的元素。

权衡是路径越多,目标的估计越好,但求解整数规划的时间越差。 Hoeffding's inequality给出了一些关于正确选择样本数量的提示。对于 n 个顶点,有 2^n 种可能的解决方案。我们希望每一个的估计分数都精确到某个 epsilon 以内。 Hoeffding 说我们需要将样本数选择为 Theta(n/epsilon^2),这样几乎所有时间,所有估计都大致正确。我会计算出确切的常数,但我怀疑它是否实际相关。

关于algorithm - 在 DAG 中找到断开特定部分路径的最小顶点集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32693459/

相关文章:

algorithm - 我如何确定所有 Actor 都收到了广播消息

java - 如何将物体缓慢平移到某个位置(以便可以看到)

javascript - 如何使 MathJax 在此脚本中正确渲染?

algorithm - 能不能用二叉搜索树来模拟堆操作呢?

php - 如何在 PHP 中将 base64 转换为 base10?

algorithm - 多循环的时间复杂度

c++ - C++去除字符串中连续重复的字符

algorithm - 如何找到算法的时间复杂度?

c++ - 找到与给定数字相乘的数字的有效方法

java - 我在这个工资计算器上的数学有什么问题吗?