📄 ant_sparse.cpp
字号:
#include "Ant_sparse.h"
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <fstream.h>
#include <stdio.h>
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<ant_num+1;k++)
ant_k_val[k]=0;
for(k=0;k<ant_num+1;k++)
{
sumaffect2=0;
for(i=0;i<=block_num;i++)
sumaffect2+=phe[i];
for(i=0;i<=block_num;i++)
ant_ptrans[i]=phe[i]/sumaffect2;
if(myrand()>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<ant_num+1;gg++)
if(phe[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<ant_num+1;k++)
//change_phe[tabu[k]]+=Q/(ant_k_val[k]+keeplus);
change_phe[tabu[kmax]]+=1.0/(ant_k_val[kmax]+keeplus);
//for(i=0;i<=block_num;i++)
//phe[i]=(1-alpha)*phe[i]+alpha*change_phe[i];
phe[tabu[kmax]]=(1-alpha)*phe[tabu[kmax]]+alpha*change_phe[tabu[kmax]];
maxT0_T=0;
for(i=0;i<ant_num+1;i++)
{
if(phe[i]>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<ant_num+1;i++)
printf("%13.4f",phe[i]);
printf("\n");
time++;
}
//cout<<"max="<<max_mf2<<endl;
}
void Ant_sparse::disp()
{
stupid_method();
}
void Ant_sparse::try_rand()
{
stupid_method();
cout<<"max="<<max_max<<endl;
cout<<"min="<<min_min<<endl;
}
void Ant_sparse::stupid_method()
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -