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

📄 15km.cpp

📁 模拟具有环形岛的十字路口的交通流
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//#include <iostream.h>
#include <iostream>
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <math.h> 
using namespace std;
# define chang 500
# define che 0.8
//simulation in seconds 
//声明:所有的数组的第一位都赋为零,数据从第一个变量开始存,相应的不等号改为等号
//Assumed that the flow of traffic to meet the Poisson distribution
float roadfenbu();       
//According to parameters of the forward direction of vehicle
int roadfangxiang(float x,float y);    // +2 或 +3 直行或绕行  x为直行的概率,y为左转的概率
//Cars into taffic circle
void minus(int *a,int num); //删除数组a的第1个变量
//   the car in Traffic circle with the right of priority
int look1zhixing(float *a,int num);//在一路口观测直行道路看是否有车,是否可以调用主函数里的数组,若无车返回1 (直行数字,直行车的数量)
int insert1zhixing(float *a,int num);// 插入直行数组,直行数组现在车的数量
//在数组的某一位置(position)插入number
void insert(int* a,int p,int number,int num);//num 现在的总数,bool的,表示来向的
//环形车道内浮数数组
int look1left(float* a,int num);
int insert1left(float* a,int num);//1号路口插入左车道
int look2zhixing(float* a,int num);
int look2left(float* a,int num);
int insert2zhixing(float* a,int num);
int insert2left(float* a,int num);

int look3zhixing(float* a,int num);
int look3left(float* a,int num);
int insert3zhixing(float* a,int num);
int insert3left(float* a,int num);

int look4zhixing(float* a,int num);
int look4left(float* a,int num);
int insert4zhixing(float* a,int num);
int insert4left(float* a,int num);

