Simulated annealing is a randomized procedure to find approximate solutions to optimization problems where greedy techniques don't work due to the presence of local mimima. (We will assume we are trying to find a minimum - to find a maximum we could just take the negative of the objective function.) Let S be a finite set, and f(s) be the objective function defined on S. Each point in S has a set of neighbors, N(s). At each step, the simulated annealing procedure picks a neighbor of the current point at random and compares the value of the objective function at the neighbor to the value at the current point. If the value is an improvement, the neighbor replaces the current point. If not, the neighbor replaces the current point with probability exp( -d/T), where d is the difference in value of the objective function, and T is the current temperature.

The temperature is a way of controlling the fraction of steps that are taken that don't improve the objective function. The temperature is gradually reduced according to a cooling schedule. The lower the temperature, the more it acts like a greedy algorithm.

### References:

Simulated Annealing and Boltzmann Machines, by Emile Aarts and Jan Korst, Wiley, 1989

Finite Markov Chains and Algorithmic Applications, by Olle Haggstrom, Cambridge University Press, 2002

Probability and Algorithms, Chapter 2: Simulated Annealing, by Dimitris Bertsimas and John Tsitsiklis, National Academy Press, 1992