毕业设计汇总篇

仿真跑起来之前,得先把「路在哪、灯怎么配、车走哪条路、什么时候动」这几件事拆开写清楚,不然改一处牵全身。
这篇是毕业设计交通网络仿真系列的汇总导航。当时主程序用 C++ 写,道路数据来自网络地图预处理后的 XML,仿真侧自己抽象成图(路口作节点、道路作有向边),再叠红绿灯、车辆生成和按时间步推进的主循环。下面按实际开发顺序列链接,每篇只盯一个模块,方便单独改逻辑而不把整坨代码翻个底朝天。
技术栈与整体流程
- 语言 / 运行时:C++,标准库里的
vector、queue、ifstream用得比较多 - 地图输入:XML 道路文件,每条
road带长度和两端路口坐标 - 核心结构:
Graph里存CrossRoad(路口)和Road(道路),路口上挂TrafficLight和方向节点JunctionRoad - 离线预处理:番外篇用 Dijkstra 算全点对最短路径,结果落成
route.txt一类文本,主流程启动时loadRoute读进来 - 在线仿真:
generateVehicle往路上塞车,runSimulation按时间片更新位置,到路口问灯能不能过
主流程可以粗想成一条链:构图 → 初始化灯 → 预加载路线 → 生成车辆 → 跑模拟。路径计算不每次运行都做,所以单独放在番外篇。
思路篇
思路篇主要记录程序流程思路,按依赖顺序写,后一篇默认前一篇的数据结构已经就绪。
| 篇目 | 解决什么问题 |
|---|---|
| 思路篇(一) 交通图的构建 | 解析 XML,addRoad 去重路口、双向建边,给每个路口记方向节点 |
| 思路篇(二) 交通灯的初始化 | 按路口岔路条数区分 T 字 / 十字,roadID 与 JunctionRoad 对齐 |
| 思路篇(三) 预加载车辆路线 | 从 route.txt 读入道路编号序列,放进 v_Route 供发车用 |
| 思路篇(四) 生成车辆 | 选路线、定起点,把车挂到对应道路的 m_queVehicle |
| 思路篇(五) 交通流量模拟 | 时间步内更新车速与位移,到路口查灯,能过则换路,不能则排队 |
毕业设计思路篇(一)之道路数据的抽象
把外部道路 XML 落成内存里的图,是后面一切逻辑的地基。路口重合判断、atan2 定方向这些细节都在这篇。
毕业设计思路篇(二)之交通灯的初始化
图有了之后,每个路口要配一盏灯。T 字和十字的相位不一样,这篇讲的是 setType 和 roadID 怎么从 JunctionRoad 填进去。
毕业设计思路篇(三)之预加载车辆路线
仿真不现场算路,启动前把合法道路序列读进 vector<queue<int>>。路线从哪来?看番外篇。
毕业设计思路篇(四)之生成车辆
从 v_Route 里挑一条,以队首道路 ID 为起点构造 Vehicle,推进道路的等待队列。
毕业设计思路篇(五)之交通流量模拟
主循环:runSimulation 遍历道路和车上的时间戳,算拥堵修正后的速度,到路口调 getStatus 决定通行或等红灯。
番外篇
番外篇主要记录非主流程、不必每次运行都跑的模块(预处理、离线算路等)。可以单独维护,改算法也不动仿真主循环。
毕业设计番外篇(一)之车辆路径的构建
对所有路口跑 Dijkstra,把路口链和道路链写到 PointPath.txt、RoadPath.txt,再整理成思路篇(三)要读的 route.txt。当时也想过 Floyd,但单源多次 Dijkstra 对当时的数据规模够用了。
如果从零跟这套设计,建议按上表顺序读;只想改某一环(比如只动红绿灯相位),直接点对应篇目即可。汇总篇本身不贴大段代码,实现细节都在各子篇里。
版权声明: 本文首发于 指尖魔法屋-毕业设计汇总篇(https://blog.thinkmoon.cn/post/113-graduation-design-notes/) 转载或引用必须申明原指尖魔法屋来源及源地址!