1#!/usr/bin/env python
2"""
3Simulated Annealing
4
5The pythonic version of the simple example from the gsl reference document.
6"""
7# Author: Pierre Schnizer
8# Date  : December 2003
9import pygsl._numobj as numx
10import pygsl.siman as siman
11import pygsl.rng   as rng
12
13# how many points do we try before stepping
14N_TRIES = 200
15
16# how many iterations for each T?
17ITERS_FIXED_T = 10
18
19# max step size in random walk
20STEP_SIZE = 10
21
22# Boltzmann constant
23K = 1.0
24
25# initial temperature
26T_INITIAL = 0.002
27
28# damping factor for temperature
29MU_T = 1.005
30T_MIN = 2.0e-6
31
32
33class MySiman(siman.NumericEnsemble):
34    def EFunc(self):
35        x = self._data
36        t = x-1.0
37        t2 = t*t
38        # Necessary as my python does not handle the exp of big numbers
39        # correctly
40        if t2 > 700:
41            tmp = 0
42        else:
43            tmp = numx.exp(-t2)
44        return tmp*numx.sin(8*x)
45
46    def Metric(self, outer):
47        return numx.absolute(self._data - outher.GetData())
48
49    def Step(self, rng, step_size):
50        old_x = self._data
51
52        u = rng.uniform();
53        new_x = u * 2 * step_size - step_size + old_x;
54        self._data = new_x
55
56
57    def Print(self):
58        print "%12g" % self._data,
59
60m = MySiman()
61m.SetData(15.5)
62
63r = rng.rng()
64
65result = siman.solve(r, m, do_print=0)
66#result = siman.solve(r, m, do_print=1, n_tries=N_TRIES, iters_fixed_T=ITERS_FIXED_T,
67#                     step_size=STEP_SIZE, k=K, t_initial=T_INITIAL, mu_t = MU_T,
68#                     t_min=T_MIN)
69print "# Found minimum at %f" % result.GetData()
70