📄 a two-lane ca model of traffic flow with different maximum speed vehicles.cpp
字号:
//a two-lane CA model of traffic flow with different maximum speed vehicles:
#include "stdafx.h"
#include<iostream>
#include<stdlib.h>
#include <time.h>
#using <mscorlib.dll>
using namespace std;
using namespace System;
int x[2000],i,v[2000],gap1[2000],gap2[2000],V_slow_max,V_fast_max,x1[2000],v1[2000],x2[2000],v2[2000];
float p_slow,p_fast;
int rule_lane1(int l,int m,int V_max,float p_noise);
int rule_lane2(int l,int m,int V_max,float p_noise);
int Max(int a,int b);
int Min(int d,int e);
int _tmain(int argc, _TCHAR* argv[])
{
int L,sum1,sum2,j,k,flag1,flag2,time_steps,lane1[2000],lane2[2000],lane1_temporary[2000],lane2_temporary[2000],q,V_slow_max,V_fast_max;
int gap_lane2_front[2000],gap_lane2_back[2000],v_lane2_back[2000],gap_lane1_front[2000],gap_lane1_back[2000],v_lane1_back[2000];
float p,f,p_slow,p_fast,a,P_out1,P_out2;
cout<<"Please enter the number of sites L: "<<endl;
cin>>L;
cout<<"Please enter the density of cars per site p: "<<endl;
cin>>p;
cout<<"Please enter the ratio coefficient of p2 to p1 a: "<<endl;
cin>>a;
cout<<"Please enter the maximum of velocity of slow vehicle V_slow_max: "<<endl;
cin>>V_slow_max;
cout<<"Please enter the maximum of velocity of fast vehicle V_fast_max: "<<endl;
cin>>V_fast_max;
cout<<"Please enter the stochastic braking probability of slow p_slow: "<<endl;
cin>>p_slow;
cout<<"Please enter the stochastic braking probability of fast p_fast: "<<endl;
cin>>p_fast;
cout<<"Please enter the changing lane probability of lane1 P_out1: "<<endl;
cin>>P_out1;
cout<<"Please enter the changing lane probability of lane2 P_out2: "<<endl;
cin>>P_out2;
cout<<"Please enter the time_steps: "<<endl;
cin>>time_steps;
cout<<"Please enter f: "<<endl;
cin>>f;
srand( (unsigned)time( NULL ) );
for(i=1;i<=L;i++)//产生初始构型
{
lane1[i]=0;
lane2[i]=0;
}
for(i=0;i<Math::Round(L*2*p/(1+a));i++)
{
q=int((float)rand()/(float)RAND_MAX*(L-1)+1);
if(lane1[q]==0)
lane1[q]=5;
else
i=i-1;
} //在1车道随机分布L*2*p/(1+a)辆快车;
for(i=0;i<Math::Round(L*2*a*p/(1+a));i++)
{
q=int((float)rand()/(float)RAND_MAX*(L-1)+1);
if(lane2[q]==0)
lane2[q]=5;
else
i=i-1;
} //在2车道随机分布L*2*a*p/(1+a)辆快车;
sum1=0;
sum2=0;
for(i=1;i<=L;i++)//输出初始构型
{
if(lane1[i]==5)
{
sum1=sum1+1;
x1[sum1]=i;
v1[sum1]=0;
cout<<v1[sum1];
}
else
cout<<".";
}
cout<<endl; //输出t=0时步1车道的构型;
for(i=1;i<=L;i++)
{
if(lane2[i]==5)
{
sum2=sum2+1;
x2[sum2]=i;
v2[sum2]=0;
cout<<v2[sum2];
}
else
cout<<".";
}
cout<<endl; //输出t=0时步2车道的构型;
struct vehicle
{
int lane;
int position;
int velocity;
int type;
}vehicle1[4000]; //声明结构体vehicle类型的同时定义变量vehicle1[4000];
for(i=1;i<=sum1;i++)
{
vehicle1[i].lane=1;
vehicle1[i].position=x1[i];
vehicle1[i].velocity=v1[i];
vehicle1[i].type=5; //type=5表示快车;
}
for(i=sum1+1;i<=sum1+sum2;i++)
{
vehicle1[i].lane=2;
vehicle1[i].position=x2[i-sum1];
vehicle1[i].velocity=v2[i-sum1];
vehicle1[i].type=5;
} //对变量vehicle1[4000]的成员赋初值;
for(i=0;i<Math::Round(2*L*p*f);i++)
{
q=int((float)rand()/(float)RAND_MAX*(sum1+sum2-1)+1);//随机产生从1到sum1+sum2的数;
if(vehicle1[q].lane==1)
{
if(lane1[vehicle1[q].position]==5)
{
vehicle1[q].type=3; //type=3表示慢车;
lane1[vehicle1[q].position]=3;
}
else
i=i-1;
}
else
{
if(lane2[vehicle1[q].position]==5)
{
vehicle1[q].type=3;
lane2[vehicle1[q].position]=3;
}
else
i=i-1;
}
} //随机分布了2*L*p*f辆慢车;
/* for(i=1;i<=L;i++)
{
if(lane1[i]!=0)
cout<<lane1[i];
else
cout<<".";
}
cout<<endl;
for(i=1;i<=L;i++)
{
if(lane2[i]!=0)
cout<<lane2[i];
else
cout<<".";
}
cout<<endl;*/
for( k=1;k<time_steps;k++)
{
cout<<endl;
for(i=1;i<=sum1;i++)
{
if(i==sum1)
gap1[i]=x1[1]-x1[i]-1;
else
gap1[i]=x1[i+1]-x1[i]-1;
if(gap1[i]<0)
gap1[i]=gap1[i]+L;
} //计算1车道的每一辆车与前方紧邻车辆间的空格数gap1[i];
/* for(i=1;i<=sum1;i++)
cout<<"gap1["<<i<<"]="<<gap1[i]<<" ";
cout<<endl;*/
for(i=1;i<=sum1;i++)
{
for(j=1;j<=sum2;j++)
{
if(j==sum2)
x2[j+1]=x2[1];
if((x2[j]>x2[j+1])&&(x2[j+1]>x1[i])) //1车道上第i辆车在2车道上的相应位置靠近2车道的左边界;
{
gap_lane2_front[i]=x2[j+1]-x1[i]-1;
gap_lane2_back[i]=x1[i]-x2[j]-1+L;
v_lane2_back[i]=v2[j];
// cout<<"gap_lane2_front["<<i<<"]="<<gap_lane2_front[i]<<endl;
// cout<<"gap_lane2_back["<<i<<"]="<<gap_lane2_back[i]<<endl;
// cout<<"v_lane2_back["<<i<<"]="<<v_lane2_back[i]<<endl;
}
if((x2[j]>x2[j+1])&&(x2[j]<x1[i])) //1车道上第i辆车在2车道上的相应位置靠近2车道的右边界;
{
gap_lane2_front[i]=x2[j+1]-x1[i]-1+L;
gap_lane2_back[i]=x1[i]-x2[j]-1;
v_lane2_back[i]=v2[j];
// cout<<"gap_lane2_front["<<i<<"]="<<gap_lane2_front[i]<<endl;
// cout<<"gap_lane2_back["<<i<<"]="<<gap_lane2_back[i]<<endl;
// cout<<"v_lane2_back["<<i<<"]="<<v_lane2_back[i]<<endl;
}
if((x2[j]<x1[i])&&(x2[j+1]>x1[i]))
{
gap_lane2_front[i]=x2[j+1]-x1[i]-1;
gap_lane2_back[i]=x1[i]-x2[j]-1;
v_lane2_back[i]=v2[j];
// cout<<"gap_lane2_front["<<i<<"]="<<gap_lane2_front[i]<<endl;
// cout<<"gap_lane2_back["<<i<<"]="<<gap_lane2_back[i]<<endl;
// cout<<"v_lane2_back["<<i<<"]="<<v_lane2_back[i]<<endl;
}
}
}
//分别计算1车道的每一辆车与2车道相应位置前、后方车辆间的空格数gap_lane2_front[i]、
//gap_lane2_back[i]和确定1车道的每一辆车在2车道相应位置后方车辆的速度v_lane2_back[i];
for(i=1;i<=sum2;i++)
{
if(i==sum2)
gap2[i]=x2[1]-x2[i]-1;
else
gap2[i]=x2[i+1]-x2[i]-1;
if(gap2[i]<0)
gap2[i]=gap2[i]+L;
} //计算2车道的每一辆车与前方紧邻车辆间的空格数gap2[i];
/* for(i=1;i<=sum2;i++)
cout<<"gap2["<<i<<"]="<<gap2[i]<<" ";
cout<<endl;*/
for(i=1;i<=sum2;i++)
{
for(j=1;j<=sum1;j++)
{
if(j==sum1)
x1[j+1]=x1[1];
if((x1[j]>x1[j+1])&&(x1[j+1]>x2[i])) //2车道上第i辆车在1车道上的相应位置靠近1车道的左边界;
{
gap_lane1_front[i]=x1[j+1]-x2[i]-1;
gap_lane1_back[i]=x2[i]-x1[j]-1+L;
v_lane1_back[i]=v1[j];
// cout<<"gap_lane1_front["<<i<<"]="<<gap_lane1_front[i]<<endl;
// cout<<"gap_lane1_back["<<i<<"]="<<gap_lane1_back[i]<<endl;
// cout<<"v_lane1_back["<<i<<"]="<<v_lane1_back[i]<<endl;
}
if((x1[j]>x1[j+1])&&(x1[j]<x2[i])) //2车道上第i辆车在1车道上的相应位置靠近1车道的右边界;
{
gap_lane1_front[i]=x1[j+1]-x2[i]-1+L;
gap_lane1_back[i]=x2[i]-x1[j]-1;
v_lane1_back[i]=v1[j];
// cout<<"gap_lane1_front["<<i<<"]="<<gap_lane1_front[i]<<endl;
// cout<<"gap_lane1_back["<<i<<"]="<<gap_lane1_back[i]<<endl;
// cout<<"v_lane1_back["<<i<<"]="<<v_lane1_back[i]<<endl;
}
if((x1[j]<x2[i])&&(x1[j+1]>x2[i]))
{
gap_lane1_front[i]=x1[j+1]-x2[i]-1;
gap_lane1_back[i]=x2[i]-x1[j]-1;
v_lane1_back[i]=v1[j];
// cout<<"gap_lane1_front["<<i<<"]="<<gap_lane1_front[i]<<endl;
// cout<<"gap_lane1_back["<<i<<"]="<<gap_lane1_back[i]<<endl;
// cout<<"v_lane1_back["<<i<<"]="<<v_lane1_back[i]<<endl;
}
}
}
//分别计算2车道的每一辆车与1车道相应位置前、后方车辆间的空格数gap_lane1_front[i]、
//gap_lane1_back[i]和确定2车道的每一辆车在1车道相应位置后方车辆的速度v_lane1_back[i];
for(i=1;i<=sum1;i++)
{
if(v1[i]>gap1[i]) //超车原则;
{
if((gap_lane2_front[i]>=v1[i])&&(gap_lane2_back[i]>=v_lane2_back[i]))//安全原则;
{
if(lane2[x1[i]]==0) //2车道相应位置为空;
{
if((float)rand()/(float)RAND_MAX<P_out1) //以概率P_out1随机转道原则;
vehicle1[i].lane=2; //1车道的车转到2车道上;
}
}
}
}
/* for(i=1;i<=sum1;i++)
cout<<"vehicle1["<<i<<"].lane="<<vehicle1[i].lane<<endl;*/
for(i=1;i<=sum2;i++)
{
if(v2[i]>gap2[i]) //超车原则;
{
if((gap_lane1_front[i]>=v2[i])&&(gap_lane1_back[i]>=v_lane1_back[i]))//安全原则;
{
if(lane1[x2[i]]==0) //1车道相应位置为空;
{
if((float)rand()/(float)RAND_MAX<P_out2) //以概率P_out2随机转道原则;
vehicle1[i+sum1].lane=1; //2车道的车转到1车道上;
}
}
}
} //转道过程;
/* for(i=1;i<=sum2;i++)
cout<<"vehicle1["<<(i+sum1)<<"].lane="<<vehicle1[i+sum1].lane<<endl;*/
for(i=1;i<=L;i++)
{
lane1[i]=0;
lane2[i]=0;
}
sum1=0;
sum2=0;
for(i=1;i<=Math::Round(2*L*p);i++)
{
if(vehicle1[i].lane==1)
{
lane1[vehicle1[i].position]=vehicle1[i].type;
sum1=sum1+1;
v1[sum1]=vehicle1[i].velocity;
x1[sum1]=vehicle1[i].position;
}
else
{
lane2[vehicle1[i].position]=vehicle1[i].type;
sum2=sum2+1;
v2[sum2]=vehicle1[i].velocity;
x2[sum2]=vehicle1[i].position;
}
} //在两个车道上重新对车辆排序;
for(i=1;i<=sum1;i++)
{
if(i==sum1)
gap1[i]=x1[1]-x1[i]-1;
else
gap1[i]=x1[i+1]-x1[i]-1;
if(gap1[i]<0)
gap1[i]=gap1[i]+L;
} //重新计算1车道的每一辆车与前方紧邻车辆间的空格数gap1[i];
for(i=1;i<=sum2;i++)
{
if(i==sum2)
gap2[i]=x2[1]-x2[i]-1;
else
gap2[i]=x2[i+1]-x2[i]-1;
if(gap2[i]<0)
gap2[i]=gap2[i]+L;
} //重新计算2车道的每一辆车与前方紧邻车辆间的空格数gap2[i];
for(i=1;i<=L;i++)
{
lane1_temporary[i]=lane1[i];
lane1[i]=0;
lane2_temporary[i]=lane2[i];
lane2[i]=0;
}
/* for(i=1;i<=L;i++)
{
cout<<"lane1_temporary["<<i<<"]="<<lane1_temporary[i]<<" ";
}
cout<<endl;
for(i=1;i<=L;i++)
{
cout<<"lane2_temporary["<<i<<"]="<<lane2_temporary[i]<<" ";
}
cout<<endl;
*/
for(i=1;i<=sum1;i++)
{
if(lane1_temporary[x1[i]]==3)
{
rule_lane1(v1[i],gap1[i],V_slow_max,p_slow);
if((x1[i]+v1[i])>L)
x1[i]=x1[i]+v1[i]-L;
else
x1[i]=x1[i]+v1[i];
lane1[x1[i]]=3;
}
else
{
rule_lane1(v1[i],gap1[i],V_fast_max,p_fast);
if((x1[i]+v1[i])>L)
x1[i]=x1[i]+v1[i]-L;
else
x1[i]=x1[i]+v1[i];
lane1[x1[i]]=5;
}
}
/* for(i=1;i<=sum1;i++)
{
cout<<"v1["<<i<<"]="<<v1[i]<<" ";
}
cout<<endl;
for(i=1;i<=sum1;i++)
{
cout<<"x1["<<i<<"]="<<x1[i]<<" ";
}
cout<<endl;*/
for(i=1;i<=sum2;i++)
{
if(lane2_temporary[x2[i]]==3)
{
rule_lane2(v2[i],gap2[i],V_slow_max,p_slow);
if((x2[i]+v2[i])>L)
x2[i]=x2[i]+v2[i]-L;
else
x2[i]=x2[i]+v2[i];
lane2[x2[i]]=3;
}
else
{
rule_lane2(v2[i],gap2[i],V_fast_max,p_fast);
if((x2[i]+v2[i])>L)
x2[i]=x2[i]+v2[i]-L;
else
x2[i]=x2[i]+v2[i];
lane2[x2[i]]=5;
}
} //按规则进行速度和位置的并行更新;
/* for(i=1;i<=sum2;i++)
{
cout<<"v2["<<i<<"]="<<v2[i]<<" ";
}
cout<<endl;
for(i=1;i<=sum2;i++)
{
cout<<"x2["<<i<<"]="<<x2[i]<<" ";
}
cout<<endl;*/
for(j=1;j<=L;j++)
{
flag1=0;
for(i=1;i<=sum1;i++)
{
if(j==x1[i])
{
cout<<v1[i];
flag1=1;
}
}
if(flag1==0)
cout<<".";
}
cout<<endl;
for(j=1;j<=L;j++)
{
flag2=0;
for(i=1;i<=sum2;i++)
{
if(j==x2[i])
{
cout<<v2[i];
flag2=1;
}
}
if(flag2==0)
cout<<".";
}
cout<<endl; //输出t时步的构型;
for(i=1;i<=sum1;i++)
{
vehicle1[i].lane=1;
vehicle1[i].position=x1[i];
vehicle1[i].velocity=v1[i];
vehicle1[i].type=lane1[x1[i]];
}
for(i=sum1+1;i<=(sum1+sum2);i++)
{
vehicle1[i].lane=2;
vehicle1[i].position=x2[i-sum1];
vehicle1[i].velocity=v2[i-sum1];
vehicle1[i].type=lane2[x2[i-sum1]];
} //更新变量vehicle1[i];*/
/* for(i=1;i<=(sum1+sum2);i++)
{
cout<<"vehicle1["<<i<<"].velocity="<<vehicle1[i].velocity<<" ";
}
cout<<endl;
for(i=1;i<=(sum1+sum2);i++)
{
cout<<"vehicle1["<<i<<"].position="<<vehicle1[i].position<<" ";
}
cout<<endl;*/
}
return 0;
}
int rule_lane1(int l,int m,int V_max,float p_noise)//p_noise刹车概率
{
l=Min((l+1),V_max);
l=Min(l,m);
if((float)(rand())/(float)(RAND_MAX)<p_noise)
l=Max((l-1),0);
v1[i]=l;
return v1[i];
}
int rule_lane2(int l,int m,int V_max,float p_noise)//p_noise刹车概率
{
l=Min((l+1),V_max);
l=Min(l,m);
if((float)(rand())/(float)(RAND_MAX)<p_noise)
l=Max((l-1),0);
v2[i]=l;
return v2[i];
}
int Max(int a,int b)
{
int c;
c=a>b?a:b;
return c;
}
int Min(int d,int e)
{
int f;
f=d<e?d:e;
return f;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -