160 likes | 356 Views
EMIS 8373: Integer Programming. Refinements to LP-Based Branch-and-Bound updated 31 March 2009 . Divide and Conquer. Optimization problem: z = max{ cx : x S }
E N D
EMIS 8373: Integer Programming Refinements to LP-Based Branch-and-Bound updated 31 March 2009
Divide and Conquer • Optimization problem: z = max{cx : xS} • Proposition: Let S = S1S2 … Sk be a decomposition of S into smaller sets, and let zk = max{cx : xSk} for k = 1, 2, …, K. Then z = maxkzk. • Strategy: divide the feasible region into sub-regions and compare the optimal solutions from each sub-region.
Divide and Conquer Example • Example: S {0,1}3 • S0 = {xS: x1 = 0} • S0 = {[0,0,0],[0,0,1],[0,1,0],[0,1,1]} • S1 = {xS: x1 = 1} • S1 = {[1,0,0],[1,0,1],[1,1,0],[1,1,1]} • S00 = {xS0: x2 = 0}={[0,0,0],[0,0,1]} • S01 = {xS0: x2 = 1}={[0,1,0],[0,1,1]} • S10 = {xS1: x2 = 0}={[1,0,0],[1,0,1]} • S11 = {xS1: x2 = 1}={[1,1,0],[1,1,1]}
Enumeration Tree S x1= 0 x1= 1 S0 S1 x2= 0 x2= 1 x2= 0 x2= 1 S00 S01 S10 S11 x3= 1 x3= 1 x3= 1 x3= 1 x3= 0 x3= 0 x3= 0 x3= 0 S010 S011 S000 S001 S110 S111 S100 S101 In the worst case, a branch-and-bound procedure would have to visit all eight leaves of the enumeration tree to find z.
Implicit Enumeration • Let ZU(Sk) be an upper bound on zk. • Let ZL(Sk) be a lower bound on zk. • There is at least one solution in Sk with objective function value ZL(Sk). • Implicit enumeration uses the following facts to eliminate some branches of the enumeration tree • ZL(Sk) zk ZU(Sk), • maxk {ZL(Sk)} z maxk {ZU(Sk)}
ZU(S) = 27 ZU(S0) = 20 ZU(S1) = 25 ZL(S) = 13 ZL(S0) = 20 ZL(S1) = 15 Pruning by Optimality ZU(S) = 25 S ZL(S) = 20 S0 S1 13 z = max{cx : x S} 27. 20 z0 20 z0= 20. Prune (fathom) S0. z = max{z0,z1} 20 z = max{cx : xS} 27 z0= 20, z1 25 z max{20, 25}
ZU(S0) = 20 ZU(S1) = 26 ZU(S) = 27 ZL(S1) = 21 ZL(S) = 13 ZL(S0) = 18 Pruning by Bounds ZU(S) = 26 S ZL(S) = 18 ZL(S) = 21 S0 S1 13 z = max{cx : xS} 27. 18 z = max{cx : xS} 27. 21 z = max{cx : xS} 26. S0 can be pruned since the best solution in S0 will be worse than the worst solution in S1.
LP-Based Branch-and-Bound (Maximization) • Uses the LP relaxation at each node to find a dual (upper) bound • Uses feasible IP solutions for primal (lower) bounds • primal bound (S) z dual bound (S) • Prunes by • Optimality: dual bound (Sk) = primal bound (Sk) • Bound: dual bound (Sk) < primal bound (S) • Infeasibility of LP sub-problem • Stopping criteria • Optimality: dual bound (S) = primal bound (S) • Optimality gap: (dual bound (S) – primal bound (S))/dual bound (S)
LP-Based Branch-and-Bound (Minimization) • Uses the LP relaxation at each node to find a dual (lower) bound • Uses feasible IP solutions for primal (upper) bounds • dual bound (S) z primal bound (S) • Prunes by • Optimality: dual bound (Sk) = primal bound (Sk) • Bound: dual bound (Sk) > primal bound (S) • Infeasibility of LP sub-problem • Stopping criteria • Optimality: dual bound (S) = primal bound (S) • Optimality gap: (primal bound (S) – dual bound (S))/dual bound (S)
Algorithmic Control • Which active node should be selected for the next branching step? • Which fractional variable should be branched on at that node? • Should we investigate the down branch first or the up branch? • How should we solve the subproblem at the selected node? • Alternative LP algorithms
Node Selection Criteria • CPLEX provides node-selection control via the nodesel and backtrack parameters • nodeseli (i = 1 or 2, default 1) • CPLEX associates a value with each node and choose the next active node based on this value • To use the bound from the optimal LP solution at the node set nodesel=1 • When nodesel=2, the node’s value is based on an estimate CPLEX makes of the best IP solution that could be found by branching on that node • Best bound (nodesel=1) tends to find better solutions earlier in the process, but nodesel=2 may be faster overall if the objective function values are “tightly clustered”.
Backtracking • Depending on the value at the most recently created node, CPLEX either braches at the active node with the best value or else it backtracks. • backtrack=r (any number, default 0.85) • backtrack=0 does a pure depth-first search (DFS) • Successive LP’s are easier (faster) to solve • Finds feasible solutions faster • Lower values > 0 favor backtracking (BFS) and values > 1 discourage it. • Can help move the search to a better part of the tree rather than (possibly) wasting time considering the descendents of a one node.
Variable Selection • varesel=i (i {-1, 0, 1, 2, 3 }, default 0) • When i=1 the variable with largest fractional part is selected • When i=-1 the variable with the smallest fractional part is selected • When i=2 an estimate of how much the objective function will degrade if each variable is forced to an adjacent integer is used to select the variable • When i=3 “strong branching” is used • Select the branch with the “most promising” partial solution • Requires the most time per node • When i = 0 a proprietary heuristic is used
Branching Rules • If the model contains more than one type of integer variable (e.g., integer x and binary y), it may be helpful to use a branching rule that gives a higher priority to one type of variable of the other. • Often useful for xijM yj • AMPL commands: • option mip_priorities ‘y 100 x 1’; • option cplexamp_auxfiles c; • CPLEX parameter branch=i • Use branch = 1 to always take the up branch first • Use branch = -1 to always take the down branch first