【问题标题】:A good approximation algorithm for the maximum weight perfect match in non-bipartite graphs?非二分图中最大权重完美匹配的良好近似算法?
【发布时间】:2011-07-09 09:37:47
【问题描述】:

Drake 和 Hougardy 为最大加权匹配问题找到了一种简单的近似算法。我认为我对学术论文的理解超出了我的能力,所以我正在寻找一个在 php、c、javascript 中更可取的简单实现?

【问题讨论】:

  • Drake-Hougardy 算法是一个近似值;它提供了一个很好但可能不是最好的解决方案。你想解释一下这两种算法吗?
  • @epitaph:主题行要求“最小重量完美匹配”,但the Drake-Hougardy algorithm 只承诺最大重量近似值。您是否能够解决不完美/不完整的匹配?如果匹配的大小是预先确定的,可以将最小权重匹配的目标重新定义为最大权重匹配,但是我在他们的论文中没有看到任何关于这一点的内容(或者关于强制完美匹配,因为可以想象,最大匹配是在不完美的情况下获得的)。
  • @epitaph:你是你想要/需要什么的专家;我只是想弄清楚如何/是否可以提供帮助。 Drake-Hougardy 算法处理最大权重匹配问题的线性时间近似。您在“两者”中还包括哪些其他算法?
  • @epitaph:好的,我认为 Beta 的意思是 Drake 和 Hougardy 提出的早期和后期的论文/算法。第一个更简单,并且可以保证(在线性时间内)找到至少为最大权重匹配一半权重的匹配,而第二个更复杂,但给出的结果几乎是最大值的 2/3(仍然在线性时间内)。我会写第一个。我仍然对您主题行中的“完美”一词有疑问,但我也会在 Anwser 中解决它,以便我可以定义术语。
  • 也许我说得不对,但这是 math.stackexchange.com 的好人选吗?

标签: php javascript algorithm math graph


【解决方案1】:

问题定义及参考

给定一个简单的图(无向、无自边、无多边)匹配 是边的子集,使得它们中没有两条与同一个顶点相关。

完美匹配是所有顶点都与 匹配,如果有奇数个顶点,这是不可能的。 更一般地,我们可以要求最大匹配(最大可能的数量 匹配中的边)或最大匹配(不再匹配的匹配 可以添加边)。

如果将正实“权重”分配给边缘,我们可以概括 最大加权匹配的问题,一个最大化 边权重的总和。精确的最大加权匹配问题可以是 在 O(nm log(n)) 时间内求解,其中 n 是顶点数,m 是 边数。

请注意,最大加权匹配不一定是完美匹配。为了 示例:

*--1--*--3--*--1--*

只有一个完美匹配,其总权重为 2,最大 权重为 3 的加权匹配。

关于精确和近似解的讨论和进一步参考 这些,以及最小加权完美匹配问题,可以找到 在这些论文中:

"A Simple Approximation Algorithm for the Weighted Matching Problem" Drake, Doratha E. 和 Hougardy, Stefan (2002)

Implementation of O(nm log n) Weighted Matchings The Power of Data Structures Melhorn、Kurt 和 Schäfer、Guido (2000)

Computing Minimum-Weight Perfect Matchings Cook, William 和 Rohe, André (1997)

Approximating Maximum Weight Matching in Near-linear Time Duan, Ran 和 Pettie, Seth (2010)

Drake 和 Hougardy 的简单逼近算法

Drake-Hougardy 的第一个近似算法使用了这个思想 使用在每个顶点相遇的局部最重边的增长路径。它 与贪心算法一样,“性能比”为 1/2,但线性 边数的时间复杂度(贪心算法使用 全局最重的边缘,并且会导致更大的时间复杂度来找到它)。

主要的实现任务是识别支持的数据结构 高效地执行他们的算法的步骤。

PathGrowing算法的思路:

Given: a simple undirected graph G with weighted edges

(0) Define two sets of edges L and R, initially empty.
(1) While the set of edges of G is not empty, do:
(2)    Choose arbitrary vertex v to which an edge is incident.
(3)    While v has incident edges, do:
(4)        Choose heaviest edge {u,v} incident to v.
(5)        Add edge {u,v} to L or R in alternating fashion.
(6)        Remove vertex v (and its incident edges) from G.
(7)        Let u take the role of v.
(8)    Repeat 3.
(9) Repeat 1.

Return L or R, whichever has the greater total weight.

表示图形和输出的数据结构

由于“集合”在任何直接意义上都不是 C 的数据结构,所以我们 需要决定边和顶点的容器类型 适合这个算法。关键操作是删除顶点 和入射边,使我们能够找到是否有边 left 并比较与 a 相关的剩余边的权重 给定顶点。

边缘需要是可搜索的,但只能查看是否还剩下任何边缘。 人们首先想到的是一个简单的边链表,没有任何特殊 订购。但是这个列表也需要通过本质上来维护 随机删除。这表明双向链表(反向链接为 以及在每个节点处转发),以便可以删除一条边 通过修复链接以跳过任何“已删除”节点。边权重 也可以存储在相同的结构中。

此外,我们需要能够扫描所有(剩余)边缘事件 给定的顶点。我们可以通过为每个顶点创建一个链表来做到这一点 的(指向)入射边。我会假设顶点有 已预处理为可用作索引的序数值 指向这些链表的指针数组。

最后我们需要表示边集 L 和 R,其中之一是 作为近似最大匹配返回。我们的要求 能够将边添加到任一集合,并且能够总计 两者的边权重。动态分配的链表 节点可以达到这个目的,也许存储指向边缘节点的指针 在原来的双向链表中,权重属性仍然会 即使在边缘被链接操作“移除”后仍然存在。

这样的链表和双向链表可以按时间比例创建 到边的数量,因为双向链表条目可能是 分配给输入上的特定于顶点的链接。有了这样的设计 请注意,我们可以分析算法的每个步骤所需的工作量。

(待续)

【讨论】:

  • @epitaph:当顶点是边的两个端点之一时,事件是边与顶点的关系。 (顶点的度数是与它相关的边的计数。)在加权图中,每条边都被分配了一个数字“权重”。所以“最重的边缘”只是意味着“重量”最大的边缘。
  • @epitaph:在第 (7) 行中,我们将指定最重边的另一个端点 u 在 (3) 的下一次重复中扮演 v 的角色。由于我们已经删除了与旧 v 相关的边缘,我们将在下一个循环中寻找与 u 相关的最重边缘“剩余”事件。如果没有剩余,则循环(3)结束;我们在当前的道路上走到了死胡同。然后一个新的外循环(1)开始,从一些剩余的边缘开始(直到没有更多的边缘)。
  • @epitaph:是的,图表是这样的。但是,如果您将最左边和最右边的顶点都标记为 A,则表明您的意思是识别它们,使整个图形成为三角形。这会弄乱我所说的关于我的示例的完美匹配(沿着简单路径的四个顶点)。但最大加权匹配仍然只是“三角形”中的一条边。
猜你喜欢
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
相关资源
最近更新 更多