From d05622a67758c92f2d55d366902fa53f7a0c5ed5 Mon Sep 17 00:00:00 2001 From: yi-ji Date: Fri, 16 Nov 2018 01:09:22 +0900 Subject: [PATCH] [CI SKIP] documentation for maximum weighted matching --- doc/bibliography.html | 12 +- doc/figs/maximal-weighted-match.png | Bin 0 -> 16555 bytes doc/figs/maximum-weighted-match.png | Bin 0 -> 17697 bytes doc/maximum_weighted_matching.html | 163 ++++++++++++++++++++++++++++ 4 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 doc/figs/maximal-weighted-match.png create mode 100644 doc/figs/maximum-weighted-match.png create mode 100644 doc/maximum_weighted_matching.html diff --git a/doc/bibliography.html b/doc/bibliography.html index 7b5bca55..d881285a 100644 --- a/doc/bibliography.html +++ b/doc/bibliography.html @@ -148,7 +148,7 @@ J. W. H. Liu.

22
-K. Mehlhorn and S. Näher. +K. Mehlhorn and S. Näher.
The LEDA Platform of Combinatorial and Geometric Computing.
Cambridge University Press, 1999. @@ -438,6 +438,16 @@ David Bruce Wilson
Generating random spanning trees more quickly than the cover time. ACM Symposium on the Theory of Computing, pp. 296-303, 1996. +

74 +
J. Edmonds
+Maximum Matching and a Polyhedron with 0, 1-Vertices
+Journal of Research of the National Bureau of Standards B 69, pp. 125-130, 1965. + +

75 +
Harold N. Gabow
+Data Structures for Weighted Matching and Nearest Common Ancestors with Linking
+Proceedings of the First Annual ACM-SIAM Symposium on Discrete Algorithms, pp. 434-443, 1990. +
diff --git a/doc/figs/maximal-weighted-match.png b/doc/figs/maximal-weighted-match.png new file mode 100644 index 0000000000000000000000000000000000000000..7f20770eb4701b157cc6d07d550522791cf75dde GIT binary patch literal 16555 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 literal 0 HcmV?d00001 diff --git a/doc/figs/maximum-weighted-match.png b/doc/figs/maximum-weighted-match.png new file mode 100644 index 0000000000000000000000000000000000000000..068ffaeeb7e0bd7df5051e0c3b84c92673ede866 GIT binary patch literal 17697 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 Yo+&{^VLdj$)hAS!j4Ury8oI{)AJatHQvd(} literal 0 HcmV?d00001 diff --git a/doc/maximum_weighted_matching.html b/doc/maximum_weighted_matching.html new file mode 100644 index 00000000..0ec5c2ef --- /dev/null +++ b/doc/maximum_weighted_matching.html @@ -0,0 +1,163 @@ +Boost Graph Library: Maximum Weighted Matching + +C++ Boost +
+
+
+template <typename Graph, typename MateMap>
+void maximum_weighted_matching(const Graph& g, MateMap mate);
+
+template <typename Graph, typename MateMap, typename VertexIndexMap>
+void maximum_weighted_matching(const Graph& g, MateMap mate, VertexIndexMap vm);
+
+template <typename Graph, typename MateMap>
+void brute_force_maximum_weighted_matching(const Graph& g, MateMap mate);
+
+template <typename Graph, typename MateMap, typename VertexIndexMap>
+void brute_force_maximum_weighted_matching(const Graph& g, MateMap mate, VertexIndexMap vm);
+
+

+Before you continue, it is recommended to read +about maximal cardinality matching first. +A maximum weighted matching of an edge-weighted graph is a matching +for which the sum of the weights of the edges is maximum. +Two different matchings (edges in the matching are colored blue) in the same graph are illustrated below. +The matching on the left is a maximum cardinality matching of size 8 and a maximal +weighted matching of weight sum 30, meaning that is has maximum size over all matchings in the graph +and its weight sum can't be increased by adding edges. +The matching on the right is a maximum weighted matching of size 7 and weight sum 38, meaning that it has maximum +weight sum over all matchings in the graph. + +

+ + + + + + +
+
+ +

+Both maximum_weighted_matching and +brute_force_maximum_weighted_matching find a +maximum weighted matching in any undirected graph. The matching is returned in a +MateMap, which is a +ReadWritePropertyMap +that maps vertices to vertices. In the mapping returned, each vertex is either mapped +to the vertex it's matched to, or to graph_traits<Graph>::null_vertex() if it +doesn't participate in the matching. If no VertexIndexMap is provided, both functions +assume that the VertexIndexMap is provided as an internal graph property accessible +by calling get(vertex_index, g). + +

