毕业设计思路篇(五)之交通流量模拟


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://blog.thinkmoon.cn/post/145_%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1%E6%80%9D%E8%B7%AF%E7%AF%87_%E4%BA%94_%E4%B9%8B%E4%BA%A4%E9%80%9A%E6%B5%81%E9%87%8F%E6%A8%A1%E6%8B%9F/) 转载或引用必须申明原指尖魔法屋来源及源地址!