Heuristic (computer science)
From Academic Kids

In computer science, besides the common use as "rule of thumb" (see heuristic), the term heuristic has two welldefined technical meanings.
Contents 
Heuristic algorithms
Two fundamental goals in computer science are finding algorithms with provably good run times and with provably good or optimal solution quality. A heuristic is an algorithm that gives up one or both of these goals; for example, it usually finds pretty good solutions, but there is no proof the solutions could not get arbitrarily bad; or it usually runs reasonably quickly, but there is no argument that this will always be the case.
Often, one can find specially crafted problem instances where the heuristic will in fact produce very bad results or run very slowly; however, these instances might never occur in practise because of their special structure. Therefore, the use of heuristics is very common in real world implementations.
Heuristics in shortestpath problems
For shortest path problems, the term has a different meaning. Here, a heuristic is a function, <math>h(n)<math> defined on the nodes of a search tree, which serves as an estimate of the cost of the cheapest path from that node to the goal node. Heuristics are used by informed search algorithms such as Greedy bestfirst search and A* to choose the best node to explore. Greedy bestfirst search will choose the node that has the lowest value for the heuristic function. A* will expand nodes that have the lowest value for <math> g(n)+h(n) <math>, where <math>g(n)<math> is the (exact) cost of the path from the initial state to the current node. When <math>h(n)<math> is admissible—that is, if <math>h(n)<math> never overestimates the costs of reaching the goal—A* is provably optimal.
The classical problem involving heuristics is the npuzzle. Commonly used heuristics for this problem include counting the number of misplaced tiles and finding the sum of the Manhattan distances between each block and its position in the goal configuration. Note that both are admissible.
Effect of heuristics on computational performance
In any searching problem where there are <math>b<math> choices at each node and a depth of d at the goal node, a naive searching algorithm would have to potentially search around <math>b^d<math> nodes before finding a solution. Heuristics improve the efficiency of search algorithms by reducing the branching factor from <math>b<math> to (ideally) a low constant b*.
Although any admissible heuristic will give an optimal answer, a heuristic that gives a lower branching factor is more computationally efficient for a particular problem. It can be shown that a heuristic <math>h_2(n)<math> is better than another heuristic <math>h_1(n)<math>, if <math>h_2(n)<math> dominates <math>h_1(n)<math>, ie. <math>h_1(n) < h_2(n)<math> for all <math>n<math>.
Finding heuristics
The problem of finding an admissible heuristic with a low branching factor for common search tasks has been extensively researched in the AI community. A number of common techniques are used:
 Solution costs of subproblems often serve as useful estimates of the overall solution cost. These are always admissible. For example, a heuristic for a 10puzzle might be the cost of moving tiles 15 into their correct places. A common idea is to use a pattern database that stores the exact solution cost of every subproblem instance.
 The solution of a relaxed problem often serves as a useful admissible estimate of the original. For example manhattan distance is a relaxed version of the npuzzle problem, because we assume we can move each tile to its position in a single step.
 Given a set of admissible heuristic functions <math>h_1(n), h_2(n), ..., h_i(n)<math>, the function <math>h(n) = \max\{h_1(n), h_2(n), ..., h_i(n)\}<math> is an admissible heuristic that dominates all of them.
Using these techniques a program called ABSOLVER was written (1993) by A.E. Prieditis for automatically generating heuristics for a given problem. ABSOLVER generated a new heuristic for the 8puzzle better than any preexisting heuristic and found the first useful heuristic for solving the Rubik's Cube.