【问题标题】:Multiple Minimum Spanning Trees in a Single Graph单个图中的多个最小生成树
【发布时间】:2020-04-02 17:28:18
【问题描述】:

我正在寻找一种我不确定如何定义的算法,但我的想法是在单个图中有多个不相交的最小生成树。

考虑这个无向图,其中所有节点都连接到图中的每个其他节点。 (懒得画,但想象 9 个顶点退出/进入每个节点)

此图的最小生成树可能如下所示:

我正在寻找一种可以输入以下参数的算法: 最大顶点公关。节点和最大树跨度。

例如,我告诉算法:没有节点可以直接连接到超过 2 个其他节点,并且图中没有任何树可能包含超过 3 个顶点(4 个节点),这样的结果是一个解决方案。

它最终将用 Python 3.0 编写,但现在我只是在寻找一些关于我如何处理它的输入。

【问题讨论】:

  • 最小生成树是给定图的边的子集。在您的示例中,该图没有边;它是断开连接的,因此不能有生成树。
  • 出现的每个节点都连接到第一个图像中的每个其他节点。我希望这是隐含的,因为我懒得绘制 100 个顶点连接。
  • 您的编辑现在清楚了,谢谢。
  • 在什么意义上你的森林是最小的?简单地从现有的生成树中删除边会给你一个满足你的约束的森林。 (事实上​​,一个简单的解决方案是n 单节点树的集合。)
  • 好的,所以对于某些参数 K 和每个顶点 n 的约束 1 <= degree(n) < K 使这变得不平凡(因为您不一定只从现有的生成树中删除边)。

标签: python graph minimum-spanning-tree


【解决方案1】:

首先,请注意这不是一个小问题。有很多算法可以找到所有最小生成树 - 但包含不相交图会使这变成更多的分区问题。

  • 这将涉及动态编程以减少路径爆炸。
  • 从分区开始。对于每个分区,收集可能的生成树。
  • 这些列表的产物是您为该分区设置的解决方案。
  • 编写一个函数来返回给定节点集的所有生成树 - 记住结果,这样您就不必在每次更改节点号时重新生成树列表。

现在是分区。您在这里进入 Grundy 数字:将目标值表示为可能整数之和的所有可能方式。这是一个有据可查的 DP 算法,很容易在 Stack Overflow 上使用“算法 Python ...”找到。为了说明,我将只使用 4 个节点:QWER。 4 个项目的可能分区,每个分区至少有 2 个节点,分别是

4
2 2

这里的一个关键问题是您的节点是否可互换——例如,是

QW  ER
QE  WR
QR  WE

...为您提供不同的解决方案?如果是这样,您现在有四个分区要处理;如果没有,你只有两个。

对于每个分区,生成所有合法的生成树。 2 节点解决方案是微不足道的; 4 节点解决方案包括配置(使用参数节点 abcd):

a-b-c-d(线性) a-b + c-a-d(星号,中间有a)

同样,如果您的节点是可互换的,那么您只有两种解决方案。

[(ab, bc, cd), (ab, ac, ad)]

最后,使用itertools.product 形成分区解决方案的所有组合。

这会让你感动吗?


根据 OP 的评论更新

节点和边不可互换。让我们考虑一个 5 节点系统 QWERT。这有 10 个不同的分区 - 每个分区必须是 3-2 拆分。

QW ERT WE QRT QE WRT WR QET QR 湿 WT QER QT WER ER QWT RT QWE ET QWR

每一个都将遵循解决方案的相同配置。为了说明,考虑第一个:QW |急诊室。 QW 只有一个扳手:边列表(一个)[(Q,W)]。 ERT 有三个:[(E,R), (R,T)], [(E,R), (E,T)], [(E,T), (R,T)]。您的生成树集合是这两个列表中的itertools.product

【讨论】:

  • 绝对是为了确保。我无法确切说明我正在处理什么,但我正在查看多达 17 个节点的情况,这会给我带来大量的分区。至于你的QW == WQ的问题。不,这些是独特的分区,因为我有一个额外的权重,除了简单的顶点权重之外,我还必须考虑它。谢谢你的建议。真的很有用!
  • 我的问题不是关于边是双向的——而是节点是否可以互换。但是,您的回答包括它们是独一无二的,这给您带来了更大的问题。
猜你喜欢
  • 2021-04-12
  • 2011-12-12
  • 1970-01-01
  • 2017-04-18
  • 2015-06-03
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
相关资源
最近更新 更多