This class provides an efficient implementation of fractional matching algorithm. The implementation uses priority queues and provides time complexity.
The maximum weighted fractional matching is a relaxation of the maximum weighted matching problem where the odd set constraints are omitted. It can be formulated with the following linear program.
where is the set of edges incident to a node in
. The result must be the union of a matching with one value edges and a set of odd length cycles with half value edges.
The algorithm calculates an optimal fractional matching and a proof of the optimality. The solution of the dual problem can be used to check the result of the algorithm. The dual linear problem is the following.
The algorithm can be executed with the run() function. After it the matching (the primal solution) and the dual solution can be obtained using the query functions.
The primal solution is multiplied by 2. If the value type is integer, then the dual solution is scaled by 4.
GR | The undirected graph type the algorithm runs on. |
WM | The type edge weight map. The default type is GR::EdgeMap<int>. |
#include <lemon/fractional_matching.h>
Public Types | |
typedef GR | Graph |
The graph type of the algorithm. | |
typedef WM | WeightMap |
The type of the edge weight map. | |
typedef WeightMap::Value | Value |
The value type of the edge weights. | |
typedef Graph::template NodeMap< typename Graph::Arc > | MatchingMap |
The type of the matching map. | |
Public Member Functions | |
MaxWeightedFractionalMatching (const Graph &graph, const WeightMap &weight, bool allow_loops=true) | |
Constructor. More... | |
Execution Control | |
The simplest way to execute the algorithm is to use the run() member function. | |
void | init () |
Initialize the algorithm. More... | |
void | start () |
Start the algorithm. More... | |
void | run () |
Run the algorithm. More... | |
Primal Solution | |
Value | matchingWeight () const |
Return the weight of the matching. More... | |
int | matchingSize () const |
Return the number of covered nodes in the matching. More... | |
int | matching (const Edge &edge) const |
Return true if the given edge is in the matching. More... | |
Arc | matching (const Node &node) const |
Return the fractional matching arc (or edge) incident to the given node. More... | |
const MatchingMap & | matchingMap () const |
Return a const reference to the matching map. More... | |
Dual Solution | |
Value | dualValue () const |
Return the value of the dual solution. More... | |
Value | nodeValue (const Node &n) const |
Return the dual value (potential) of the given node. More... | |
Static Public Attributes | |
static const int | primalScale = 2 |
Scaling factor for primal solution. More... | |
static const int | dualScale |
Scaling factor for dual solution. More... | |
|
inline |
Constructor.
|
inline |
This function initializes the algorithm.
|
inline |
This function starts the algorithm.
|
inline |
This method runs the MaxWeightedFractionalMatching
algorithm.
|
inline |
This function returns the weight of the found matching. This value is scaled by primal scale.
|
inline |
|
inline |
This function returns true
if the given edge is in the found matching. The result is scaled by primal scale.
|
inline |
This function returns one of the fractional matching arc (or edge) incident to the given node in the found matching or INVALID
if the node is not covered by the matching or if the node is on an odd length cycle then it is the successor edge on the cycle.
|
inline |
This function returns a const reference to a node map that stores the matching arc (or edge) incident to each node.
|
inline |
This function returns the value of the dual solution. It should be equal to the primal value scaled by dual scale.
|
inline |
|
static |
Scaling factor for primal solution.
|
static |
Scaling factor for dual solution. It is equal to 4 or 1 according to the value type.