void rebuild(float* a,int num,int* com,int* out);
void leave(float* a,int* zleave,int num,int leavenum,int* com,int *out);
void reset(int* a);
//时间分细
//左转车道在直行的里面
void main()
{
 
	srand(time(0));
    int count=0;   //车的总量
	//参量
	float speed=12; //速度 m/s 每小时40公里-25公里 不能一秒超过30度
	float lenthofcar;//车长,以角度表示
	float tt=1;//时间间隔
	float radius=0; //半径 speed*radius=线速度
	int roadone[chang];
	int road1=0;
	float ju1=che; // (1-ju1)*3600 the number of vehicles per hour through

	int roadtwo[chang];
	int road2=0;
	float ju2=che;
	int roadthree[chang];
	int road3=0;
	float ju3=che;

	int roadfour[chang];
	int road4=0;
	float ju4=che;

	float zhixing[chang]; //存放的是直行道上的位置 
	int zhixingcome[chang];//来自于哪个车道
	int zhixingnum=0;  //直行道上车的数量
	int zhixingout[chang];//直行的目的地
	int zhixingleavenum=0;//直行道上将要离开的车的数量
	int zhixingleave[chang];//标记将要离开的车

	float left[chang]; //存放左转道上的车的数量 
    int leftcome[chang];//来自哪个车道
	int leftnum=0;
	int leftout[chang];//往哪里去
	int leftleavenum;
    int leftleave[chang];
//1--499

	int time=3600; //总时间
	float judgement=0;
    //所有数组续清零
	for (int qingling=0;qingling<chang;qingling++)
	{
		roadone[qingling]=0;roadtwo[qingling]=0;roadthree[qingling]=0;roadfour[qingling]=0;//道路
		zhixing[qingling]=0;zhixingcome[qingling]=0;zhixingout[qingling]=0;zhixingleave[qingling]=0;
		leftcome[qingling]=0;left[qingling]=0;leftout[qingling]=0;leftleave[qingling]=0;
	}
    //总时间
	//时间步进
	for(int t=0;t<time;t++)
	{
		zhixingleavenum=0;
		leftleavenum=0;
		reset(zhixingleave);
		reset(leftleave);
		//直行,leave数组清零
		//各条道路汽车排队等候,环上的车具有优先权
		//一号车排队,给定方向
        judgement=roadfenbu();
		float a=0.3; //直行所占的比例
		float b=0.3; //绕行所占的比例
		int dir=0; // dir方向
		if(judgement>=ju1)
		{
            dir=roadfangxiang(a,b);
			if(dir!=1)
			{
				road1++;
			    roadone[road1]=1+dir; //第一辆车排在1位
			}

			count++;
		}
		//二号车排队
		judgement=roadfenbu();
		if(judgement>=ju2)
		{
			dir=roadfangxiang(a,b);
			if(dir!=1)
			{
			   road2++;
			   roadtwo[road2]=(2+dir);
			   if(roadtwo[road2]>4)
			   {
				   roadtwo[road2]=roadtwo[road2]-4;
			   }
			}
			count++;
		}
		judgement=roadfenbu();
		if(judgement>=ju3)
		{
			dir=roadfangxiang(a,b);
			if(dir!=1)
			{
		    	road3++;
			    roadthree[road3]=(3+dir)%4;
			}
			count++;
		}
		judgement=roadfenbu();
		if(judgement>=ju4)
		{
			dir=roadfangxiang(a,b);
			if(dir!=1)

			{
			 road4++;
		   	 roadfour[road4]=dir;
			}
			count++;
		}
		//进入环道
		int position=0;
		if(road1)
		{
			int t1=0;
           //先看绕行再看直行,否则直行,不得通过
			 if(roadone[1]==4) //绕行 
			 {
				 if(look1zhixing(zhixing,zhixingnum) && look1left(left,leftnum))
					 {
						position=insert1left(left,leftnum);
					   	insert(leftcome,position,1,leftnum);
				  	    insert(leftout,position,4,leftnum);
					    leftnum++;
                        //去掉1路中的车,当前roadone 中的车辆
	//					minus(roadone,road1);
	//				    road1--;
						t1=1;
					 }
			 }
			  if(roadone[1]==3) //直行
			 {
				 if(look1zhixing(zhixing,zhixingnum)) //没车
				 {    
					 position=insert1zhixing(zhixing,zhixingnum);//insert 插入数30 返回在zhixing中的位置
					 insert(zhixingcome,position,1,zhixingnum);
				  	 insert(zhixingout,position,3,zhixingnum);
					 zhixingnum++;
					 //去掉1路中的车,当前roadone 中的车辆
	//					minus(roadone,road1);
	//				    road1--;
					 t1=1;
				}
			 }
			 if(t1)
			 {
                    minus(roadone,road1);
				    road1--;
			 }
					 
					 
		}
		if(road2)
		{
			int t2=0;
			//绕行
			if(roadtwo[1]==1)
			{
				if(look2zhixing(zhixing,zhixingnum) && look2left(left,leftnum))
				{
					position=insert2left(left,leftnum);
					insert(leftcome,position,2,leftnum);
					insert(leftout,position,1,leftnum);
					leftnum++;
					//minus 的整型参数具有特殊性
		//	        minus(roadtwo,road2); //
		  //      	road2--;
					t2=1;
				}
			}
			//直行
			if(roadtwo[1]==4)
			{   
				if(look2zhixing(zhixing,zhixingnum))
				{
					position=insert2zhixing(zhixing,zhixingnum);
					insert(zhixingcome,position,2,zhixingnum);
					insert(zhixingout,position,4,zhixingnum);
					zhixingnum++;
					//minus 的整型参数具有特殊性
//		        	minus(roadtwo,road2); //
//			        road2--;
					t2=1;
				}
			}
			if(t2)
			{
                minus(roadtwo,road2); //
		        road2--;
			}
		}
		if(road3)
		{	
			int t3=0;
			//绕行
			if(roadthree[1]==2)
			{
				if(look3zhixing(zhixing,zhixingnum) && look3left(left,leftnum))
				{
					position=insert3left(left,leftnum);
					insert(leftcome,position,3,leftnum);
					insert(leftout,position,2,leftnum);
					leftnum++;
					
//			        minus(roadthree,road3);
//		        	road3--;
					t3=1;
				}
			}
			//直行
			if(roadthree[1]==1)
			{
				if(look3zhixing(zhixing,zhixingnum))
				{
					position=insert3zhixing(zhixing,zhixingnum);
					insert(zhixingcome,position,3,zhixingnum);
					insert(zhixingout,position,1,zhixingnum);
					zhixingnum++;

//					minus(roadthree,road3);
//		        	road3--;
					t3=1;
				}
			}
			if(t3)
			{
				minus(roadthree,road3);
                road3--;
			}
		
		}
		if(road4)
		{
			int t4=0;
			//绕行
			if(roadfour[1]==3)
			{
				if(look4zhixing(zhixing,zhixingnum) && look4left(left,leftnum))
				{
					position=insert4left(left,leftnum);
					insert(leftcome,position,1,leftnum);
					insert(leftout,position,3,leftnum);
					leftnum++;

//					minus(roadfour,road4);
//				    road4--;
					t4=1;
				}
				
			}
			//直行
			if(roadfour[1]==2)
			{
				if(look4zhixing(zhixing,zhixingnum))
				{
					position=insert4zhixing(zhixing,zhixingnum);
					insert(zhixingcome,position,3,zhixingnum);
					insert(zhixingout,position,1,zhixingnum);
					zhixingnum++;

	//				minus(roadfour,road4);
	//			    road4--;
					t4=1;
				}
			}
			if(t4)
			{
			    	minus(roadfour,road4);
				    road4--;
			}
		}
		//各个路口的车已经进入环道,环道步进
		int i=0;
		for( i=1;i<=zhixingnum;i++)
		{
			zhixing[i]+=speed*tt;
			//超过360度的取模
//			if(zhixing[i]>=360)
//				zhixing[i]-=360;
//			rebuild(zhixing,zhixingnum,zhixingcome,zhixingout);  //待检验
		}
		rebuild(zhixing,zhixingnum,zhixingcome,zhixingout);
		int j=0;
		for(j=1;j<=leftnum;j++)
		{
			left[j]+=speed*tt;
//			if(left[i]>=360)
//				left[i]-=360;
//			rebuild(left,leftnum,leftcome,leftout);
		}
		rebuild(left,leftnum,leftcome,leftout);
        //离开环道,间隔为90度
		for(i=1;i<=zhixingnum;i++)
		{
//			if(zhixingcome[i]==1 && zhixingout[i]==3 && 150<=zhixing[i] && zhixing[i]<=180) 
			if(zhixingcome[i]==1 && zhixingout[i]==3 && 150<=zhixing[i] ) 
			{
				zhixingleave[i]=1;
				zhixingleavenum++;
				cout<<"1-3-z"<<endl;
			}
//			if(zhixingcome[i]==2 && zhixingout[i]==4 && 240<=zhixing[i] && zhixing[i]<=270)
			if(zhixingcome[i]==2 && zhixingout[i]==4 && 240<=zhixing[i])
			{
				zhixingleave[i]=1;
				zhixingleavenum++;
				cout<<"2-4-z"<<endl;
			}
//			if(zhixingcome[i]==3 && zhixingout[i]==1 && 330<=zhixing[i] && zhixing[i]<=360)
			if((zhixingcome[i]==3 && zhixingout[i]==1) && (330<=zhixing[i] || zhixing[i]<=100))
			{
				zhixingleave[i]=1;
				zhixingleavenum++;
				cout<<"3-1-z"<<endl;
			}
//			if(zhixingcome[i]==4 && zhixingout[i]==2 &&  60<=zhixing[i] && zhixing[i]<=90)
			if(zhixingcome[i]==4 && zhixingout[i]==2 &&  60<=zhixing[i] && zhixing[i]<=150)
			{
				zhixingleave[i]=1;
				zhixingleavenum++;
				cout<<"4-2-z"<<endl;
			}
		}
		for(j=1;j<=leftnum;j++)
		{
//			if(leftcome[j]==1 && leftout[j]==4 && 240<=left[i] && left[i]<=270)
			if(leftcome[j]==1 && leftout[j]==4 && 240<=left[j] && left[j]<=330)
			{
				leftleave[j]=1;
			    leftleavenum++;
				cout<<"1-4-l"<<endl;
			}
//			if(leftcome[j]==2 && leftout[j]==1 && 330<=left[j] && left[j]<=360)
			if((leftcome[j]==2 && leftout[j]==1) && (330<=left[j] || left[j]<=90))
			{
				leftleave[j]=1;
				leftleavenum++;
				cout<<"2-1-l"<<endl;
			}
//			if(leftcome[j]==3 && leftout[j]==2 &&  60<=left[j] && left[j]<=90)
			if(leftcome[j]==3 && leftout[j]==2 &&  60<=left[j] && left[j]<=160)
			{
				leftleave[j]=1;
				leftleavenum++;
				cout<<"3-2-l"<<endl;
			}
//			if(leftcome[j]==4 && leftout[j]==3 && 150<=left[j] && left[j]<=180)
			if(leftcome[j]==4 && leftout[j]==3 && 150<=left[j] && left[j]<=240)
			{
				leftleave[j]=1;
				leftleavenum++;
				cout<<"4-3-l"<<endl;
			}
		}
		//删除环上的车
        leave(zhixing,zhixingleave,zhixingnum,zhixingleavenum,zhixingcome,zhixingout);
		leave(left,leftleave,leftnum,leftleavenum,leftcome,leftout);
		//重中之中
		zhixingnum=zhixingnum-zhixingleavenum;
		leftnum=leftnum-leftleavenum;
	}
	cout<<"车的总数"<<endl;
	cout<<count<<endl;
	cout<<"依次四个路口正在等待的车辆"<<endl;
	cout<<road1<<endl;
	cout<<road2<<endl;
    cout<<road3<<endl;
	cout<<road4<<endl;
    cout<<"第二环道直行环道上的车辆数目"<<endl;
	cout<<zhixingnum<<endl;
	cout<<"第一环道左行环道上的车辆位置"<<endl;
	cout<<leftnum<<endl;
  	cout<<"通过的数"<<endl;
	cout<<(count-road1-road2-road3-road4-leftnum-zhixingnum)<<endl;
	cout<<"第二环道直行环道上的车辆位置"<<endl;
	int w=0;
	for( w=0;w<(chang-470);w++)
	{
	//	if(zhixing[w])
		{
			cout<<zhixing[w]<<' ';
		}
	}
	cout<<endl;
	cout<<"第一环道左行环道上的车辆位置"<<endl;
	for(w=0;w<(chang-470);w++)
	{
  //		if(left[w])
		{
			cout<<left[w]<<' ';
		}
	}
	cout<<endl;
	cout<<"第一车道上车的目的地"<<endl;
	for(w=0;w<(chang-470);w++)
	{
  //		if(left[w])
		{
			cout<<roadone[w]<<' ';
		}
	}
	cout<<endl;
	cout<<"第2车道上车的目的地"<<endl;
	for(w=0;w<(chang-470);w++)
	{
  //		if(left[w])
		{
			cout<<roadtwo[w]<<' ';
		}
	}
	cout<<endl;
	cout<<"第3车道上车的目的地"<<endl;
		for(w=0;w<(chang-470);w++)
	{
  //		if(left[w])
		{
			cout<<roadthree[w]<<' ';
		}
	}
		cout<<endl;
	cout<<"第4车道上车的目的地"<<endl;
		for(w=0;w<(chang-470);w++)
	{
  //		if(left[w])
		{
			cout<<roadfour[w]<<' ';
		}
	}
		getchar();
//    cout<<endl<<leftnum;
}
//the probability of car in second
float roadfenbu()         //    泊松分布    
 {
	 float t=((float)(rand()%10000))/10000;
	 return t;
 }
 //如何选择方向
 int roadfangxiang(float x,float y)
 {
	 float seed=((float)(rand()%10000))/10000;
	 if(seed<=x)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -