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;k 0.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;k maxT0_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