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