非二分图中最大权重完美匹配的一种很好的近似算法?

时间:2011-03-05 12:45:36

标签: php javascript algorithm math graph

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

1 个答案:

答案 0 :(得分:11)

问题定义和参考

给定一个简单的图形(无向,无自边,无多边)匹配 是边的一个子集,因此没有两个边入射到同一个顶点。

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

如果将正实数“权重”分配给边,我们可以推广 要求最大加权匹配的问题,一个最大化 边缘权重之和。确切的最大加权匹配问题可以是 在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的数据结构,我们 需要确定边和顶点的容器类型 适合这种算法。关键操作是删除顶点 和事件边缘的方式允许我们找到是否有任何边 左,并比较入射到a的剩余边的权重 给定顶点。

边缘需要可搜索,但只能查看是否还有剩余边缘。 人们首先想到一个简单的边缘链表,没有任何特殊之处 排序。但是这个清单也需要基本保持 随机删除。这表明一个双向链表(反向链接为 以及在每个节点处前进),以便可以完成边缘的删除 通过修复链接来跳过任何“已删除”节点。边缘权重 也可以存储在同一个结构中。

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

最后,我们需要表示边集L和R,其中一个是 作为近似最大匹配返回。我们的要求 是能够将边添加到任一集,并能够总和 两者的边缘权重。动态分配的链接列表 节点可以用于此目的,可能存储指向边节点的指针 在原始的双向链表中,权重属性仍然存在 即使在通过链接操作“删除”边缘之后仍然存在。

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

(待续)