MINIMUM COST FLOWS: NETWORK SIMPLEX ALGORITHM A talk by: Lior Teller 1 A short reminder (it’s been three weeks..) • G=(V,E) is a directed graph • Capacity ( )קיבולתfunction uij > 0 for every (𝑖, 𝑗) ∈ 𝐸 • Cost functin cij ≥ 0 for every 𝑣, 𝑤 ∈ 𝐸 • Balance function b(v) for every 𝑣 ∈ 𝑉 we will have a number • b(v) > 0 – supply • b(v) < 0 – demand • 𝑣∈𝑉 𝑏 𝑣 = 0 • cost, capacity and balance are integers 2 Minimum Cost Flows - Definition • Flow 𝑓 is a function on the edges. • A feasible flow is a flow that satisfies: • Capacity constraint: 𝑓 𝑣, 𝑤 ≤ 𝑢(𝑣, 𝑤) • Non negativity constraint: 𝑓 𝑣, 𝑤 ≥ 0 • Mass balance constraint: 𝑤:(𝑣,𝑤) 𝑓(𝑣, 𝑤) − 𝑣: 𝑤,𝑣 𝑓(𝑤, 𝑣) = 𝑏 𝑣 • The cost of a feasible flow f: 𝑣,𝑤 ∈𝐸 𝑐 𝑣, 𝑤 𝑓(𝑣, 𝑤) • The min cost flow problem is: find a maximum feasible flow f, with the minimum cost 3 Introduction • Cycle Canceling • Successive Shortest Paths • Primal-Dual • Out of Kilter • Polynomial Algorithms – Capacity Scaling • Today – The Simplex Method 4 Introduction - The Simplex Method A powerful method for: • solving linear programming • solving constrained optimization problems • Minimum cost flow problems define a special class of linear programs • Network flow problems have considerable special structure • When implementation does not exploit underlying network structure – not a competitive solution procedure for solving minimum cost flow problems. • Interpreting the concepts of the simplex method appropriately as network operations, we can produce an algorithm that is very efficient Our goal: developing a network-based implementation of the simplex method 5 x We won’t describe the simplex method for general linear programming problems and then show how to adapt the method for minimum cost flow problems. We will develop the network simplex method directly in the context of network flow problems as a particular type of augmenting cycle algorithm. No need for any background in linear programming Building more directly on concepts we have developed already 6 Algorithm Outline • The central concept - spanning tree solutions, obtained by fixing the flow of every arc not in a spanning tree either at zero or at the arc's flow capacity. • From this we retrieve uniquely the flow on all the arcs in the spanning tree • Minimum cost flow problem has at least one optimal spanning tree solution • We move from one solution to another to find an optimal spanning tree solution • At each step introducing one new non-tree arc into the spanning tree in place of one tree arc. This method is known as the network simplex algorithm: • Spanning trees correspond to the so-called basic feasible solutions of linear programming • The movement from one spanning tree solution to another corresponds to a so-called pivot operation of the general simplex method 7 Cycle free and spanning tree solutions For any feasible solution X: • Arc (i, j) is a free arc if 0 < xij < uij • Arc (i, j) is a restricted arc if xij = 0 or xij = uij Note that we can both increase and decrease flow on a free arc. In a restricted arc we can only increase or decrease the flow. 8 Cycle Free Solution: • A solution X is a cycle free solution if the network contains no cycle composed only of free arcs. Note: in a cycle free solution, we can augment flow on any augmenting cycle in only a single direction (some arc in any cycle will restrict us from either increasing or decreasing that arc's flow). Spanning Tree Solution • A feasible solution X and an associated spanning tree of the network is a spanning tree solution if every non tree arc is a restricted arc. Note: in a spanning tree solution, the tree arcs can be free or restricted 9 Next we establish a fundamental result of network flows: • Minimum cost flow problems always have optimal cycle free and spanning tree solutions. The network simplex algorithm will exploit this result by restricting its search for an optimal solution to only spanning tree solutions First we will see some required background for this (a small reminder) 10 Reminder: negative cycles • • • • First assume that all arcs are un capacitated The network shown in the figure contains positive flow around a cycle. We define the orientation of the cycle as the same as that of arc (4, 5). Let us augment θ units of flow along the cycle in the direction of its orientation. • Increases flow on forward arcs by θ units and decreases the flow on backward arcs by θ units. The per unit incremental cost for this flow change is the sum of the costs of forward arcs minus the sum of the costs of backward arcs: Per unit change in cost Δ = 2 + 1 + 3 - 4 - 3 = - 1. 11 • Augmenting flow in the cycle decreases the cost • We set θ as large as possible while keeping all arc flows non negative We must satisfy the inequalities: 3 - θ ≥ 0 and 4 - θ ≥ 0 We set θ = 3 Some arc in the cycle has a flow at value zero The objective function value is strictly less than the initial solution 12 We can extend this observation in several ways: • a positive per unit change in cost (Δ) means we set θ as small as possible • If Δ = 0, we are indifferent to all solutions in the interval • If we impose upper bounds on the flow the range of flow that preserves feasibility an interval 13 (Cycle Free Property). If the objective function of a minimum cost flow problem is bounded from below over the feasible region, the problem always has an optimal cycle free solution. Proof: (With respect to a given flow x): • Arc (i, j) is a free arc if 0 < xij < uij or restricted arc if xij = 0 or xij = uij • Solution x has the cycle free property - contains no cycles entirely consisting of free arcs. • If a solution x contains a cycle (i.e. it is not cycle free) calculate the cycle cost • If the cycle cost is negative we send θ flow around the cycle in the direction of traversal • If it is positive send θ flow around the cycle in the opposite direction • In either of these cases we make θ as large as possible Cycle must be eliminating • If the cycle cost is 0 we can remove the cycle by increasing the flow in either direction Applying this argument repeatedly removes all cycles from the solution. 14 (Spanning Tree Property) If the objective function of a minimum cost flow problem is bounded from below over the feasible region, the problem always has an optimal spanning tree solution. Proof: (This is an extension of the cycle free property): • Let S be the set of free arcs • If the free arcs connect all the nodes of G, then the solution is connected and acyclic (from the cycle free property) thus forming a spanning tree • Otherwise, we add to S some restricted arcs until S connects all the nodes. The set S now forms a spanning tree of G, and the feasible solution x form which S is derived is referred to as a spanning tree solution. 15 A spanning tree solution partitions the arc set A into three subsets: • T - the arcs in the spanning tree • L - the non-tree arcs whose flow is zero • U - the non-tree arcs whose flow is the arc’s flow capacities We refer to the triplet (T, L, U) as a spanning tree structure. we can associate a spanning tree structure with a spanning tree solution 16 Also possible: spanning tree structure spanning tree solution We can also obtain a unique spanning tree solution corresponding to a given spanning tree structure (T, L, U): • set xij = 0 for all arcs (i, j) ∈ L • set xij = uij for all arcs (i, j) ∈ U • Determine the flow values for arcs in T – we will see how later 17 A Spanning tree can be: • Non-degenerate: every arc in a spanning tree solution is a free arc • Degenerate ()מנוון: otherwise A spanning tree structure as feasible if its associated spanning tree solution is a feasible solution of the minimum cost flow problem. A spanning tree structure as optimal if its associated spanning tree solution is an optimal solution of the minimum cost flow problem. 18 The optimality condition 𝑟𝑒𝑚𝑖𝑛𝑑𝑒𝑟: 𝜋 𝑐i,𝑗 = 𝑐i,𝑗 − 𝜋 𝑖 + 𝜋 𝑗 19 Proof: Let X* be the solution associated with the spanning tree structure (T, L, U). • Some set of node potentials π together with the spanning tree structure (T, L, U), satisfies (11.1). • Need to show X* is an optimal solution of the min cost flow problem. • As we have already seen in class, minimizing (i,j)∈A cij xij is equivalent to minimizing (i,j)∈A cijπ xij 20 Proof (continued): • This is equavilent to minimizing: π c (i,j)∈𝐿 ij x ij − π |c (i,j)∈𝑈 ij |x ij • By the definition of solution X*: ∗ • xij ≥ 𝑥𝑖𝑗 for all (i, j) ∈ 𝐿 ∗ • xij ≤ 𝑥𝑖𝑗 for all i, j ∈ U • The expression (i,j)∈𝐿 cijπ xij − (i,j)∈𝑈 |cijπ |xij implies that the objective function value of the solution X will be greater than or equal to x*. 21 Maintaining a spanning tree structure • Algorithm moves from one feasible spanning to another (pivot operation) • Stops when the spanning tree structure satisfies the optimality condition • At each iteration, the algorithm adds one arc to the spanning tree in place of one of its current arcs. • The entering arc is a non-tree arc violating its optimality condition. • The algorithm adds this arc to the spanning tree, creating a negative cycle • It sends the maximum possible flow in this cycle • Drops an arc whose flow has reached its lower or upper bound We need a data structure to support this.. 22 Spanning tree data structure Predecessor index: Each node i has a unique path from the root. The index pred(i) stores predecessor of i on this path. the Depth index: The index depth(i) stores the number of arcs on the path from the root to i. Thread index: defines a traversal of a tree. set to be the node in the depth-first search encountered just after the node itself. Provide a convenient means for visiting all descendants of a node. 23 Computing node potentials the network simplex algorithm moves from one spanning tree to the 𝜋 next maintaining 𝑐𝑘,𝑙 =0 for every arc (i, j) in the current spanning tree. We wish to calculate note potentials for this purpose: • Adding a constant to all node potential does not alter reduced costs • Therefore, one node potential can be arbitrary – we set 𝜋(1) = 0 𝜋 • Using 𝑐𝑢,𝑣 = 𝑐𝑢,𝑣 − 𝜋 𝑢 + 𝜋 𝑣 we can calculate all other node potentials by using the thread indices (example?) 24 Computing flows Every spanning tree structure (T, L, U) defines a unique flow x • xij = 0 for all arcs (i, j) ∈ L • xij = uij for all arcs (i, j) ∈ U To ease our discussion, for the moment let us first consider the uncapacitated version of the minimum cost flow problem • • • • Deleting a tree arc (i,j) from the spanning tree decomposes the tree into two subtrees Let T1 be the subtree containing node i and let T2 be the subtree containing node j The cumulative balance of nodes in T1 must be equal to that of T2 In the spanning tree, arc (i, j) is the only arc that connects the subtree T1 to T2 must k∈T 𝑏(𝑘) units of flow 1 25 Working up from the leaves it is possible to calculate all arc flows (won’t go into details.. Need some intuition?) For the capacitated version of the problem, we add this initialization: (won’t go into details.. Need some intuition?) 26 Network Simple Algorithm • The network simplex algorithm maintains a feasible spanning tree structure at each iteration and successively transforms it into an improved spanning tree structure until it becomes optimal. 27 Obtaining an Initial Spanning Tree Structure • Solve the maximum flow problem feasible solution • Construct an initial spanning tree structure by converting this solution into a spanning tree solution 28 Optimality Testing and the Entering Arc To determine weather a spanning tree structure is optimal we check: If the spanning tree structure satisfies the conditions it is optimal we terminate Else, the algorithm selects a non-tree violating arc to enter the tree: 29 Pivot Rules For any eligible arc (i, j) we refer to IcijI as its violation. The network simplex algorithm can select any eligible arc to enter the tree and still would terminate finitely (with some provisions for dealing with degeneracy) Pivot rules for selecting entering arcs: • Dantzig's pivot rule • First eligible arc pivot rule • Candidate list pivot rule 30 Dantzig's pivot rule At each iteration - select an arc with the maximum violation to enter the tree. Motivation - the arc with the maximum violation causes the maximum decrease in the objective function per unit change in the value of flow on the selected arc maximum decrease per pivot The algorithm performs fewer iterations than other choices for the pivot rule. However, The algorithm must consider every non tree very time consuming. the algorithm is not attractive. 31 First eligible arc pivot rule • Scan the arc list sequentially and select the first eligible arc to enter the tree • In a popular version of this rule, we examine the arc list in a wraparound fashion Quickly identifies the entering arc the algorithm generally performs more iterations than it would with other pivot rules because each pivot operation produces a relatively small decrease in the objective function value 32 Candidate list pivot rule Selects the entering arc using a two-phase procedure consisting of major iterations and minor iterations: • o o o major iteration: construct a candidate list of eligible arcs. Examine arcs emanating from a node and add eligible arcs to the candidate list. We repeat this process for next nodes until the list has reached max size or we have examined all the nodes. Next major iteration begins with the node of the previous major iteration and examines nodes in wraparound • o o o minor iterations: in each iteration selects an eligible arc from the candidate list with the maximum violation Scans arcs in candidate list and selects maximum violation arc to enter the tree Removes arcs that are no longer eligible from candidate list (due to changes in the node potentials) Once the candidate list becomes empty or a reached limit on the number of minor iterations per major iteration we rebuild the candidate list by performing another major iteration 33 Candidate list pivot rule (continued) By setting the: • maximum allowable size of the candidate list • number of minor iterations per major iteration we can obtain numerous different pivot rules. Example: - Dantzig's pivot rule: number of minor iterations per major iteration = 1 - First eligible arc pivot rule: maximum allowable size of the candidate list = 1 34 Leaving Arc • Suppose (k, l) is the entering arc • Creates exactly one pivot cycle W • Orientation of the cycle: • Same as that of (k, l) if (k, I) ∈ L • opposite the orientation of (k, l) if (k, I) ∈ U • Let 𝑊 and 𝑊 denote the sets of forward arcs and backward arcs in the pivot cycle • Maximum flow change on an arc (i, j) ∈ W: • We can augment flow along W feasibly 35 • We refer to any arc (i, j) ∈ W that defines δ as a blocking arc • We then augment δ units of flow and select an arc (p, q) with δpq = δ • A pivot iteration is non-degenerate if δ > 0 and is degenerate if δ = O • A degenerate iteration occurs only if T is a degenerate spanning tree. Observe: two arcs tie while determining the value of δ the next spanning tree will be degenerate. 36 Identifying the pivot cycle • P(i) denotes the unique path from any node i to the root node • Pivot cycle consists of the arcs {(k, I)} U P(k) U P(l) - (P(k) ∩ P(l)) • Find first common ancestor if k and l in O(n) using pred and depth • (example?) 𝜋 Note: 𝑐𝑘,𝑙 is the net decrease in the cost per unit flow sent around the pivot cycle W 𝜋 =𝑐 (example? Remember that 𝑐𝑢,𝑣 𝑢,𝑣 − 𝜋 𝑢 + 𝜋 𝑣 and π(1) = 0 imply 𝜋 𝑢 is the cost from the root to u) 37 Updating the Tree • When leaving arc (p, q) is determined for a given entering arc (k, I), we updates the tree structure • If the leaving arc is the same as the entering arc, (when δ = δpq =upq), the tree does not change. • the arc (k, I) merely moves from the set L to the set U, or vice versa. • Else, the algorithm must perform more extensive changes. • The arc (p, q) becomes a non-tree arc at its lower or upper bound, depending on whether (in the updated flow) X pq = 0 or X pq = u pq • Adding arc (k, I) to the current spanning tree and deleting arc (p, q) creates a new spanning tree the node potentials also change 38 Updating node potentials • Deleting (p, q) from the previous tree partitions the set of nodes into two sub-trees • TI – containing the root node • T2 – not containing the root node. This sub-tree hangs from node p or node q • The arc (k, I) has one endpoint in TI and the other in T2 • The conditions π(1) = 0 and Cij - π(i) + π(j) = 0 imply: • • • • Node potentials in TI remain unchanged 𝜋 If l ∈ T2 the node potentials in T2 decrease by 𝑐𝑘,𝑙 (homework) 𝜋 If k ∈ T2 the node potentials in T2 increase by 𝑐𝑘,𝑙 (which is negative) Using thread and depth indices we update the node potentials quickly 39 Termination • Algorithm moves from one feasible spanning tree solution to another • Stops when the spanning tree structure satisfies the optimality condition • If each pivot operation is non-degenerate, the algorithm terminates finitely: 𝜋 • Recall – 𝑐𝑘,𝑙 is the net decrease in the cost per unit flow sent around the pivot cycle W. 𝜋 After a non-degenerate pivot the cost of the new spanning tree structure is δ*𝑐𝑘,𝑙 units less • Every spanning tree structure has a unique associated cost The network simplex algorithm will encounter any spanning tree structure at most once • The network has a finite number of spanning tree structures The algorithm will terminate finitely. Degenerate pivots, pose a difficulty: The algorithm might not terminate finitely 40 Strongly feasible spanning trees • A poor choice of entering and leaving arcs leads to cycling (i.e., an infinite repetitive sequence of degenerate pivots) • Degeneracy is both a theoretical and practical issue We will maintaining a special type of spanning tree, a strongly feasible spanning tree We will show the network simplex algorithm terminates finitely 41 Terminology and definitions The tree arcs are either: • upward pointing (toward the root) • downward pointing (away from the root) Strongly feasible spanning tree: 1. A spanning tree T is strongly feasible if every tree arc with zero flow is upward pointing and every tree arc whose flow equals its capacity is downward pointing 2. A spanning tree T is strongly feasible if we can send a positive amount of flow from any node to the root along the tree path without violating any flow bound 42 • We wish implement the network simplex algorithm so that it always maintains a strongly feasible spanning tree must first find an initial strongly feasible spanning tree We append to the problem an artificial node, with index n + 1 referred to as the root, and an artificial arc for each node of the original problem. Each artificial arc will have lower bound zero, upper bound infinity, and a high cost C For each node i ∈ V, we add the arc (i, r) and assign flow xir = b(i) if b(i) > 0, and arc (r, i) with flow xir = -b(i) otherwise • satisfies all supply and demand constraints • Strongly feasible 43 • Note that a non-degenerate spanning tree is always strongly feasible • A degenerate spanning tree might or might not be strongly feasible • Algorithm creates a degenerate spanning tree from a non-degenerate spanning tree whenever two or more arcs are qualified as leaving arcs and we drop only one of these Therefore, the algorithm needs to select the leaving arc carefully so that the next spanning tree is strongly feasible. 44 • Leaving Arc Rule: select the leaving arc as the last blocking arc encountered in traversing the pivot cycle W along its orientation starting at the apex w. • We show that the leaving arc rule guarantees that in the next spanning tree every node in the cycle W can send a positive amount of flow to the root node. 45 Property: Each node in the segment W2 can send a positive amount of flow to the root in the next spanning tree • Arc (p, q) is the last blocking arc in W • No arc in W2 is blocking • Every node in this segment can send a positive amount of flow to the root via node w (the apex) along the orientation of W2 46 Property: Each node in the segment W1 can send a positive amount of flow to the root in the next spanning tree We prove this observation by considering two cases: 1. If the previous pivot was a non-degenerate pivot, the pivot augmented a positive amount of flow δ along the arcs in W1. After the augmentation, every node in W1 can send a positive amount of flow back to the root opposite to the orientation of W1 via the apex node w (each node can send at least δ units to the apex and then at least some of this flow to the root since the previous spanning tree was strongly feasible) 2. If the previous pivot was a degenerate pivot, W1 must be contained in the segment of W between node w and node k because the property of strong feasibility implies that every node on the path from node I to node w can send a positive amount of flow to the root before the pivot, and thus no arc on this path can be a blocking arc in a degenerate pivot. Now observe that before the pivot, every node in W1 could send a positive amount of flow to the root, and since the pivot does not change flow values, every node in W1 must be able to send a positive amount of flow to the root after the pivot as well. 47 We next show that in the next spanning tree, nodes not belonging to the cycle W can also send a positive amount of flow to the root • In the previous spanning tree (before the augmentation), every node j could send a positive amount of flow to the root and if the tree path from node j does not pass through the cycle W, the same path is available to carry a positive amount of flow in the next spanning tree • If the tree path from node j does pass through the cycle W, the segment of this tree path to the cycle W is available to carry a positive amount of flow in the next spanning tree and once a positive amount of flow reaches the cycle W, then, as shown earlier, we can send it (or some of it) to the root node This completes the proof that the next spanning tree is strongly feasible. 48 We now establish the correctness of the network simplex algorithm: • We have previously shown that each non-degenerate pivot strictly decreases the objective function value • The number of non-degenerate pivots is finite • The algorithm can, however, also perform degenerate pivots • We will show that the number of successive degenerate pivots between any two non-degenerate pivots is finitely bounded. 49 • Suppose that arc (k, l) enters the spanning tree at its lower bound and in doing so it defines a degenerate pivot • In this case, the leaving arc belongs to the tree path from node k to the apex w • Just as seen before, node k lies in the tree for which the potentials of 𝜋 𝜋 all nodes change by an amount 𝑐𝑘,𝑙 . Since 𝑐𝑘,𝑙 < 0, this degenerate pivot strictly decreases the sum of all node potentials • Since no node potential can fall below – n*C, the number of successive degenerate pivots is finite. 50 • If the entering arc (k, l) is at its upper bound, we define the orientation of the cycle Was opposite to the orientation of arc (k, I) • The criteria for selecting the leaving arc remains unchanged • In this case node I is contained in the subtree for which the potentials 𝜋 of all the nodes decrease by the amount 𝑐𝑘,𝑙 >0 • The pivot again decreases the sum of the node potentials And this sums up our proof! 51