www.pudn.com > AntAnt.rar > Ant_sparse.cpp


 
#include "Ant_sparse.h" 
#include  
#include  
#include  
#include  
#include  
 
double const alpha=0.8; 
double const c=0.0001; 
double const Q=20; 
double const p=0.80; 
double const a0=1; 
double const keeplus=10; 
 
 
double Ant_sparse::myrand() 
{	 
srand(time(0)); 
double my[100]; 
ccdi++; 
if (ccdi==100)  
ccdi=0; 
for(int mi=0;mi<100;mi++) 
{double fav=rand()%10000; 
my[mi]=fav/10000;} 
return my[ccdi]; 
} 
 
double Ant_sparse::f_xy_val(double a) 
{ 
	double temp=0.0; 
	 
	//temp=pow(a,2)+3*pow(a,2)-9*a;此函数已验证成功 
	temp=-cos(a)+(a+2)*sin(a+3); 
	return temp; 
} 
 
Ant_sparse::Ant_sparse() 
{ 
 
	ccdi=-1;//应用于myrand(),,应是全局变量................ 
	xy_num=2; 
	block_num=20.0; 
	ant_num=20;	 
 
	maxscope=5.0;	 
	minscope=-5.0;	 
	xx=yy=1; 
 
	int i,j; 
	 
	for(i=0;i<=block_num;i++)//第k个蚂蚁 
	{ 
		 ant_k_val[i]=0; 
	} 
    for(i=0;i<=block_num;i++)	 
		{ 
			phe[i]=c; 
			//tabu[i]=i; 
		} 
     for(i=0;i<=block_num;i++)				 
		block[i]=(maxscope-minscope)/block_num*i+minscope;	 
} 
 
Ant_sparse::~Ant_sparse() 
{ 
 
} 
 
void Ant_sparse::ant_trans() 
{ 
	 int i,j,k,can,maxT0=0,maxT1=0; 
	 double sumaffect2,maxT0_T,maxT1_T,sumpk,pr; 
 
	 double ant_ptrans[21],change_phe[21];    
	 int kmax=0,ggmax=0; 
	 double maxphe=0,f_max_k=0; 
	 
	int tabu[21]; 
	 
	for(i=0;i<=block_num;i++) 
		tabu[i]=i; 
	for(i=0;i<=block_num;i++) 
		change_phe[i]=0; 
	for(k=0;k0.8) 
		 { 
			 //pr=rand()%10000/10000.0; 
		     pr=myrand(); 
			 sumpk=0.0; 
			     can=-1; 
		tocan:     can++;		 
				 //if(can==m_ant+1)can=0; 
				 sumpk+=ant_ptrans[can]; 
				 if(sumpk>=pr) 
				 { 
					 tabu[k]=can; 
					 phe[tabu[k]]=(1-p)*phe[tabu[k]]+p*c; 
				 } 
				 else goto tocan; 
				 
		 } 
		 else 
		 { 
			 for(int gg=0;gg=maxphe) 
				 { 
					 maxphe=phe[gg]; 
					 ggmax=gg; 
				 } 
				 tabu[k]=ggmax;	 
				 phe[tabu[k]]=(1-p)*phe[tabu[k]]+p*c; 
		 } 
 
	} 
 
	 
	for(k=0;k<=ant_num;k++) 
	{ 
		ant_k_val[k]=f_xy_val(block[tabu[k]]); //改成一维函数试试 
		f_max_k=ant_k_val[0]; 
		if(ant_k_val[k]<=f_max_k) 
		{ 
			f_max_k=ant_k_val[k]; 
			kmax=k; 
		} 
	} 
		 
	//for(k=0;kmaxT0_T) 
		 { 
			 maxT0_T=phe[i]; 
			 maxT0=i; 
		 } 
	 }	 
	  
	 printf("信息素行:%-d  最大信息素:%-13.4f\n",maxT0,maxT0_T);  
	 printf("参数值:%-13.4f  最小函数值:%-13.4f\n",block[maxT0],f_xy_val(block[maxT0])); 
		 	 
} 
 
 
void Ant_sparse::Ant_sparse_algo() 
{ 
	double  max_mf1=0; 
	double  max_mf2=0; 
	double m_max=1e-4; 
 
	int time=0; 
	int select0=0; 
	int select1=0; 
 
	while(time<50)//////////现在考虑随迭代次数增加,但是值不变化, 
		          
	{         
		printf("迭代次数:%d\n",time+1);		 
		ant_trans(); 
		for(int i=0;i