目录
写在前面
发布赛题一直到现在,完成了D题完整的解题过程,包括代码完整代码与结果、解题思路、模型文档与论文框架~
学姐的代码和论文框架保证原创,保证高质量哦,都是跟F奖学长一起努力完成的!!
题目分析
目标1:弗朗西斯·斯科特·基桥的倒塌对巴尔的摩的交通系统产生了巨大影响。你们的网络模型显示了这座桥梁倒塌和/或重建的影响是什么?请突出显示对巴尔的摩及其周边地区各利益相关者的影响。
目标2:许多巴尔的摩市民步行或乘坐公交车出行。选择一个影响公交或人行步道系统的项目或潜在项目。你们的网络模型显示了这个项目的影响是什么?请突出显示对巴尔的摩及其周边地区各利益相关者的影响。
目标3:为交通网络推荐一个最能改善巴尔的摩居民生活的项目。
a. 这个项目对居民有什么好处?
b. 你们的项目对其他利益相关者有何影响?
c. 解释你们的项目如何破坏其他交通需求和人们的生活。
建模分析:
在巴尔的摩的交通网络建模中,我们可以将其交通系统表示为一个有向图,其中节点集合 V = {v_1, v_2, v_n} ) 代表交叉口、公交站点等关键点;边集合E = {(v_i, v_j)) 代表道路、公交线路、人行道等交通路径。
每条边可以赋予不同的权重,如距离、通行时间或交通流量,以便进行更精确的分析。通过这种建模方法,我们可以进行多种应用,例如分析桥梁倒塌对交通流量的影响,通过移除桥梁对应的节点或边来模拟交通流量的重新分布;或者优化公交路线,通过调整边的权重(如增加公交线路的权重)来找到最优路径。这种图论方法为城市交通系统的分析和优化提供了有力的工具。
城市居民、郊区居民、游客
城市居民、郊区居民和游客是巴尔的摩交通系统的核心使用者。城市居民依赖公共交通和步行系统进行日常通勤和生活,关注出行便利性、安全性和成本;郊区居民则主要通过高速公路和公共交通系统通勤到市区工作,希望减少通勤时间和交通拥堵;游客则依赖便捷的公共交通系统连接主要景点,关注交通信息的清晰性和出行的安全性。交通系统的改进直接影响这三类群体的日常生活、工作效率和旅游体验。
政府机构
政府机构在交通系统中扮演着规划者和管理者的角色,关注城市发展、交通安全和环境保护。政府希望通过交通系统的改进促进城市经济增长和可持续发展,减少交通事故率,并通过绿色交通系统降低污染和碳排放。交通系统的改进不仅影响城市的管理效率,还直接关系到城市的长期发展目标和居民的整体福祉。
环保组织和社区组织
环保组织和社区组织关注交通系统对环境和社会的影响。环保组织提倡绿色交通系统,希望通过减少污染和碳排放来保护环境,推动可持续发展;社区组织则关注交通系统对社区连通性和公共空间的影响,希望通过交通改进增强社区的活力,增加绿地和休闲空间,并促进居民参与交通系统的规划和决策。交通系统的改进对环境保护和社区生活质量有着深远的影响。
第一问
方法:网络流模型
说明:通过网络流模型,我们可以模拟桥梁倒塌前后交通流量的变化,评估其对不同利益相关者的影响。我们可以使用图论中的节点和边来表示交通网络中的交叉口和路段,通过计算不同路径上的流量来评估桥梁倒塌的影响。
网络流(Network Flow):
1)在一个有向图G=(V,E)中,V是节点集合,E是边集合。
2)每条边(u,v)∈E都有一个容量c(u,v),表示该边允许通过的最大流量。
3)网络中有一个源点s和一个汇点t,源点只流出流量,汇点只流入流量。
流量(Flow):
1)对于每条边(u,v),定义f(u,v)为从u到v的流量。
2)流量必须满足容量限制:f(u,v)≤c(u,v)。
流量平衡(Flow Balance):
对于除了源点和汇点以外的每个节点u,其入流和出流必须相等,即∑p∈Ef(p,u)=∑q∈Ef(u,q)。
代码流程与思路
##数据预处理:
1数据读取
1.1读取节点数据 (nodes_all.csv):
目标:读取巴尔的摩交通网络中的节点数据,包括节点ID、纬度和经度信息。
(1)使用 pandas 库读取 nodes_all.csv 文件。
(2)根据巴尔的摩市的经纬度范围,进行数据清洗,筛选出纬度在 [39.18, 39.33] 和经度在 [-76.71, -76.45] 范围内的节点。
(3)采用info() 输出节点数据的基本信息(如节点数量、经纬度范围等),以确定数据正确读取。
1.2读取边数据 (Edge_Names_With_Nodes.csv):
目标:读取交通网络中的边数据,包括街道名称和连接的节点列表。
(1) 使用 pandas 读取 Edge_Names_With_Nodes.csv 文件。
(2) 删除包含空值的行,确保数据完整性。
(3) 将节点列表从字符串格式转换为整数列表(如 “[123, 456]” 转换为 [123, 456])。
2构建图(Graph)
2.1创建图对象:
(1)使用 networkx 创建一个无向图 G。
(2)将筛选后的节点添加到图中,并为每个节点附加纬度和经度信息。
2.2添加边:
(1) 遍历边数据,将每对相邻节点作为边添加到图中。
(2) 只添加两个节点都在筛选后的节点列表中的边。
2.3输出图的基本信息:
输出图的节点数、边数和平均度。
3计算节点的重要性
3.1定义 Haversine 距离函数:
使用 haversine_distances 计算两个经纬度坐标之间的地理距离。
3.2计算节点的邻居距离之和:
对于每个节点,计算其与所有邻居节点的距离之和,并返回平均值。
3.3综合评分:
使用公式 combined_score = alpha * degree - beta * distance_sum 计算每个节点的综合评分。其中alpha 是节点度的权重,beta 是距离之和的权重。
3.4筛选前50个节点:
根据节点的度排序,选择度最高的50个节点。
3.5筛选最重要的20个节点:
根据综合评分排序,选择评分最高的20个节点,同时确保选中的节点之间的距离小于2000米(避免节点过于集中)。
4 处理额外地理坐标点
将 DMS 坐标转换为 DD 坐标:
定义函数 dms_to_dd,将度分秒(DMS)格式的坐标转换为十进制度数(DD)格式。
找到最近的节点:
对于每个额外的地理坐标点,找到距离最近的节点,并将其添加到选中的节点列表中(如果尚未存在)。
5 可视化选中的节点
5.1创建地图:
(1)使用 folium 创建一个地图对象,初始位置为选中节点的中心点。
(2)添加标记:将选中的节点添加到地图上,并为每个节点添加标记(Marker)。标记包含节点ID、经纬度等信息。
5.2保存和显示地图:
将地图保存为 HTML 文件(selected_nodes_map.html)。在 Jupyter Notebook 或其他支持的环境中显示地图。
6 关键技术与方法
1.Haversine 距离计算:
用于计算两个经纬度坐标之间的地理距离。
公式:haversine_distance = 2 * R * arcsin(sqrt(sin²(Δlat/2) + cos(lat1) * cos(lat2) * sin²(Δlon/2))),其中 R 是地球半径。
2.图的构建与分析:
使用 networkx 构建图,并分析节点的度和邻居关系。
通过节点的度和邻居距离计算综合评分,筛选重要节点。
3.地理坐标转换:
将度分秒(DMS)格式的坐标转换为十进制度数(DD)格式,便于计算和可视化。
4.可视化:
使用 folium 库将选中的节点可视化在地图上,支持交互式操作(如点击标记显示详细信息)。
构建网络流模型:
关于剩下的对于其它利益相关者的影响,这边通过数据分析,得到了如下表格
第二问
选取最重要的20个公交站点
(1)从Bus_Stops.csv文件中读取公交车站数据,并同样根据给定的纬度(39.18 , 39.33)和经度(-76.71 ,-76.45)范围筛选出符合条件的公交车站。
(2)对 Stop_Rider(客流量)列进行标准化处理,将其值缩放到 [0, 1] 范围内。
并假设接近中心性与客流量相关,直接用标准化后的客流量作为接近中心性的代理。
(3)计算综合评分,按照客流量分配0.6权重,接近中心性分配0.4权重计算综合评分,并从高到低排序,取前20个站点。之后添加5个边界点,将边界点和综合评分最高的 20 个点合并,并去重。
(4)创建一个以巴尔的摩为中心的地图,初始缩放级别为 13。在地图上添加公交站点,并标记位置:[纬度, 经度]和图标:蓝色公交车图标(使用 Font Awesome 图标库)。
选取经过这20个站点的公交线路
(1)数据读取与初步处理:从MDOT_SHA_Annual_Average_Daily_Traffic_Baltimore.csv导入数据。
(2)数据筛选与清理:筛选并保留特定功能类别的数据,例如指定需要保留的列,包括 AADT Bus 和 GIS 相关列(node start 和 node(s) end)。删除 node start、node(s) end 或 AADT Bus 为空的行。将 node start 和 node(s) end 列合并为一个 nodes 列。并删除原始GIS 列。
(3)节点信息提取:使用正则表达式从 nodes 列中提取所有数字,并转换为整数列表。对 nodes 列应用提取函数,生成 extracted_numbers 列。
(4)创建一个以巴尔的摩为中心的地图,初始缩放级别为 13。并创建一个 MarkerCluster 对象,用于聚合节点标记点,避免地图上标记点过多时难以查看。遍历 extracted_numbers 列,检查节点是否在 G 中,如果在,则添加都地图上,并根据 AADT Bus 的值设置标记的颜色和大小。
添加与客流量相关的公交车站
(1)创建地图对象并设置地图中心,将地图的中心位置设置为 Baltimore 的经纬度。
(2)添加巴士站标记:遍历 final_points DataFrame 中的每一行,提取巴士站的经纬度、客流量(Stop_Rider)和评分(score)。使用 folium.CircleMarker 在地图上添加巴士站标记,标记大小与客流量(Stop_Rider_normalized)相关。
(3)添加节点和边,遍历节点列表中的每一对相邻节点。检查节点是否在 G 中如果节点存在于图 G 中,则获取其经纬度,并使用 folium.CircleMarker 在地图上添加节点标记。
数据与代码
完整论文与代码获取
完整论文、技术文档。有需要的同学直接看下面哦