毕业设计汇总篇

2019-02-12 12-19-50屏幕截图.png

仿真跑起来之前,得先把「路在哪、灯怎么配、车走哪条路、什么时候动」这几件事拆开写清楚,不然改一处牵全身。

这篇是毕业设计交通网络仿真系列的汇总导航。当时主程序用 C++ 写,道路数据来自网络地图预处理后的 XML,仿真侧自己抽象成图(路口作节点、道路作有向边),再叠红绿灯、车辆生成和按时间步推进的主循环。下面按实际开发顺序列链接,每篇只盯一个模块,方便单独改逻辑而不把整坨代码翻个底朝天。

技术栈与整体流程

  • 语言 / 运行时:C++,标准库里的 vectorqueueifstream 用得比较多
  • 地图输入:XML 道路文件,每条 road 带长度和两端路口坐标
  • 核心结构Graph 里存 CrossRoad(路口)和 Road(道路),路口上挂 TrafficLight 和方向节点 JunctionRoad
  • 离线预处理:番外篇用 Dijkstra 算全点对最短路径,结果落成 route.txt 一类文本,主流程启动时 loadRoute 读进来
  • 在线仿真generateVehicle 往路上塞车,runSimulation 按时间片更新位置,到路口问灯能不能过

主流程可以粗想成一条链:构图 → 初始化灯 → 预加载路线 → 生成车辆 → 跑模拟。路径计算不每次运行都做,所以单独放在番外篇。

思路篇

思路篇主要记录程序流程思路,按依赖顺序写,后一篇默认前一篇的数据结构已经就绪。

篇目解决什么问题
思路篇(一) 交通图的构建解析 XML,addRoad 去重路口、双向建边,给每个路口记方向节点
思路篇(二) 交通灯的初始化按路口岔路条数区分 T 字 / 十字,roadIDJunctionRoad 对齐
思路篇(三) 预加载车辆路线route.txt 读入道路编号序列,放进 v_Route 供发车用
思路篇(四) 生成车辆选路线、定起点,把车挂到对应道路的 m_queVehicle
思路篇(五) 交通流量模拟时间步内更新车速与位移,到路口查灯,能过则换路,不能则排队

毕业设计思路篇(一)之道路数据的抽象

把外部道路 XML 落成内存里的图,是后面一切逻辑的地基。路口重合判断、atan2 定方向这些细节都在这篇。

毕业设计思路篇(二)之交通灯的初始化

图有了之后,每个路口要配一盏灯。T 字和十字的相位不一样,这篇讲的是 setTyperoadID 怎么从 JunctionRoad 填进去。

毕业设计思路篇(三)之预加载车辆路线

仿真不现场算路,启动前把合法道路序列读进 vector<queue<int>>。路线从哪来?看番外篇。

毕业设计思路篇(四)之生成车辆

v_Route 里挑一条,以队首道路 ID 为起点构造 Vehicle,推进道路的等待队列。

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

主循环:runSimulation 遍历道路和车上的时间戳,算拥堵修正后的速度,到路口调 getStatus 决定通行或等红灯。

番外篇

番外篇主要记录非主流程、不必每次运行都跑的模块(预处理、离线算路等)。可以单独维护,改算法也不动仿真主循环。

毕业设计番外篇(一)之车辆路径的构建

对所有路口跑 Dijkstra,把路口链和道路链写到 PointPath.txtRoadPath.txt,再整理成思路篇(三)要读的 route.txt。当时也想过 Floyd,但单源多次 Dijkstra 对当时的数据规模够用了。


如果从零跟这套设计,建议按上表顺序读;只想改某一环(比如只动红绿灯相位),直接点对应篇目即可。汇总篇本身不贴大段代码,实现细节都在各子篇里。

版权声明: 本文首发于 指尖魔法屋-毕业设计汇总篇https://blog.thinkmoon.cn/post/113-graduation-design-notes/) 转载或引用必须申明原指尖魔法屋来源及源地址!