📄 连续蚁群算法4.cpp
字号:
#include <iostream.h>
#include <sys/timeb.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#define NCMAX 1000
#define MAXANT 100
#define N 20
#define NGR (MAXANT/5)
#define PI 3.1415926
#define A 1.0
#define GAMA 0.01
#define KESEI 0.8
#define PGR 0.9
#define PMR 0.5
#define UP 5.12
#define DOWN -5.12
int fvalue_number=0;
int keisei_number=0;
void InitialRand()
{
struct _timeb tstruct;
_ftime(&tstruct);
srand(tstruct.time);
}
double randnum()
{
double g;
g=((rand()%10000)/10000.0)*(1.0-0.0)+0.0 ;
return g;
}
double randnum1()
{
double g;
g=((rand()%10000)/10000.0)*(UP-DOWN)+DOWN;
return g;
}
double randnum2()
{
double g;
g=((rand()%10000)/10000.0)*(1.0+1.0)-1.0 ;
return g;
}
double fant_value(double x[N])
{
int i;
double a,c,sum=0;
a=N*A;
for(i=0;i<N;i++)
{
sum=sum+x[i]*x[i]-A*cos(2*PI*x[i]);
}
c=sum+a;
fvalue_number=fvalue_number+1;
if(fmod(double(fvalue_number),1000.0)==0.0)
{
cout<<fvalue_number<<endl;
}
return c;
}
void local_serch(double a[MAXANT][N],double fa[MAXANT],double n,double t[MAXANT])
{
int i,j;
double fc[MAXANT],c[MAXANT][N],rand1;
for(i=0;i<MAXANT;i++)
{
if(keisei_number<15)
{
for(j=0;j<N;j++)
{
rand1=randnum();
if(rand1<0.5)
{
c[i][j]=a[i][j]+randnum()*(UP-a[i][j])*pow((1-double(n)/double(NCMAX)),1.8);
}
else
{
c[i][j]=a[i][j]-randnum()*(a[i][j]-DOWN)*pow((1-double(n)/double(NCMAX)),1.8);
}
/* if(c[i][j]>UP||c[i][j]<DOWN)
{
c[i][j]=a[i][j];
}*/
}
fc[i]=fant_value(c[i]);
if(fc[i]<fa[i])
{
t[i]=t[i]+GAMA*(fa[i]-fc[i]);
for(j=0;j<N;j++)
{
a[i][j]=c[i][j];
}
fa[i]=fc[i];
keisei_number=0;
}
else
{
keisei_number=keisei_number+1;
}
}
else
{
for(j=0;j<N;j++)
{
a[i][j]=randnum1();
}
fa[i]=fant_value(a[i]);
keisei_number=0;
}
}
}
void bad_order(double fa[MAXANT],int b[NGR])
{
int i,j,ibad=0;
double bad=fa[0];
for(i=0;i<NGR;i++)
{
for(j=1;j<MAXANT;j++)
{
if(fa[j]>bad)
{
bad=fa[j];
ibad=j;
}
}
b[i]=ibad;
// cout<<" **"<<b[i]<<endl;
fa[ibad]=-10;
bad=-10;
}
}
void gr_operate(double a[MAXANT][N],double fa[MAXANT],double t[MAXANT],int b[NGR],int n)
{
int i,j,k,ibest=0;
double alfa,p;
double best[N],fbest=fa[0],fb[MAXANT];
double fvalue,rand1;
for(i=0;i<N;i++)
{
best[i]=a[0][i];
}
for(i=1;i<MAXANT;i++)
{
if(fa[i]<fbest)
{
fbest=fa[i];
ibest=i;
for(j=0;j<N;j++)
{
best[j]=a[i][j];
}
}
}
for(i=0;i<MAXANT;i++)
{
fb[i]=fa[i];
}
// cout<<" ?? "<<fbest<<" ?? "<<ibest<<endl;
bad_order(fb,b);
for(i=0;i<NGR;i++)
{
p=randnum();
alfa=randnum();
k=b[i];
if(p<PGR)
{
for(j=0;j<N;j++)
{
rand1=randnum();
if(rand1<0.5)
{
a[k][j]=a[ibest][j]+randnum()*(UP-a[ibest][j])*pow((1-double(n)/double(NCMAX)),1.8);
}
else
{
a[k][j]=a[ibest][j]-randnum()*(a[ibest][j]-DOWN)*pow((1-double(n)/double(NCMAX)),1.8);
}
/* if(a[k][j]>UP||a[k][j]<DOWN)
{
a[k][j]=a[ibest][j];
}*/
}
fvalue=fa[k];
fa[k]=fant_value(a[k]);
t[k]=t[k]+GAMA*(fvalue-fa[k]);
}
else
{
for(j=0;j<N;j++)
{
a[k][j]=alfa*a[ibest][j]+(1-alfa)*a[k][j];
}
fvalue=fa[k];
fa[k]=fant_value(a[k]);
t[k]=t[k]+GAMA*(fvalue-fa[k]);
}
}
}
int select_xj(double t[MAXANT],int b[NGR])
{
int i,j,k;
double q[MAXANT],aaa=0,rand,p[MAXANT];
double ttt[MAXANT],sum=0;
for(i=0;i<MAXANT;i++)
{
ttt[i]=t[i];
}
for(j=0;j<NGR;j++)
{
k=b[j];
ttt[k]=0.0;
}
for(i=0;i<MAXANT;i++)
{
sum=sum+ttt[i];
}
for(i=0;i<MAXANT;i++)
{
p[i]=ttt[i]/sum;
// cout<<p[i]<<" ";
}
for(k=0;k<MAXANT;k++)
{
aaa=p[k]+aaa;
q[k]=aaa;
// cout<<q[k]<<" ";
}
rand=randnum();
// cout<<endl<<rand<<endl;
for(j=0;j<MAXANT;j++)
{
if(rand<=q[j])
{
return j;
break;
}
}
}
void mr_operate(double a[MAXANT][N],double fa[MAXANT],double t[MAXANT],int b[NGR],int n)
{
int i,j,k,m;
int flag;
double alfa,p,r;
double fvalue,rand1;
for(i=0;i<MAXANT;i++)
{
flag=0;
for(k=0;k<NGR;k++)
{
if(i==b[k])
{
flag=1;
}
}
// cout<<flag<<" ";
if(flag==0)
{
p=randnum();
m=select_xj(t,b);
if(p<PMR)
{
for(j=0;j<N;j++)
{
rand1=randnum();
if(rand1<0.5)
{
a[i][j]=a[m][j]+randnum()*(UP-a[m][j])*pow((1-double(n)/double(NCMAX)),1.8);
}
else
{
a[i][j]=a[m][j]-randnum()*(a[m][j]-DOWN)*pow((1-double(n)/double(NCMAX)),1.8);
}
/* if(a[i][j]>UP||a[i][j]<DOWN)
{
a[i][j]=a[m][j];
}*/
}
fvalue=fa[i];
fa[i]=fant_value(a[i]);
t[i]=t[i]+GAMA*(fvalue-fa[i]);
}
else
{
alfa=randnum();
for(j=0;j<N;j++)
{
a[i][j]=alfa*a[m][j]+(1-alfa)*a[i][j];
}
fvalue=fa[i];
fa[i]=fant_value(a[i]);
t[i]=t[i]+GAMA*(fvalue-fa[i]);
}
}
}
}
void diffuse_operate(double t[MAXANT])
{
int i;
for(i=0;i<MAXANT;i++)
{
t[i]=KESEI*t[i];
}
}
double select_better(double a[MAXANT][N],double fa[MAXANT],double ant[N])
{
int i=0,j;
double fbest=fa[0];
for(i=0;i<N;i++)
{
ant[i]=a[0][i];
}
for(i=1;i<MAXANT;i++)
{
if(fa[i]<fbest)
{
fbest=fa[i];
for(j=0;j<N;j++)
{
ant[j]=a[i][j];
}
}
}
return fbest;
}
void main()
{
int i,j,k,m;
int bb[NGR];
double ant[MAXANT][N],fant[MAXANT],tao[MAXANT];
double pp[MAXANT];
double better_ant[N],better_fant;
double best_ant[N],best_fant=200,kfinal;
InitialRand();
for(i=0;i<MAXANT;i++)
{
for(j=0;j<N;j++)
{
ant[i][j]=randnum1();
}
fant[i]=fant_value(ant[i]);
tao[i]=5;
}
for(k=0;k<NCMAX;k++)
{
local_serch(ant,fant,k,tao);
gr_operate(ant,fant,tao,bb,k);
mr_operate(ant,fant,tao,bb,k);
diffuse_operate(tao);
better_fant=select_better(ant,fant,better_ant);
if(better_fant<best_fant)
{
best_fant=better_fant;
for(i=0;i<N;i++)
{
best_ant[i]=better_ant[i];
}
kfinal=k;
}
}
//cout<<endl;
cout<<best_fant<<" "<<kfinal<<endl;
for(i=0;i<N;i=i+5)
{
cout<<best_ant[i]<<" "<<best_ant[i+1]<<" "<<best_ant[i+2]<<" "
<<best_ant[i+3]<<" "<<best_ant[i+4]<<endl;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -