📄 15km.cpp
字号:
//#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 + -