www.pudn.com > Anneal.rar > Anneal.cpp
/********************************************/ #include#include #include #include /********************************************/ #include "Matrix.h" /********************************************/ #define AIM 10 #define MarkovLength 100 #define Diminish_T_num 20 #define Temperature 100 #define DiminishRate 0.9 int City_num=0; //由文件中获取 Matrix distData; double best=1000000; double cur_best=1000000; int *bestPath; //当前最好路径 int *curPath; //当前路径 FILE *galog; /* an output file */ FILE *infile; /*********************************************/ void initialize(void); double evaluatedistance(int *); void generateNext(int, int); void reverse(int *,int, int); double evaluatedistinct(int,int); void SetNewState(int *,int *); void report(); void sim_anneal(void); //模拟主体 /*********************************************/ /*************************************************/ // 初始化函数,读取数据文件,构造距离数组 // // 并以原始数据为初始路径 // /*************************************************/ void initialize() { fscanf(infile, "%d",&City_num); distData.setDimension(City_num,City_num); int i; for(i=0;i m) { if(m==0) { if(k m) 分别将0和m,k和city number之间路径逆序 // /*********************************************************/ void generateNext(int k,int m) { if (k m) { reverse(curPath,0,m); reverse(curPath,k,City_num-1); } } void reverse(int *path,int k,int m) { int temp; if(k 0.5) { cur_best=best; SetNewState(curPath,bestPath); for(int i=0;i ((double)rand()/(double)RAND_MAX)) { diminish_t_num++; generateNext(k,m); cur_best=evaluatedistance(curPath); } else { diminish_t_num++ ; } if(cur_best Diminish_T_num) { aim++; break; } if(aim==AIM) return; } temperature *= DiminishRate ;//deminish the temperature } } /**********************************************************/ void report() { fprintf(galog,"%6lf\n",best); for(int i=0;i