毕业设计思路篇(五)之交通流量模拟
runSimulation(Graph &G)
1. 遍历每条道路
2. 遍历该道路的车辆
a. 计算特定时间间隔后的位置
b. 若应行驶至其他道路
进入对应的路口缓冲区,根据路口类的红绿灯对象判断是否能通行。
若能通行,则填至目标道路
若不能,则继续停留在路口缓冲区
c. 若仍停留在原道路
改变该车在当前道路的位置。
for (auto &road:G.m_Road_v) {
auto src = road.m_queVehicle;
decltype(road.m_queVehicle) obj;
//路内车的遍历
while (!src.empty()) {
//弹出一辆车
auto it = src.front();
src.pop_front();
// 当车的时间戳小于实际时间时,才模拟运行
if (it.time < SYSTEM_TIME) {
it.fSpec = (100 - road.get_Congestion() - 20) / 3.6;
dist = it.dDistance + it.fSpec * 10;
it.time++;
it.showself();
//如果车十秒后不在此路
if (dist >= road.m_dLength) {
//路径擦除
auto route = it.queRoute;
int site = it.m_nSiteRoadID;
route.pop();
//如果抵达终点
if (route.empty()) {
cout << "it is be shutdown" << endl;
exit(0);
// 否侧没有抵达终点
} else {
//获取所在路和下一条路的ID
int next = route.front();
//判断红绿灯情况
cout << site << endl;
G.m_CrossRoad_v[site].m_CTrafficLight_Light.clock(SYSTEM_TIME);
//如果可以通行
if (G.m_CrossRoad_v[site].m_CTrafficLight_Light.getStatus(it.m_nSiteRoadID, next)) {
cout << GREEN << "绿灯通行:" << endl;
it.queRoute = route;
it.dDistance = 0;
it.m_nSiteRoadID = next;
auto *site_road = &G.m_Road_v[next].m_queVehicle;
site_road->push_back(it);
//如果不能通行
} else {
//将距离置为道路长度,表示正在等候红灯
it.dDistance = G.m_Road_v[it.m_nSiteRoadID].m_dLength;
cout << YELLOW << "等待红灯" << endl;
//车辆塞回去
obj.push_back(it);
}
}
//否则,当车十秒后还在此路时
} else {
it.dDistance = dist;
obj.push_back(it);
}
//否则直接填入
} else {
obj.push_back(it);
}
}
road.m_queVehicle = obj;
}
版权声明: (https://www.thinkmoon.cn/post/145)
本文首发于指尖魔法屋-毕业设计思路篇(五)之交通流量模拟
转载或引用必须申明原指尖魔法屋来源及源地址!