Exhaustion, Branch and Bound Gary Wong If you have any question, please ask via Email: garywong612@gmail.com MSN: gary_wong612@hotmail.com Welcome! • Your 1st training on advanced topics this year • I assume you have sufficient basic knowledge Pre-requisites • Recursion • Basic concepts of permutation and combination • Graph Searching (Optional) Exhaustion • Check for (almost) all possible cases • Advantages – Simple – Correct in nearly all circumstances • Provided that you implement correctly • Disadvantages – Can be too slow if too many cases (e.g. exponential) – Implementation is sometimes difficult When do we use exhaustion? • Not many possible cases • No other better methods are in your mind – Might not be your fault! – Many computational problems in the world have no known polynomial-time solutions – P, NP, NP-hard, NP-completeness… • Usually when the constraints are very small, you should think about whether exhaustion is possible Let me count the ways • Now you have unlimited supply of coins of values 1, 5, 10, 25 and 50 cents • Find the number of ways to make up n cents • 0 <= n <= 99 Let me count the ways • Have a rough (and conservative) estimation on number of possible cases • If only 1 cent can be used, at most how many coins? • If only 5 cents can be used, at most how many coins? • … • A very rough upper bound: – 100 x 20 x 10 x 4 x 2 = 1600000 • Surely acceptable within 1s Grid • Given an N x N white grids (N <= 5) • You may toggle the grid colors like this (white -> black; black -> white): • Given the initial colors of the grids, find the minimum number of toggling required to make all grids to become black Grid • Observations: – Toggle twice = Not toggle at all – Sequence of toggling does not affect the final appearance of the board – How many possible sequences of toggling are there? • Time Complexity: O(2NxN) • A more efficient algorithm actually exists! • Hint: its time complexity is O(2N x N2) Magic triangle • Given a magic triangle of N layers (1 <= N <= 5), comprising of N(N+1)/2 nodes • Integers 1 to N(N+1)/2 are assigned into each node exactly once, such that: – The number in a node = absolute difference of the numbers in its two children nodes • M numbers (0 <= M <= N(N+1)/2) have filled into some nodes, fill in the remaining nodes 1 • Time limit: 1s 4 6 2 3 5 Magic triangle • Let’s fill in the N(N+1)/2 numbers into the circles! • O((N(N+1)/2 – M)!) • Worst case? – N=5 – M = 0, i.e. no numbers are filled – 15! = 1307674368000 Magic triangle – 2nd attempt • Observation: – Numbers in lower layers can be used to derive the numbers above! – Why not just exhausting the lowest layer? • Time complexity: O(TPN), where T = N(N+1)/2 • 15P5 = 15! / 10! = 360360 What have you learnt? • Smart exhaustion vs Stupid exhaustion • Now I would teach you what “smart” means… A Classical Problem – Bin Packing • A number of objects are to be put into some identical bins • Find the minimum number of bins required to pack all objects Capacity: 50 10 20 30 50 20 Solution 1 • S = Sum of volumes of all objects • C = Capacity of a container • Answer = ceil (S / V) • Wrong! • Why? Solution 2 • Sort the objects in ascending order of their volumes • Put the smaller objects first • Wrong! • Why? The correct solution • Exhaustion BIN PACKING() if All objects have been put in some bins then update the best solution if a better one is found pick a bin B for each object O do if volume of O does not exceed remaining space in B then Put O into B BIN PACKING() Remove O from B Search tree Empty bins B1(50) B1(10) … B1(20) … B1(10,20) B1(50); B2(10) • DFS • For N objects, O(N!) … The cruel reality • N <= 40 • Performance: – input1.txt: Accepted – input2.txt: Accepted – input3.txt: TLE • How to speed up? Back to the search tree… • Is it necessary to go further here? Why? Empty bins B1(50) B1(10) … … B1(10,20) B1(50); B2(10) Suppose you know here that at most 2 bins are needed B1(20) … Optimization • Tree Pruning (Branch and Bound!) • Suppose f is the solution at this moment • If f >= cur_best, do not go further • Performance: – input1.txt: Accepted – input2.txt: Accepted – input3.txt: TLE • Still too slow… • Can we do better? A* Search • Let h be an estimated lower bound for the number of bins required to pack all unpacked objects • If f + h >= best, do not go further • h is also known as a heuristic function • But what makes a good function h in this case? The cruel reality, again • Performance: – – – – input1.txt: Accepted input2.txt: Accepted input3.txt: Accepted input4.txt: TLE • Further improved now • Can we do even better? Equivalent configurations = = Avoid equivalent configurations • Sort the objects by their volumes before searching • When putting the objects, you should ensure that: – The volumes of objects in each bin are in non-decreasing order, or – The volumes of smallest objects in all bins form a nonincreasing order A happy ending • Performance: – – – – – – – – input1.txt: Accepted input2.txt: Accepted input3.txt: Accepted input4.txt: Accepted input5.txt: Accepted input6.txt: Accepted input7.txt: Accepted input8.txt: Accepted • Result: Accepted Summary • Tree Pruning • A* • Avoid equivalent configurations Exercises • • • • • 1049 Chocolate 1050 Bin Packing 2005 Magic Triangle 2065 Toggle 3031 Trishade