• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html><head><!--
2     Copyright 2018 Yi Ji
3
4     Use, modification and distribution is subject to the Boost Software
5     License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6     http://www.boost.org/LICENSE_1_0.txt)
7
8      Author: Yi Ji
9  --><title>Boost Graph Library: Maximum Weighted Matching</title></head>
10<body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b">
11<img src="../../../boost.png" alt="C++ Boost" height="86" width="277">
12<br clear="">
13<h1>
14<a name="sec:maximum_weighted_matching">Maximum Weighted Matching</a>
15</h1>
16<pre>
17template &lt;typename Graph, typename MateMap&gt;
18void maximum_weighted_matching(const Graph&amp; g, MateMap mate);
19
20template &lt;typename Graph, typename MateMap, typename VertexIndexMap&gt;
21void maximum_weighted_matching(const Graph&amp; g, MateMap mate, VertexIndexMap vm);
22
23template &lt;typename Graph, typename MateMap&gt;
24void brute_force_maximum_weighted_matching(const Graph&amp; g, MateMap mate);
25
26template &lt;typename Graph, typename MateMap, typename VertexIndexMap&gt;
27void brute_force_maximum_weighted_matching(const Graph&amp; g, MateMap mate, VertexIndexMap vm);
28</pre>
29<p>
30<a name="sec:weighted_matching">Before you continue, it is recommended to read
31about <a href="./maximum_matching.html">maximal cardinality matching</a> first.
32A <i>maximum weighted matching</i> of an edge-weighted graph is a matching
33for which the sum of the weights of the edges is maximum.
34Two different matchings (edges in the matching are colored blue) in the same graph are illustrated below.
35The matching on the left is a maximum cardinality matching of size 8 and a maximal
36weighted matching of weight sum 30, meaning that is has maximum size over all matchings in the graph
37and its weight sum can't be increased by adding edges.
38The matching on the right is a maximum weighted matching of size 7 and weight sum 38, meaning that it has maximum
39weight sum over all matchings in the graph.
40
41</a></p><p></p><center>
42<table border="0">
43<tr>
44<td><a name="fig:maximal_weighted_matching"><img src="figs/maximal-weighted-match.png"></a></td>
45<td width="150"></td>
46<td><a name="fig:maximum_weighted_matching"><img src="figs/maximum-weighted-match.png"></a></td>
47</tr>
48</table>
49</center>
50
51<p>
52Both <tt>maximum_weighted_matching</tt> and
53<tt>brute_force_maximum_weighted_matching</tt> find a
54maximum weighted matching in any undirected graph. The matching is returned in a
55<tt>MateMap</tt>, which is a
56<a href="../../property_map/doc/ReadWritePropertyMap.html">ReadWritePropertyMap</a>
57that maps vertices to vertices. In the mapping returned, each vertex is either mapped
58to the vertex it's matched to, or to <tt>graph_traits&lt;Graph&gt;::null_vertex()</tt> if it
59doesn't participate in the matching. If no <tt>VertexIndexMap</tt> is provided, both functions
60assume that the <tt>VertexIndexMap</tt> is provided as an internal graph property accessible
61by calling <tt>get(vertex_index, g)</tt>.
62
63<p>
64The maximum weighted matching problem was solved by Edmonds in [<a href="bibliography.html#edmonds65:_max_weighted_match">74</a>].
65The implementation of <tt>maximum_weighted_matching</tt> followed Chapter 6, Section 10 of [<a href="bibliography.html#lawler76:_comb_opt">20</a>] and
66was written in a consistent style with <tt>edmonds_maximum_cardinality_matching</tt> because of their algorithmic similarity.
67In addition, a brute-force verifier <tt>brute_force_maximum_weighted_matching</tt> simply searches all possible matchings in any graph and selects one with the maximum weight sum.
68
69</p><h3>Algorithm Description</h3>
70
71Primal-dual method in linear programming is introduced to solve weighted matching problems. Edmonds proved that for any graph,
72the maximum number of edges in a matching is equal to the minimum capacity of an odd-set cover; this further enable us to prove a max-min duality theorem for weighted matching.
73Let <i>H<sub>k-1</sub></i> denote any graph obtained from G by contracting odd sets of three or more nodes and deleting single nodes,
74where the capacity of the family of odd sets (not necessarily a cover of G) is <i>k-1</i>. Let <i>X<sub>k</sub></i> denote any matching containing <i>k</i> edges.
75Each edge <i>(i, j)</i> has a weight <i>w<sub>ij</sub></i>. We have:
76<math>
77max<i><sub>X<sub>k</sub></sub></i> min {<i>w<sub>ij</sub>|(i, j) ϵ X<sub>k</sub></i>} = min<i><sub>H<sub>k-1</sub></sub></i> max {<i>w<sub>ij</sub>|(i, j) ϵ H<sub>k-1</sub></i>}.
78</math>
79This matching duality theorem gives an indication of how the matching problem should be formulated as a linear programming problem. That is,
80the theorem suggests a set of linear inequalities which are satisfied by any matching, and it is anticipated that these inequalities describe a convex polyhedron
81with integer vertices corresponding to feasible matchings.
82
83<p>
84For <tt>maximum_weighted_matching</tt>, the management of blossoms is much more involved than in the case of <tt>max_cardinality_matching</tt>.
85It is not sufficient to record only the outermost blossoms. When an outermost blossom is expanded,
86it is necessary to know which blossom are nested immediately with it, so that these blossoms can be restored to the status of the outermost blossoms.
87When augmentation occurs, blossoms with strictly positive dual variables must be maintained for use in the next application of the labeling procedure.
88
89<p>
90The outline of the algorithm is as follow:
91
92<ol start="0">
93<li>Start with an empty matching and initialize dual variables as a half of maximum edge weight.</li>
94<li>(Labeling) Root an alternate tree at each exposed node, and proceed to construct alternate trees by labeling, using only edges with zero slack value.
95If an augmenting path is found, go to step 2. If a blossom is formed, go to step 3. Otherwise, go to step 4. </li>
96<li>(Augmentation) Find the augmenting path, tracing the path through shrunken blossoms. Augment the matching,
97correct labels on nodes in the augmenting path, expand blossoms with zero dual variables and remove labels from all base nodes. Go to step 1.</li>
98<li>(Blossoming) Determine the membership and base node of the new blossom and supply missing labels for all non-base nodes in the blossom.
99Return to step 1.</li>
100<li>(Revision of Dual Solution) Adjust the dual variables based on the primal-dual method. Go to step 1 or halt, accordingly.</li>
101</ol>
102
103Note that in <tt>maximum_weighted_matching</tt>, all edge weights are multiplied by 4, so that all dual variables always remain as integers if all edge weights are integers.
104Unlike <tt>max_cardinality_matching</tt>, the initial matching and augmenting path finder are not parameterized,
105because the algorithm maintains blossoms, dual variables and node labels across all augmentations.
106
107The algorithm's time complexity is reduced from <i>O(V<sup>4</sup>)</i> (naive implementation of [<a href="bibliography.html#edmonds65:_max_weighted_match">74</a>])
108to <i>O(V<sup>3</sup>)</i>, by a delicate labeling procedure [<a href="bibliography.html#gabow76">75</a>] to avoid re-scanning labels after revision of the dual solution.
109Special variables <i>pi, tau, gamma</i> and two arrays <i>critical_edge, tau_idx</i> are introduced for this purpose.
110Please refer to [<a href="bibliography.html#lawler76:_comb_opt">20</a>] and code comments for more implementation details.
111
112</p><h3>Where Defined</h3>
113
114<p>
115<a href="../../../boost/graph/maximum_weighted_matching.hpp"><tt>boost/graph/maximum_weighted_matching.hpp</tt></a>
116
117</p><h3>Parameters</h3>
118
119IN: <tt>const Graph&amp; g</tt>
120<blockquote>
121An undirected graph. The graph type must be a model of
122<a href="VertexAndEdgeListGraph.html">Vertex and Edge List Graph</a> and
123<a href="IncidenceGraph.html">Incidence Graph</a>.
124The edge property of the graph <tt>property_map&lt;Graph, edge_weight_t&gt;</tt> must exist and have numeric value type.<br>
125</blockquote>
126
127IN: <tt>VertexIndexMap vm</tt>
128<blockquote>
129Must be a model of <a href="../../property_map/doc/ReadablePropertyMap.html">ReadablePropertyMap</a>, mapping vertices to integer indices.
130</blockquote>
131
132OUT: <tt>MateMap mate</tt>
133<blockquote>
134Must be a model of <a href="../../property_map/doc/ReadWritePropertyMap.html">ReadWritePropertyMap</a>, mapping
135vertices to vertices. For any vertex v in the graph, <tt>get(mate,v)</tt> will be the vertex that v is matched to, or
136<tt>graph_traits<Graph>::null_vertex()</tt> if v isn't matched.
137</blockquote>
138
139<h3>Complexity</h3>
140
141<p>
142Let <i>m</i> and <i>n</i> be the number of edges and vertices in the input graph, respectively. Assuming the
143<tt>VertexIndexMap</tt> supplied allows constant-time lookup, the time complexity for
144<tt>maximum_weighted_matching</tt> is <i>O(n<sup>3</sup>)</i>. For <tt>brute_force_maximum_weighted_matching</tt>, the time complexity is exponential of <i>m</i>.
145Note that the best known time complexity for maximum weighted matching in general graph
146is <i>O(nm+n<sup>2</sup>log(n))</i> by [<a href="bibliography.html#gabow90">76</a>], but relies on an
147efficient algorithm for solving nearest ancestor problem on trees, which is not provided in Boost C++ libraries.
148</p><p>
149
150</p><h3>Example</h3>
151
152<p> The file <a href="../example/weighted_matching_example.cpp"><tt>example/weighted_matching_example.cpp</tt></a>
153contains an example.
154
155<br>
156</p><hr>
157<table>
158<tbody><tr valign="top">
159<td nowrap="nowrap">Copyright © 2018</td><td>
160Yi Ji (<a href="mailto:jiy@pku.edu.cn">jiy@pku.edu.cn</a>)<br>
161</td></tr></tbody></table>
162
163</body></html>
164