public void BalanceUnBalancedFlowGraph() { g = GraphFactory.UnBalancedFlow(); IVertex source = null; IVertex sink = null; foreach (IVertex v in g.Vertices) { if (g.InDegree(v) == 0) { source = v; continue; } if (g.OutDegree(v) == 0) { sink = v; continue; } } Assert.IsNotNull(source); Assert.IsNotNull(sink); int vertexCount = g.VerticesCount; int edgeCount = g.EdgesCount; algo = new GraphBalancerAlgorithm(g,source, sink); algo.DeficientVertexAdded+=new VertexEventHandler(algo_DeficientVertexAdded); algo.SurplusVertexAdded+=new VertexEventHandler(algo_SurplusVertexAdded); algo.Balance(); VerifyBalanced(vertexCount, edgeCount); }
public void BalanceTwice() { g = GraphFactory.UnBalancedFlow(); algo = new GraphBalancerAlgorithm(g, Traversal.FirstVertex(g), Traversal.FirstVertex(g)); algo.Balance(); algo.Balance(); }
public MinimumFlowAlgorithm(BidirectionalGraph visitedGraph, EdgeDoubleDictionary capacities) { this.reverser = null; this.balancer = null; this.maxFlowF1 = null; this.maxFlowf2 = null; if (visitedGraph == null) { throw new ArgumentNullException("visitedGraph"); } if (capacities == null) { throw new ArgumentNullException("capacities"); } this.visitedGraph = visitedGraph; this.capacities = capacities; this.Initialize(); }
public void Compute(IVertex source, IVertex sink) { // step 1 constructor balancing graph this.balancer = new GraphBalancerAlgorithm( this.VisitedGraph, source, sink, this.capacities ); balancer.Balance(); this.capacities[balancer.BalancingSourceEdge] = 0; this.capacities[balancer.BalancingSinkEdge] = 0; // step 2 find max flow reverser.AddReversedEdges(); maxFlowF1.Compute(source, sink); // step 3 this.capacities[balancer.BalancingSourceEdge] = double.MaxValue; foreach (IEdge edge in balancer.SurplusEdges) { IVertex v = edge.Target; // find edges foreach (IEdge vs in this.VisitedGraph.OutEdges(v)) { if (vs.Target == balancer.BalancingSource) { this.capacities[vs] = 0; } } } // step 4: // reverser.RemoveReversedEdges(); // balancer.UnBalance(); }
public MinimumFlowAlgorithm(BidirectionalGraph visitedGraph) { this.reverser = null; this.balancer = null; this.maxFlowF1 = null; this.maxFlowf2 = null; if (visitedGraph == null) { throw new ArgumentNullException("visitedGraph"); } if (this.capacities == null) { throw new ArgumentNullException("capacities"); } this.visitedGraph = visitedGraph; this.capacities = new EdgeDoubleDictionary(); VertexEdgesEnumerator enumerator = this.visitedGraph.Edges.GetEnumerator(); while (enumerator.MoveNext()) { IEdge edge = enumerator.get_Current(); this.capacities.Add(edge, double.MaxValue); } this.Initialize(); }
public void Compute(IVertex source, IVertex sink) { this.balancer = new GraphBalancerAlgorithm(this.VisitedGraph, source, sink, this.capacities); this.balancer.Balance(); this.capacities.set_Item(this.balancer.BalancingSourceEdge, 0.0); this.capacities.set_Item(this.balancer.BalancingSinkEdge, 0.0); this.reverser.AddReversedEdges(); this.maxFlowF1.Compute(source, sink); this.capacities.set_Item(this.balancer.BalancingSourceEdge, double.MaxValue); IEdgeEnumerator enumerator = this.balancer.SurplusEdges.GetEnumerator(); while (enumerator.MoveNext()) { IVertex v = enumerator.get_Current().get_Target(); EdgeCollection.Enumerator enumerator2 = this.VisitedGraph.OutEdges(v).GetEnumerator(); while (enumerator2.MoveNext()) { IEdge edge2 = enumerator2.get_Current(); if (edge2.get_Target() == this.balancer.BalancingSource) { this.capacities.set_Item(edge2, 0.0); } } } }
public void UnBalanceBeforeBalancing() { g = GraphFactory.UnBalancedFlow(); algo = new GraphBalancerAlgorithm(g, Traversal.FirstVertex(g), Traversal.FirstVertex(g)); algo.UnBalance(); }
public void Compute(IVertex source, IVertex sink) { // step 1 constructor balancing graph this.balancer = new GraphBalancerAlgorithm( this.VisitedGraph, source, sink, this.capacities ); balancer.Balance(); this.capacities[balancer.BalancingSourceEdge] = 0; this.capacities[balancer.BalancingSinkEdge] = 0; // step 2 find max flow reverser.AddReversedEdges(); maxFlowF1.Compute(source, sink); // step 3 this.capacities[balancer.BalancingSourceEdge] = double.MaxValue; foreach (IEdge edge in balancer.SurplusEdges) { IVertex v = edge.Target; // find edges foreach (IEdge vs in this.VisitedGraph.OutEdges(v)) { if (vs.Target == balancer.BalancingSource) this.capacities[vs] = 0; } } // step 4: // reverser.RemoveReversedEdges(); // balancer.UnBalance(); }