How To Be Fickle
The backbone of many popular algorithms for solving NP-hard problems is implicit enumeration. There, the input problem is split into two or more subproblems by assigning some variable a new fixed value in each new subproblem – this is called branching – and the procedure is repeated recursively until the subproblems become easy enough to be dealt with directly.
Unfortunate branching choices may have disastrous consequences: once you have branched, there is no turning back and you may be doomed to painfully replicate all your subsequent moves. In this sense, branching is like marrying in the Roman Catholic church: Branch in haste, repent at leisure.
To some, the ominous prospect of irrevocable matrimony may supply the motivation for utmost care in choosing a spouse; others may prefer to choose spouses carelessly and to make divorce easy.
An implementation of the former plan is the prototype of strong branching, first introduced in Concorde, a computer code for the symmetric traveling salesman problem: use first quick and coarse criteria to eliminate some of a large number of initial candidates in a first round, then slower and finer criteria to eliminate some of the remaining candidates in the next round, and so on in an iterative fashion.
Two of the most popular implementations of the latter plan are dynamic backtracking of Matthew Ginsberg and GRASP of João Marques Silva and Karem Sakallah; one of the most neglected ones is resolution search. In reviewing resolution search, I will go into its origins, details, and extensions beyond the original presentation in 1995. In particular, I will point out that it can bridge the gap between certain local search heuristics and so-called exact algorithms.