元胞自动机NS交通流模型C语言仿真版

/* 元胞自动机的NS交通流模型
简要说明:将7.5km的道路离散为1000个7.米长的格子,每个格子或为空或为车辆占据,车辆的速度v为0~Vmax之间的值,
每辆车遵循同一规则运动,即:1、加速min(v+1,Vmax);2、减速max(与前一辆车的距离,v);3、以概率p,v=v-1;
4、车辆位置更行 x(t+1)=x(t)+v(t+1)。仿真采用周期性边界,即头围相接形成一个环路。仿真得到不同车辆密度
下的车流平均速度。
*/

#include
#include
#include
#include
#include

#define Lane 1000
#define TBEGIN 2000
#define T 3000
#define Vmax 5
#define P 0.5


void initcars(int );
void move();
float caculate(int );
int FindFront(int ,int );

int cars[T][Lane]; //定义数组

void main()
{
int i,j;
float v;
srand(time(NULL));
for(i=10;i<=1000;i+=10) //不同车辆数目
{
initcars(i);
move();
v=caculate(i);
//printf("车辆数为%d时的平均速度为:%.2f\n",i,v);
}
}

//初始化道路车辆
void initcars(int n)
{
int i,j,location,speed;

for(i=0;ifor(j=0;jcars[i][j]=-1;

//赋初值
for(i=0;i{
location=rand()%1000;
if( cars[0][location] ==-1)
{
cars[0][location]=rand()%(Vmax+1);
}
else
i--;
}
//debug
/*for(j=0;jif( cars[0][j] >=0 )
printf("%d %d\n",j,cars[0][j]);*/
}

//车辆运动
void move()
{
int i=0,j,x,v,gap;

for(i=0;ifor(j=0;j{
if( cars[i][j] >= 0 )
{
v=cars[i][j];
gap=FindFront(i,j); //与前车距离
//printf("weizhi: %d sudu:%d gap:%d\n",j,cars[i][j],gap);
//速度更新
if( (v+1) <= Vmax)
v++;
if( v > gap )
v = gap;
if( v>0 && ( rand()%100 <= P*100 ) )
v--;

//位置更新
x=v+j;
x=x%1000;
//printf("\n%d %d\n",x,v);
if( cars[i+1][x] == -1 )
{
cars[i+1][x]=v;
}
else
{
printf("撞车啦,第%d秒,第%d格\n",i,j);
exit(1);
}

}

}
}

//计算与前车距离
int FindFront(int i,int j)
{
int front=0;
while( cars[i][(++j)%1000] == -1 )
{
front++;
}
return front;
}

//计算、记录平均速度
float caculate(int n)
{
long s=0,i,j;
float v=0;

for(i=TBEGIN;ifor(j=0;j{
if( cars[i][j] >= 0 )
{
s+=cars[i][j];
//printf("%d %d\n",j,cars[2999][j]);
}

}
//计算平均速度
v=(float)s/n/(T-TBEGIN);

//记录数据
FILE *fp;
if( ( fp = fopen("记录.txt","ab") ) == NULL )
{
printf("error");
exit(2);
}
else
{
fprintf(fp,"密度:%3d 速度%.2f ",n,v);
char line[] = "\r\n";
fwrite(line, strlen(line), 1, fp);
}
fclose(fp);

return v;

}

相关文档
最新文档