AdeiTech-star/dsa_group_20

GitHub: AdeiTech-star/dsa_group_20

基于七种自研数据结构的城市应急调度模拟系统,用于道路网络建模、事故分级和最优路径规划。

Stars: 1 | Forks: 0

# 城市突发事件响应系统 一个为卢旺达基加利市构建的紧急调度模拟系统,完全使用 C++ 及自定义数据结构(无 STL 容器)开发。该系统将城市道路网络建模为动态加权图,并实时管理救护车、消防车和警车向事故现场的调度。 ## 概述 基加利的应急基础设施负责在拥有 170 万以上居民、地势多山且快速发展的城市中,协调警察 (112)、SAMU 救护车 (912) 和消防队 (111) 服务。本项目使用七个从零开始构建的数据结构来模拟这种协调机制——加权图、最小堆、哈希表、AVL 树、线段树、Union-Find 和字典树。 ### 核心功能 - **动态城市地图** — 在运行时添加/移除道路,并实时跟踪连通性 - **事故分流** — 优先队列确保始终优先调度最紧急的事故 - **最优路径规划** — Dijkstra 算法计算最短路径;Union-Find 用于拦截无法到达的调度 - **时间分析** — 针对事故日志的 AVL 树范围查询和线段树区间计数 - **前缀搜索** — 基于字典树的自动补全,用于单位名称和路口名称搜索 ## 项目结构 ``` . urban-irs/ ├── include/ │ ├── hash_table.h │ ├── graph.h │ ├── union_find.h │ ├── min_heap.h │ ├── avl_tree.h │ ├── segment_tree.h │ ├── trie.h │ └── dispatcher.h ├── src/ │ ├── hash_table.cpp │ ├── graph.cpp │ ├── union_find.cpp │ ├── min_heap.cpp │ ├── avl_tree.cpp │ ├── segment_tree.cpp │ ├── trie.cpp │ ├── dispatcher.cpp │ └── main.cpp ├── tests/ │ ├── test_hash_table.cpp │ ├── test_graph.cpp │ ├── test_union_find.cpp │ ├── test_min_heap.cpp │ ├── test_avl_tree.cpp │ ├── test_segment_tree.cpp │ ├── test_trie.cpp │ └── test_dispatcher.cpp ├── data/ │ └── kigali_map.txt ├── docs/ │ └── proposal.pdf ├── .github/ │ └── workflows/ │ └── ci.yml ├── Makefile └── README.md ``` ## 构建 ``` mkdir build && cd build cmake .. cmake --build . ``` ## 运行测试 一次性运行所有测试,并将单独的日志保存到 `build/test_results/`: ``` bash run_tests.sh ``` 或者运行特定的测试: ``` ./build/test_graph ./build/test_hash_table ./build/test_min_heap ./build/test_union_find ./build/test_avl_tree ./build/test_segment_tree ./build/test_trie ./build/test_dijkstra ./build/test_dispatcher ``` ## 运行基准测试 ``` ./build/benchmark ``` 基准测试运行三个计时场景(总计约 80,000+ 次操作): 1. **大规模伤亡** — 10,000 次 `reportIncident` 调用 + autoDispatch 排空 + 10,000 次 `resolveIncident` 调用。测试 MinHeap、HashTable、AVLTree、SegmentTree、UnionFind 和 Dijkstra。 2. **道路封闭重路由** — 10,000 次 `closeRoad`+`reopenRoad` 循环(每次 UnionFind 完全重建)+ 每次封闭后进行 500 次调度+重路由迭代。 3. **时间分析** — 针对 SegmentTree(更新 + 范围查询)、AVLTree(插入 + collectRange)、HashTable(插入 + 查找)和 Trie(插入 + 前缀搜索)各进行 10,000 次操作。每个结构均独立测量。 ## 内存管理 已通过 Valgrind 验证——零内存泄漏,零错误(参见 `build/valgrind.log`)。 ## 团队 | 姓名 | Andrew ID | |------|-----------| | Kavini Nzau | knzau | | Nthabiseng Thema | nthema | | Christian Abiyingoma | cabiying | | Regis Ndahiro Ngoga | rndahiro |
标签:AVL树, Bash脚本, C++, 事件分诊, 优先队列, 前缀搜索, 动态加权图, 区间查询, 卢旺达基加利, 图论算法, 城市应急响应, 字典树, 并查集, 应急调度模拟, 救护车调度, 散列表, 数据擦除, 无STL, 时间序列分析, 智能交通系统, 最小堆, 最短路径, 模拟系统, 消防车, 算法与数据结构, 紧急救援, 线段树, 自动补全, 自定义数据结构, 警车, 迪杰斯特拉算法