+The maximum weighted matching problem was solved by Edmonds in [74]. +The implementation of maximum_weighted_matching followed Chapter 6, Section 10 of [20] and +was written in a consistent style with edmonds_maximum_cardinality_matching because of their algorithmic similarity. +In addition, a brute-force verifier brute_force_maximum_weighted_matching simply searches all possible matchings in any graph and selects one with the maximum weight sum. + +

Algorithm Description

+ +Primal-dual method in linear programming is introduced to solve weighted matching problems. Edmonds proved that for any graph, +the 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. +Let Hk-1 denote any graph obtained from G by contracting odd sets of three or more nodes and deleting single nodes, +where the capacity of the family of odd sets (not necessarily a cover of G) is k-1. Let Xk denote any matching containing k edges. +Each edge (i, j) has a weight wij. We have: + +maxXk min {wij|(i, j) ϵ Xk} = minHk-1 max {wij|(i, j) ϵ Hk-1}. + +This matching duality theorem gives an indication of how the matching problem should be formulated as a linear programming problem. That is, +the theorem suggests a set of linear inequalities which are satisfied by any matching, and it is anticipated that these inequalities describe a convex polyhedron +with integer vertices corresponding to feasible matchings. + +

+For maximum_weighted_matching, the management of blossoms is much more involved than in the case of max_cardinality_matching. +It is not sufficient to record only the outermost blossoms. When an outermost blossom is expanded, +it 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. +When augmentation occurs, blossoms with strictly positive dual variables must be maintained for use in the next application of the labeling procedure. + +

+The outline of the algorithm is as follow: + +

    +
  1. Start with an empty matching and initialize dual variables as a half of maximum edge weight.
  2. +
  3. (Labeling) Root an alternate tree at each exposed node, and proceed to construct alternate trees by labeling, using only edges with zero slack value. +If an augmenting path is found, go to step 2. If a blossom is formed, go to step 3. Otherwise, go to step 4.
  4. +
  5. (Augmentation) Find the augmenting path, tracing the path through shrunken blossoms. Augment the matching, +correct labels on nodes in the augmenting path, expand blossoms with zero dual variables and remove labels from all base nodes. Go to step 1.
  6. +
  7. (Blossoming) Determine the membership and base node of the new blossom and supply missing labels for all non-base nodes in the blossom. +Return to step 1.
  8. +
  9. (Revision of Dual Solution) Adjust the dual variables based on the primal-dual method. Go to step 1 or halt, accordingly.
  10. +
+ +Note that in maximum_weighted_matching, all edge weights are multiplied by 4, so that all dual variables always remain as integers if all edge weights are integers. +Unlike max_cardinality_matching, the initial matching and augmenting path finder are not parameterized, +because the algorithm maintains blossoms, dual variables and node labels across all augmentations. + +The algorithm's time complexity is reduced from O(V4) (naive implementation of [74]) +to O(V3), by the avoidance of re-scanning labels after revision of the dual solution. +Several special node variables pi, tau, gamma and arrays critical_edge, tau_idx are introduced for this purpose. +Please refer to [20] and code comments for more implementation details. + +

Where Defined

+ +

+boost/graph/maximum_weighted_matching.hpp + +

Parameters

+ +IN: const Graph& g +
+An undirected graph. The graph type must be a model of +Vertex and Edge List Graph and +Incidence Graph. +The edge property of the graph property_map<Graph, edge_weight_t> must exist and have numeric value type.
+
+ +IN: VertexIndexMap vm +
+Must be a model of ReadablePropertyMap, mapping vertices to integer indices. +
+ +OUT: MateMap mate +
+Must be a model of ReadWritePropertyMap, mapping +vertices to vertices. For any vertex v in the graph, get(mate,v) will be the vertex that v is matched to, or +graph_traits::null_vertex() if v isn't matched. +
+ +

Complexity

+ +

+Let m and n be the number of edges and vertices in the input graph, respectively. Assuming the +VertexIndexMap supplied allows constant-time lookup, the time complexity for +maximum_weighted_matching is O(n3). For brute_force_maximum_weighted_matching, the time complexity is exponential of m. +Note that the best known time complexity for maximum weighted matching in general graph +is O(nm+n2log(n)) by [75], but relies on an +efficient algorithm for solving nearest ancestor problem on trees, which is not provided in Boost C++ libraries. +

+ +

Example

+ +

The file example/weighted_matching_example.cpp +contains an example. + +
+


+ + +
Copyright © 2018 +Yi Ji (jiy@pku.edu.cn)
+
+ +

+Maximum Weighted Matching +