summaryrefslogtreecommitdiff
path: root/gsl-1.9/doc/siman.texi
blob: 902cad7b20ed8c3424605d916dee96e7f0c44593 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
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