用元胞自动机研究蚂蚁行走的有关问题
用元胞自动机研究蚂蚁行走的有关问题
基本思想:蚂蚁行走时,会沿路分泌费洛蒙,构成一条气味走廊.如果这条气味走廊隔一段时间都没有蚂蚁行走,费洛蒙就会慢慢蒸发掉.
ξi +1(t ) =0⎧Q 本文模型: (0)、确定随机件速概率: p=⎨ q ξ(t ) =1⎩i +1
(1)、确定性加速: v i (t +1/3) ←m i v n i (t () +1, V m a ) x
(2)、确定性减速: v i (t +2/3) ←min(v i (t +1/3), gap i (t ))
(3)、随机减速:v i (t +1) ←max(v i (t +2/3) -1, 0) 以概率p
(4)、位置更新: X i (t +1) ←X i (t ) +v i (t +1)
其中: g a i p (t ) =X i +1(t ) -X i (t ) -1
(5)、费洛蒙的产生:if(S i (t +1) =1) then ξi (t +1) =1;
(6)、费洛蒙的蒸发:if(S i (t +1) =0&&ξi (t ) =1)
⎧0以概率g ξi (t +1) =⎨ ⎧⎨⎩1⎩以概率1-g
模拟程序中的参数可自行调节:
其中;V max =1不可调节
P3的值一般较小,因为费洛蒙可以保存较长的时间.
P3: 0 0.0005 0.005 0.05 0.5 1
观察到奇异现象请仔细研究.随时在网上讨论交流.模拟程序是用NaSch 模型做的,也可以改成Noise-First 模型, 或SDNS 模型, 但在更改的过程中请注意一下, 不是简单的交换一下次序. 如果你能在这方面做些解析工作就更好.
模拟程序:
/////////////////////////////////////基本图//////////////////////////////////////////////
#include
#include
#include
#include
#define L 1000
#define Vmax 1
#define P3 0.05
#define P1 0.25
#define P2 0.75
inline int max(int x,int y)
{
int z;
z=x>y?x:y;
return z;
}
inline int min(int x,int y)
{
int z;
z=x
return z;
}
void sort(int array[],int n)
{
int i,j,k,t;
for(i=0;i
{
k=i;
for(j=i+1;j
if(array[j]
t=array[k];
array[k]=array[i];
array[i]=t;
}
}
inline int gap(int u,int w)
{
int z;
z=(w-u-1+L)%L;
return z;
}
void rules(int u[],int w[],bool flag[],bool loop[],int k)
{
int i,d;
float p,P0,g;
int a[L],c[L];
for(i=0;i
{
if(loop[(u[i]+1)%L]==1) P0=P1;
else P0=P2;
d=gap(u[i],u[(i+1)%k]);
c[i]=min(w[i]+1,Vmax);
c[i]=min(c[i],d);
p=(float)rand()/(RAND_MAX);
if(p
a[i]=(u[i]+c[i])%L;
}
for(i=0;i
{
u[i]=a[i];
w[i]=c[i];
}
for(i=0;i
for(i=0;i
{
flag[u[i]]=1;
loop[u[i]]=1;
}
for(i=0;i
{
if(flag[i]==0&&loop[i]==1)
{
g=(float)rand()/(RAND_MAX);
if(g
}
}
}
void main()
{
int i,n,rando;
int x[L],v[L],tim;
double r,flow;
bool S[L],B[L];
srand(time(NULL));
for(r=0.00;r
{
flow=0.00;
n=int(r*L);
for(i=0;i
{
S[i]=0;
B[i]=0;
}
for(i=0;i
{
x[i]=0;
v[i]=0;
}
rando=rand()%L;
x[0]=rando;
S[rando]=1;
B[rando]=1;
for(i=1;i
{
rando=rand()%L;
x[i]=rando;
S[rando]=1;
B[rando]=1;
for(int j=0;j
if(x[i]==x[j]) i--;
}
sort(x,n);
for(tim=0;tim
for(tim=0;tim
{
rules(x,v,S,B,n);
for(i=0;i
flow=flow+double(v[i])/(1000*L);
}
cout
ofstream file2("d:\\flux_P3=0.05.txt",0x04,0);
file2
file2.close();
}
cout
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////速度――密度图///////////////////////////////////////////////////////// #include
#include
#include
#include
#define L 1000
#define Vmax 1
#define P3 0.05
#define P1 0.25
#define P2 0.75
inline int max(int x,int y)
{
int z;
z=x>y?x:y;
return z;
}
inline int min(int x,int y)
{
int z;
z=x
return z;
}
void sort(int array[],int n)
{
int i,j,k,t;
for(i=0;i
{
k=i;
for(j=i+1;j
if(array[j]
t=array[k];
array[k]=array[i];
array[i]=t;
}
}
inline int gap(int u,int w)
{
int z;
z=(w-u-1+L)%L;
return z;
}
void rules(int u[],int w[],bool flag[],bool loop[],int k)
{
int i,d;
float p,P0,g;
int a[L],c[L];
for(i=0;i
{
if(loop[(u[i]+1)%L]==1) P0=P1;
else P0=P2;
d=gap(u[i],u[(i+1)%k]);
c[i]=min(w[i]+1,Vmax);
c[i]=min(c[i],d);
p=(float)rand()/(RAND_MAX);
if(p
a[i]=(u[i]+c[i])%L;
}
for(i=0;i
{
u[i]=a[i];
w[i]=c[i];
}
for(i=0;i
for(i=0;i
{
flag[u[i]]=1;
loop[u[i]]=1;
}
for(i=0;i
{
if(flag[i]==0&&loop[i]==1)
{
g=(float)rand()/(RAND_MAX);
if(g
}
}
}
void main()
{
int i,n,rando;
int x[L],v[L],tim;
double r,velo;
bool S[L],B[L];
srand(time(NULL));
for(r=0.01;r
{
velo=0.00;
n=int(r*L);
for(i=0;i
{
S[i]=0;
B[i]=0;
}
for(i=0;i
{
x[i]=0;
v[i]=0;
}
rando=rand()%L;
x[0]=rando;
S[rando]=1;
B[rando]=1;
for(i=1;i
{
rando=rand()%L;
x[i]=rando;
S[rando]=1;
B[rando]=1;
for(int j=0;j
if(x[i]==x[j]) i--;
}
sort(x,n);
for(tim=0;tim
for(tim=0;tim
{
rules(x,v,S,B,n);
for(i=0;i
velo=velo+double(v[i])/(1000*n);
}
cout
ofstream file2("d:\\velo_P3=0.05.txt",0x04,0);
file2
file2.close();
}
cout
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////