summaryrefslogtreecommitdiff
path: root/gsl-1.9/doc/siman.texi
diff options
context:
space:
mode:
Diffstat (limited to 'gsl-1.9/doc/siman.texi')
-rw-r--r--gsl-1.9/doc/siman.texi371
1 files changed, 371 insertions, 0 deletions
diff --git a/gsl-1.9/doc/siman.texi b/gsl-1.9/doc/siman.texi
new file mode 100644
index 0000000..902cad7
--- /dev/null
+++ b/gsl-1.9/doc/siman.texi
@@ -0,0 +1,371 @@
+@cindex simulated annealing
+@cindex combinatorial optimization
+@cindex optimization, combinatorial
+@cindex energy function
+@cindex cost function
+Stochastic search techniques are used when the structure of a space is
+not well understood or is not smooth, so that techniques like Newton's
+method (which requires calculating Jacobian derivative matrices) cannot
+be used. In particular, these techniques are frequently used to solve
+combinatorial optimization problems, such as the traveling salesman
+problem.
+
+The goal is to find a point in the space at which a real valued
+@dfn{energy function} (or @dfn{cost function}) is minimized. Simulated
+annealing is a minimization technique which has given good results in
+avoiding local minima; it is based on the idea of taking a random walk
+through the space at successively lower temperatures, where the
+probability of taking a step is given by a Boltzmann distribution.
+
+The functions described in this chapter are declared in the header file
+@file{gsl_siman.h}.
+
+@menu
+* Simulated Annealing algorithm::
+* Simulated Annealing functions::
+* Examples with Simulated Annealing::
+* Simulated Annealing References and Further Reading::
+@end menu
+
+@node Simulated Annealing algorithm
+@section Simulated Annealing algorithm
+
+The simulated annealing algorithm takes random walks through the problem
+space, looking for points with low energies; in these random walks, the
+probability of taking a step is determined by the Boltzmann distribution,
+@tex
+\beforedisplay
+$$
+p = e^{-(E_{i+1} - E_i)/(kT)}
+$$
+\afterdisplay
+@end tex
+@ifinfo
+
+@example
+p = e^@{-(E_@{i+1@} - E_i)/(kT)@}
+@end example
+
+@end ifinfo
+@noindent
+if
+@c{$E_{i+1} > E_i$}
+@math{E_@{i+1@} > E_i}, and
+@math{p = 1} when
+@c{$E_{i+1} \le E_i$}
+@math{E_@{i+1@} <= E_i}.
+
+In other words, a step will occur if the new energy is lower. If
+the new energy is higher, the transition can still occur, and its
+likelihood is proportional to the temperature @math{T} and inversely
+proportional to the energy difference
+@c{$E_{i+1} - E_i$}
+@math{E_@{i+1@} - E_i}.
+
+The temperature @math{T} is initially set to a high value, and a random
+walk is carried out at that temperature. Then the temperature is
+lowered very slightly according to a @dfn{cooling schedule}, for
+example: @c{$T \rightarrow T/\mu_T$}
+@math{T -> T/mu_T}
+where @math{\mu_T} is slightly greater than 1.
+@cindex cooling schedule
+@cindex schedule, cooling
+
+The slight probability of taking a step that gives higher energy is what
+allows simulated annealing to frequently get out of local minima.
+
+@node Simulated Annealing functions
+@section Simulated Annealing functions
+
+@deftypefun void gsl_siman_solve (const gsl_rng * @var{r}, void * @var{x0_p}, gsl_siman_Efunc_t @var{Ef}, gsl_siman_step_t @var{take_step}, gsl_siman_metric_t @var{distance}, gsl_siman_print_t @var{print_position}, gsl_siman_copy_t @var{copyfunc}, gsl_siman_copy_construct_t @var{copy_constructor}, gsl_siman_destroy_t @var{destructor}, size_t @var{element_size}, gsl_siman_params_t @var{params})
+
+This function performs a simulated annealing search through a given
+space. The space is specified by providing the functions @var{Ef} and
+@var{distance}. The simulated annealing steps are generated using the
+random number generator @var{r} and the function @var{take_step}.
+
+The starting configuration of the system should be given by @var{x0_p}.
+The routine offers two modes for updating configurations, a fixed-size
+mode and a variable-size mode. In the fixed-size mode the configuration
+is stored as a single block of memory of size @var{element_size}.
+Copies of this configuration are created, copied and destroyed
+internally using the standard library functions @code{malloc},
+@code{memcpy} and @code{free}. The function pointers @var{copyfunc},
+@var{copy_constructor} and @var{destructor} should be null pointers in
+fixed-size mode. In the variable-size mode the functions
+@var{copyfunc}, @var{copy_constructor} and @var{destructor} are used to
+create, copy and destroy configurations internally. The variable
+@var{element_size} should be zero in the variable-size mode.
+
+The @var{params} structure (described below) controls the run by
+providing the temperature schedule and other tunable parameters to the
+algorithm.
+
+On exit the best result achieved during the search is placed in
+@code{*@var{x0_p}}. If the annealing process has been successful this
+should be a good approximation to the optimal point in the space.
+
+If the function pointer @var{print_position} is not null, a debugging
+log will be printed to @code{stdout} with the following columns:
+
+@example
+number_of_iterations temperature x x-(*x0_p) Ef(x)
+@end example
+
+and the output of the function @var{print_position} itself. If
+@var{print_position} is null then no information is printed.
+@end deftypefun
+
+@noindent
+The simulated annealing routines require several user-specified
+functions to define the configuration space and energy function. The
+prototypes for these functions are given below.
+
+@deftp {Data Type} gsl_siman_Efunc_t
+This function type should return the energy of a configuration @var{xp}.
+
+@example
+double (*gsl_siman_Efunc_t) (void *xp)
+@end example
+@end deftp
+
+@deftp {Data Type} gsl_siman_step_t
+This function type should modify the configuration @var{xp} using a random step
+taken from the generator @var{r}, up to a maximum distance of
+@var{step_size}.
+
+@example
+void (*gsl_siman_step_t) (const gsl_rng *r, void *xp,
+ double step_size)
+@end example
+@end deftp
+
+@deftp {Data Type} gsl_siman_metric_t
+This function type should return the distance between two configurations
+@var{xp} and @var{yp}.
+
+@example
+double (*gsl_siman_metric_t) (void *xp, void *yp)
+@end example
+@end deftp
+
+@deftp {Data Type} gsl_siman_print_t
+This function type should print the contents of the configuration @var{xp}.
+
+@example
+void (*gsl_siman_print_t) (void *xp)
+@end example
+@end deftp
+
+@deftp {Data Type} gsl_siman_copy_t
+This function type should copy the configuration @var{source} into @var{dest}.
+
+@example
+void (*gsl_siman_copy_t) (void *source, void *dest)
+@end example
+@end deftp
+
+@deftp {Data Type} gsl_siman_copy_construct_t
+This function type should create a new copy of the configuration @var{xp}.
+
+@example
+void * (*gsl_siman_copy_construct_t) (void *xp)
+@end example
+@end deftp
+
+@deftp {Data Type} gsl_siman_destroy_t
+This function type should destroy the configuration @var{xp}, freeing its
+memory.
+
+@example
+void (*gsl_siman_destroy_t) (void *xp)
+@end example
+@end deftp
+
+@deftp {Data Type} gsl_siman_params_t
+These are the parameters that control a run of @code{gsl_siman_solve}.
+This structure contains all the information needed to control the
+search, beyond the energy function, the step function and the initial
+guess.
+
+@table @code
+@item int n_tries
+The number of points to try for each step.
+
+@item int iters_fixed_T
+The number of iterations at each temperature.
+
+@item double step_size
+The maximum step size in the random walk.
+
+@item double k, t_initial, mu_t, t_min
+The parameters of the Boltzmann distribution and cooling schedule.
+@end table
+@end deftp
+
+
+@node Examples with Simulated Annealing
+@section Examples
+
+The simulated annealing package is clumsy, and it has to be because it
+is written in C, for C callers, and tries to be polymorphic at the same
+time. But here we provide some examples which can be pasted into your
+application with little change and should make things easier.
+
+@menu
+* Trivial example::
+* Traveling Salesman Problem::
+@end menu
+
+@node Trivial example
+@subsection Trivial example
+
+The first example, in one dimensional cartesian space, sets up an energy
+function which is a damped sine wave; this has many local minima, but
+only one global minimum, somewhere between 1.0 and 1.5. The initial
+guess given is 15.5, which is several local minima away from the global
+minimum.
+
+@smallexample
+@verbatiminclude examples/siman.c
+@end smallexample
+
+@need 2000
+Here are a couple of plots that are generated by running
+@code{siman_test} in the following way:
+
+@example
+$ ./siman_test | awk '!/^#/ @{print $1, $4@}'
+ | graph -y 1.34 1.4 -W0 -X generation -Y position
+ | plot -Tps > siman-test.eps
+$ ./siman_test | awk '!/^#/ @{print $1, $4@}'
+ | graph -y -0.88 -0.83 -W0 -X generation -Y energy
+ | plot -Tps > siman-energy.eps
+@end example
+
+@iftex
+@sp 1
+@center @image{siman-test,2.8in}
+@center @image{siman-energy,2.8in}
+
+@quotation
+Example of a simulated annealing run: at higher temperatures (early in
+the plot) you see that the solution can fluctuate, but at lower
+temperatures it converges.
+@end quotation
+@end iftex
+
+@node Traveling Salesman Problem
+@subsection Traveling Salesman Problem
+@cindex TSP
+@cindex traveling salesman problem
+
+The TSP (@dfn{Traveling Salesman Problem}) is the classic combinatorial
+optimization problem. I have provided a very simple version of it,
+based on the coordinates of twelve cities in the southwestern United
+States. This should maybe be called the @dfn{Flying Salesman Problem},
+since I am using the great-circle distance between cities, rather than
+the driving distance. Also: I assume the earth is a sphere, so I don't
+use geoid distances.
+
+The @code{gsl_siman_solve} routine finds a route which is 3490.62
+Kilometers long; this is confirmed by an exhaustive search of all
+possible routes with the same initial city.
+
+The full code can be found in @file{siman/siman_tsp.c}, but I include
+here some plots generated in the following way:
+
+@smallexample
+$ ./siman_tsp > tsp.output
+$ grep -v "^#" tsp.output
+ | awk '@{print $1, $NF@}'
+ | graph -y 3300 6500 -W0 -X generation -Y distance
+ -L "TSP - 12 southwest cities"
+ | plot -Tps > 12-cities.eps
+$ grep initial_city_coord tsp.output
+ | awk '@{print $2, $3@}'
+ | graph -X "longitude (- means west)" -Y "latitude"
+ -L "TSP - initial-order" -f 0.03 -S 1 0.1
+ | plot -Tps > initial-route.eps
+$ grep final_city_coord tsp.output
+ | awk '@{print $2, $3@}'
+ | graph -X "longitude (- means west)" -Y "latitude"
+ -L "TSP - final-order" -f 0.03 -S 1 0.1
+ | plot -Tps > final-route.eps
+@end smallexample
+
+@noindent
+This is the output showing the initial order of the cities; longitude is
+negative, since it is west and I want the plot to look like a map.
+
+@smallexample
+# initial coordinates of cities (longitude and latitude)
+###initial_city_coord: -105.95 35.68 Santa Fe
+###initial_city_coord: -112.07 33.54 Phoenix
+###initial_city_coord: -106.62 35.12 Albuquerque
+###initial_city_coord: -103.2 34.41 Clovis
+###initial_city_coord: -107.87 37.29 Durango
+###initial_city_coord: -96.77 32.79 Dallas
+###initial_city_coord: -105.92 35.77 Tesuque
+###initial_city_coord: -107.84 35.15 Grants
+###initial_city_coord: -106.28 35.89 Los Alamos
+###initial_city_coord: -106.76 32.34 Las Cruces
+###initial_city_coord: -108.58 37.35 Cortez
+###initial_city_coord: -108.74 35.52 Gallup
+###initial_city_coord: -105.95 35.68 Santa Fe
+@end smallexample
+
+The optimal route turns out to be:
+
+@smallexample
+# final coordinates of cities (longitude and latitude)
+###final_city_coord: -105.95 35.68 Santa Fe
+###final_city_coord: -106.28 35.89 Los Alamos
+###final_city_coord: -106.62 35.12 Albuquerque
+###final_city_coord: -107.84 35.15 Grants
+###final_city_coord: -107.87 37.29 Durango
+###final_city_coord: -108.58 37.35 Cortez
+###final_city_coord: -108.74 35.52 Gallup
+###final_city_coord: -112.07 33.54 Phoenix
+###final_city_coord: -106.76 32.34 Las Cruces
+###final_city_coord: -96.77 32.79 Dallas
+###final_city_coord: -103.2 34.41 Clovis
+###final_city_coord: -105.92 35.77 Tesuque
+###final_city_coord: -105.95 35.68 Santa Fe
+@end smallexample
+
+@iftex
+@sp 1
+@center @image{initial-route,2.2in}
+@center @image{final-route,2.2in}
+
+@quotation
+Initial and final (optimal) route for the 12 southwestern cities Flying
+Salesman Problem.
+@end quotation
+@end iftex
+
+@noindent
+Here's a plot of the cost function (energy) versus generation (point in
+the calculation at which a new temperature is set) for this problem:
+
+@iftex
+@sp 1
+@center @image{12-cities,2.8in}
+
+@quotation
+Example of a simulated annealing run for the 12 southwestern cities
+Flying Salesman Problem.
+@end quotation
+@end iftex
+
+@node Simulated Annealing References and Further Reading
+@section References and Further Reading
+
+Further information is available in the following book,
+
+@itemize @asis
+@item
+@cite{Modern Heuristic Techniques for Combinatorial Problems}, Colin R. Reeves
+(ed.), McGraw-Hill, 1995 (ISBN 0-07-709239-2).
+@end itemize