GSL模拟退火算法
来源:互联网 发布:局域网故障检测软件 编辑:程序博客网 时间:2024/05/06 19:21
#include <math.h>#include <stdlib.h>#include <gsl/gsl_siman.h>#pragma comment(lib, "libgsl_d.lib")#pragma comment(lib, "libgslcblas_d.lib")/* set up parameters for this simulated annealing run *//* how many points do we try before stepping */#define N_TRIES 200 /* how many iterations for each T? */#define ITERS_FIXED_T 10 /* max step size in random walk */#define STEP_SIZE 10 /* Boltzmann constant */#define K 1.0 /* initial temperature */#define T_INITIAL 0.002 /* damping factor for temperature */#define MU_T 1.005 #define T_MIN 2.0e-6gsl_siman_params_t params = {N_TRIES, ITERS_FIXED_T, STEP_SIZE, K, T_INITIAL, MU_T, T_MIN};/* now some functions to test in one dimension */double E1(void *xp){ double x = * ((double *) xp); return exp(-pow((x-1.0),2.0))*sin(8*x);}double M1(void *xp, void *yp){ double x = *((double *) xp); double y = *((double *) yp); return fabs(x - y);}void S1(const gsl_rng * r, void *xp, double step_size){ double old_x = *((double *) xp); double new_x; double u = gsl_rng_uniform(r); new_x = u * 2 * step_size - step_size + old_x; memcpy(xp, &new_x, sizeof(new_x));}void P1(void *xp){ printf ("%12g", *((double *) xp));}intmain(int argc, char *argv[]){ const gsl_rng_type * T; gsl_rng * r; double x_initial = 15.5; gsl_rng_env_setup(); T = gsl_rng_default; r = gsl_rng_alloc(T); gsl_siman_solve(r, &x_initial, E1, S1, M1, P1, NULL, NULL, NULL, sizeof(double), params); return 0;}