public LPMinimumCostMatching(ISolver solver, IGraph graph, Func <Arc, double> cost, int minimumMatchingSize = 0, int maximumMatchingSize = int.MaxValue) { Graph = graph; Cost = cost; MinimumMatchingSize = minimumMatchingSize; MaximumMatchingSize = maximumMatchingSize; OptimalSubgraph g = new OptimalSubgraph(Graph); g.MaxDegree = x => 1.0; g.MinArcCount = MinimumMatchingSize; g.MaxArcCount = MaximumMatchingSize; OptimalSubgraph.CostFunction c = new OptimalSubgraph.CostFunction(cost: cost, objectiveWeight: 1); g.CostFunctions.Add(c); g.Run(solver); SolutionType = g.SolutionType; Debug.Assert(SolutionType != SolutionType.Unbounded); if (g.ResultGraph != null) { matching = new Matching(Graph); foreach (Arc arc in g.ResultGraph.Arcs()) { matching.Enable(arc, true); } } else { matching = null; } }
public LPMaximumMatching(ISolver solver, IGraph graph) { Graph = graph; OptimalSubgraph g = new OptimalSubgraph(Graph); g.MaxDegree = x => 1.0; g.ArcCountWeight = -1.0; g.Run(solver); SolutionType = g.SolutionType; Debug.Assert(SolutionType != SolutionType.Unbounded); if (g.ResultGraph != null) { matching = new Matching(Graph); foreach (Arc arc in g.ResultGraph.Arcs()) { matching.Enable(arc, true); } } else { matching = null; } }