⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 a two-lane ca model of traffic flow with different maximum speed vehicles.cpp

📁 用于交通流研究的程序
💻 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 + -