📄 蚁群算法c++.txt
字号:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<cassert>
#include<cstdlib>
using namespace std;
const double lamdas[]={1.06,1.082,1.283,1.364};
const int N=100;
const int M=200;
const int STEP=100;
const double T=25;
const double F=(T-25)*(T+25+546);
const double d0=1.0;
const double pi=2*acos(0.0);
double dk[4];
const double c1=1.0;
const double c2=1.0;
const double alpha=0.3;
double p[N][M];
int id[N][M];
double E[N];
double v[M][N];
double poss[M][N];
double tposs[M][N];
double sposs[M];
inline double compute_ne(double lamda)
{
return 4.5299+(0.084752+1.7299*1e-7*F)/(lamda*lamda-(0.2034-4.7733*1e-7*F))-8.3146*1e-8*F-0.02379*lamda*lamda;
}
double computeE(int id)
{
int i,j;
double mx=0,mi=1e30,L,real,im,deff;
double res=0;
for(i=0;i<4;i++)
{
for(j=0,L=0,real=0,im=0;j<M;j++)
{
L+=p[id][j];
real+=cos(dk[i]*L)-cos(dk[i]*(L-p[id][j]));
im+=sin(dk[i]*L)-sin(dk[i]*(L-p[id][j]));
}
deff=sqrt(real*real+im*im)/(L*dk[i]);
mx=(deff>mx)?deff:mx;
mi=(deff>mi)?mi:deff;
//printf("deff);
assert(deff<=1);
res+=fabs(d0-deff);
}
assert(mi<1e10);
return res+mx-mi;
}
void init()
{
srand(time(0));
int i,j,ti;
for(i=0;i<4;i++)
{
dk[i]=pi*4*(compute_ne(lamdas[i]*2)-compute_ne(lamdas[i]))/lamdas[i];
}
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
v[i][j]=(rand()%16+1)*1e-5;
if(v[i][j]<1e-5)v[i][j]=1e-5;
poss[i][j]=1.0/N;
}
}
double temp,tsum;
for(i=0;i<N;i++)
{
for(j=0;j<M;j++){
temp=(rand()%10000)/10000.0;
for(ti=0,tsum=poss[j][0];ti+1<N && tsum<temp;tsum+=poss[j][ti+1],ti++);
p[i][j]=v[j][ti];
id[i][j]=ti;
}
E[i]=computeE(i);
}
}
int main()
{
init();
int k=STEP,i,j,ti;
double temp,tsum;
while(k--)
{
memset(tposs,0,sizeof(tposs));
memset(sposs,0,sizeof(sposs));
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
tposs[j][id[i][j]]+=E[i];
sposs[j]+=E[i];
}
}
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
poss[i][j]=tposs[i][j]/sposs[i];
}
}
double temp,tsum;
for(i=0;i<N;i++)
{
for(j=0;j<M;j++){
temp=(rand()%10000)/10000.0;
for(ti=0,tsum=poss[j][0];ti+1<N && tsum<temp;tsum+=poss[j][ti+1],ti++);
p[i][j]=v[j][ti];
id[i][j]=ti;
}
E[i]=computeE(i);
}
//cout<<k<<endl;
}
int mi;
mi=0;
for(i=1;i<N;i++)
{
if(E[i]>E[mi])
{
mi=i;
}
}
printf("Now the global value is %0.5lf\n",E[mi]);
double t=0;
for(i=0,t=0;i<M;i++)
{
printf("%0.5lf \t %0.5lf\n",p[mi][i],t+=p[mi][i]);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -