Backtracking- 1
Summary
Backtracking: exhaustive search using divide-and-conquer.
General principles:
Backtracking with binary strings.
Backtracking with k-ary strings
Pruning
How to write a backtracking algorithm
Application to
The knapsack problem
The Hamiltonian cycle problem
The travelling salesperson problem
Exhaustive Search
Sometimes the best algorithm for a problem is to try all possibilities.
This is always slow, but there are standard tools that we can use to help:
algorithms for generating basic objects such as
2n binary string of length n
Bit Strings
procedure binary( m)
comment process all binary strings of length m
if m = 0 then process (A) else
A[m] := 0; binary(m 1)
A[m] := 1; binary(m 1)
Correctness proof
Claim: For all m 1, binary (m) calls process(A) once with
A[1..m] containing every string of m bits.
Proof: The proof is by induction on m. The claim certainly true
for m = 0.
Now suppose that binary(m 1) calls process(A) once with
A[1..m 1] containing every string of m 1 bits.
First, binary(m)
sets A[m] to 0, and
calls binary(m 1)
By the induction hypothesis, this calls process(A) once with A[1..m]
containing every string of m bits ending in 0.
Then, binary(m)
sets A[m] to 1, and
calls binary (m 1)
By the induction hypothesis, this calls process(A) once with
A[1..m] containing every string of m bits ending in 1.
Hence, binary(m) calls process (A) once with A[1..m]
containing every string of m bits.
Analysis
Let T(n) be the running time of binary(n). Assume procedure
process takes time O(1). Then,
c
if n 1
T ( n)
2T (n 1) d otherwise
k-ary Strings
Problem: Generate all the strings of n numbers drawn from 0..k 1..
Solution: Keep current k-ary string in an array A[1..n]. Aim is to call
process (A) once with A[1..n] containing each k-ary string. Call
procedure string(n):
procedure string( m)
comment process all k-ary strings of length m
if m = 0 then process (A) else
for j := 0 to k 1 do
A[m] := j; string(m 1)
Correctness proof: similar to binary case.
Analysis: similar to binary case, algorithm optimal.
Backtracking principles
Backtracking imposes a tree structure on the solution space. e.g. binary
strings of length 3:
???
??1
??0
?00
000
?10
100
010
?01
010
001
?11
101
011
111
Length used
???
n = 3, s1 = 4, s2 = 5, s3 = 2, L = 6.
??0
0
?00
0
??1
0
?10
?01
000
100
010
110
001
101
2
?11
011
7
111
The Algorithm
Use the binary string algorithm. Pruning: let l be length
remaining,
A[m] = 0 is always legal
A[m] = 1 is illegal is sm > l; prune here
To print all solutions to knapsack problem with n rods of
length s1,,sn, and knapsack of length L, call knapsack (n, L).
procedure knapsack(m, l)
comment solve knapsack problem with m rods, knapsack size
l
If m = 0 then
if l = 0 then print( A )
else
A[m] := 0; knapsack(m 1, l)
If sm l then
A[m] := 1; knapsack(m 1, l - sm)
Analysis: time O(2n)
Generalized Strings
Note that k can be different for each digit of the string, e.g. keep an
array D[1..n] with A[m] taking on values 0..D[m] - 1
procedure string( m)
comment process all strings of length m
if m = 0 then process(A) else
for j := 0 to D[m] 1 do
A[m] := j; string(m 1)
Application: in a graph with n nodes, D[m] could be the degree of node
m.
Hamiltonian cycles
A Hamiltonian cycle in a directed graph is a cycle that passes through
3
Store the graph as an adjacency list (for each vertex v {1,2,,n}, store a
list of the vertices w such that (v, w) E).
Hamiltonian Cycle:
N 1 2 3
1 2
2 3 4 6
3 4
4 1 7
5 3
1 4 7
7 5
2
2
3
1
4
4
5
3
6
5
7
7
The Algorithm
Use the generalized string algorithm. Pruning: Keep a Boolean array
U[1..n], where U[m] is true iff vertex m is unused. On entering m,
U[m] = true is legal
U[m] = false is illegal; prune here
To solve the Hamiltonian cycle problem, set up arrays N (neighbors) and
D (degree) for the input graph, and execute the following. Assume that
n > 1.
Algorithm Ctd.
1. for i := 1 to n 1 do U[i] := true
6. w := N[A[m +1], j]
7.
if U[w] then
8.
U[w] := false
9.
A[m] := w; hamilton(m 1)
10.
U[w] := true
procedure process( A)
comment check that the cycle is closed
11.
ok := false
12.
for j := 1 to D[A[1]] do
13.
14.
Analysis
How long does it take procedure hamilton to find one Hamiltonian
cycle? Assume that there are none.
Let T(n) be the running time of hamilton(v, n). Suppose the graph has
maximum out-degree d. Then, for some b,c IN,
bd
if n 0
T ( n)
dT (n 1) c otherwise
Travelling Salesperson
Optimization problem (TSP): Given a directed labeled graph G = (V, E),
find a Hamiltonian cycle of minimum cost (cost is sum of labels on
edges).
Bounded optimization problem (BTSP): Given a directed labeled graph
function TSP(l, r)
comment return min cost Ham. Cycle
of cost r and l
if l = r then return (BTSP(l)) else
m := (l + r)/2
if BTSP(m) succeeds
3. Hamilton(n 1, B)
procedure hamilton (m, b)
comment complete Hamiltonian cycle from
4. if m = 0 then process(A, b) else
5.
6.
w := N[A[m + 1], j]
7.
8.
U[w] := false
9.
A[m] := w
U[w] := true
procedure process(A, b)
comment check that the cycle is closed
11.