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;im) 
	{   
		if(m==0)  
		{ 
		  if(km)   分别将0和m,k和city number之间路径逆序   // 
/*********************************************************/ 
void generateNext(int k,int m) 
{ 
 
   if (km) 
   {    
	reverse(curPath,0,m); 
    reverse(curPath,k,City_num-1); 
   } 
 
} 
 
void reverse(int *path,int k,int m) 
{ 
  int temp; 
   
  if(k0.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_bestDiminish_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