《交通规划》——最短路分配方法

news2024/11/27 18:35:00

《交通规划》——最短路分配方法

说明:下面内容,将用python、networkx实现刘博航、杜胜品主编的《交通规划》P198页的例题,主要是实现最短路径分配方法。

1. 题目描述如下:

IMG_0624

IMG_0625

2. networkx构建网络

import networkx as nx
import matplotlib.pyplot as plt

# 带权重的边列表
edges = [(1,2,10), (1,3,4), (2,3,3), (2,4,5),(3,4,12),
         (2,1,10), (3,1,4), (3,2,3), (4,2,5),(4,3,12)]
nodes = [1,2,3,4]

# 创建无向图
G = nx.DiGraph()

# 添加节点
G.add_nodes_from(nodes)
G.add_weighted_edges_from(edges)

# 绘制图形
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=500, font_size=16, font_weight='bold')
labels = nx.get_edge_attributes(G, 'weight')
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels, font_size=12, font_color='red')
plt.show()

nx.write_gexf(G,'./net9_2.gexf')

构建的网络为有向图:

image-20230614195842282

3. 输入OD矩阵,表9-8

import pandas as pd
import numpy as np
od = pd.DataFrame(
    data=
    {'A':[0,100,300],
    'B':[100,0,200],
    'C':[300,200,0]}
)

od.index = ['A', 'B', 'C']
od
od.to_csv('./OD_9-8.csv')

image-20230614200104793

4. 流量分配

思路:

  • 处理OD矩阵,处理成OD对
  • 遍历每一对OD对,找出OD对对应的最短路径,并存储
  • 遍历最短路径所经过的边,将流量分配到对应的边上

4.1 OD矩阵 -->OD对

import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt

#输入网络
G=  nx.read_gexf('./net9_2.gexf')

# 输入OD
od = pd.read_csv('./OD_9-8.csv',index_col=0)
od

# 将OD点和网络节点进行对应
od_map_nodes_dict = {
    'A':1,
    'B':3,
    'C':4
}
# 将OD表处理成OD对
od_new = od.unstack()
od_new = od_new.reset_index()
od_new = od_new.rename(dict(zip(list(od_new.columns),['O','D','q'])),axis=1) #q 表示交通小区之间的出行分布量
od_new

image-20230614200503098

4.2 初始化网络中的流量

# 初始化G中的flow属性
for u,v,data in G.edges(data = True):
    data['flow'] =0

边视图如下:

image-20230614200634972

4.3 遍历每对OD,查找最短路径,并分配流量

#!分配OD量
# 将各OD点对的OD量分配到该OD点对应的最短路径上,并进行累加
df = od_new
# 遍历DataFrame的每一行
for _, row in df.iterrows():
    # 获取流量
    flow = row['q']
    O = str(od_map_nodes_dict[row['O']])
    D = str(od_map_nodes_dict[row['D']])
    # 获取路径
    path = nx.shortest_path(G,O,D,'weight')
    print(row['O'],'-',row['D'],'shortest_path:',path)
    
    # 分配流量到路径上的每一条边
    for i in range(len(path) - 1):
        # 如果边已经存在,增加流量
        if G.has_edge(path[i], path[i+1]):
            if 'flow' in G[path[i]][path[i+1]]:
                G[path[i]][path[i+1]]['flow'] += flow
            else:
                G[path[i]][path[i+1]]['flow'] = flow
        # else:
            # G.add_edge(path[i], path[i+1], flow=flow)

# 输出结果
G.edges(data= True)

for u, v, data in G.edges(data=True):
    print(f"Edge: {u}-{v}, Flow: {data['flow']}")

结果(和书中一致):

image-20230614200809713

IMG_0626

5. 完整代码:

import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
#************************************************************************************************
od = pd.DataFrame(
    data=
    {'A':[0,100,300],
    'B':[100,0,200],
    'C':[300,200,0]}
)

od.index = ['A', 'B', 'C']
od
od.to_csv('./OD_9-8.csv')

#************************************************************************************************
# 带权重的边列表
edges = [(1,2,10), (1,3,4), (2,3,3), (2,4,5),(3,4,12),
         (2,1,10), (3,1,4), (3,2,3), (4,2,5),(4,3,12)]
nodes = [1,2,3,4]

# 创建无向图
G = nx.DiGraph()

# 添加节点
G.add_nodes_from(nodes)
G.add_weighted_edges_from(edges)

# 绘制图形
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=500, font_size=16, font_weight='bold')
labels = nx.get_edge_attributes(G, 'weight')
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels, font_size=12, font_color='red')
plt.show()

nx.write_gexf(G,'./net9_2.gexf')


#************************************************************************************************
#输入网络
G=  nx.read_gexf('./net9_2.gexf')

# 输入OD
od = pd.read_csv('./OD_9-8.csv',index_col=0)
od

# 将OD点和网络节点进行对应
od_map_nodes_dict = {
    'A':1,
    'B':3,
    'C':4
}
# 将OD表处理成OD对
od_new = od.unstack()
od_new = od_new.reset_index()
od_new = od_new.rename(dict(zip(list(od_new.columns),['O','D','q'])),axis=1) #q 表示交通小区之间的出行分布量
od_new

# # 确定最短OD对之间的最短路径
# od_new['shortest_path'] = od_new.apply(lambda x:nx.shortest_path(G,str(od_map_nodes_dict[x['O']]),str(od_map_nodes_dict[x['D']]),weight='weight'),axis=1)
# # 将路径中的节点从字符串转化为整数,因为图G中的节点是整数
# od_new['shortest_path'] = od_new['shortest_path'].apply(lambda x: [int(node) for node in x])


#!分配OD量
# 将各OD点对的OD量分配到该OD点对应的最短路径上,并进行累加
df = od_new
# 初始化G中的flow属性
for u,v,data in G.edges(data = True):
    data['flow'] =0



G.edges(data = True)

#!分配OD量
# 将各OD点对的OD量分配到该OD点对应的最短路径上,并进行累加
df = od_new
# 遍历DataFrame的每一行
for _, row in df.iterrows():
    # 获取流量
    flow = row['q']
    O = str(od_map_nodes_dict[row['O']])
    D = str(od_map_nodes_dict[row['D']])
    # 获取路径
    path = nx.shortest_path(G,O,D,'weight')
    print(row['O'],'-',row['D'],'shortest_path:',path)
    
    # 分配流量到路径上的每一条边
    for i in range(len(path) - 1):
        # 如果边已经存在,增加流量
        if G.has_edge(path[i], path[i+1]):
            if 'flow' in G[path[i]][path[i+1]]:
                G[path[i]][path[i+1]]['flow'] += flow
            else:
                G[path[i]][path[i+1]]['flow'] = flow
        # else:
            # G.add_edge(path[i], path[i+1], flow=flow)

# 输出结果
G.edges(data= True)

for u, v, data in G.edges(data=True):
    print(f"Edge: {u}-{v}, Flow: {data['flow']}")
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/646948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring6 面向切面(AOP)

文章目录 1、场景模拟1.1、声明接口1.2、创建实现类1.3、创建带日志功能的实现类1.4、隐藏问题 2、代理模式2.1、概念2.2、静态代理2.3、动态代理2.4、测试 3、AOP概念及相关术语3.1、概述3.2、相关术语①横切关注点②通知(增强)③切面④目标⑤代理⑥连接…

跨模态检索论文阅读:Dissecting Deep Metric Learning Losses for Image-Text Retrieval(GOAL)

Dissecting Deep Metric Learning Losses for Image-Text Retrieval 剖析图像文本检索中的深度度量学习损失 2022.10 视觉语义嵌入(VSE)是图像-文本检索中的一种流行的应用方法,它通过学习图像和语言模式之间的联合嵌入空间来保留语义的相似性…

2023.06.14 QT day3

用QT实现的简单文本编辑器 头文件widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> #include <QTextEdit> #include <QFont> #include <QFontDialog> #include <QColor> #include <QColorDialo…

C语言符合类型之结构篇(结构指针)

结构相关知识总结 什么是结构&#xff1f;结构的声明与简单使用结构的初始化结构中成员变量的访问结构的初始化器结构数组结构数组的声明结构数组的成员标识 结构的嵌套结构指针结构作为参数在函数中传递将结构成员作为参数进行传递将结构地址(指向结构的指针)作为参数进行传递…

leetcode 279.完全平方数

题目描述 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而 3 和 11 …

cmu db p4

在lab4中实现一个基于 2PL 的并发控制方式&#xff0c;自动为并发事务执行加锁解锁&#xff0c;提供可串行化能力并实现可重复读、读已提交、读未提交三种隔离度 Lock Manager&#xff1a;锁管理器&#xff0c;利用 2PL 实现并发控制。支持 REPEATABLE_READ、READ_COMMITTED 和…

我五年经验,面试官: “不,你是把一年的工作经验用了五年”

最近看到很多软件测试由于公司裁员而需要重新求职的。他们普遍具有4年甚至更长的工作经验。但求职结果往往都不太理想。 我在与部分软件测试求职者交谈的过程中发现&#xff0c;很多人的工作思路不清晰&#xff0c;技能不扎实&#xff0c;没有持续学习的习惯&#xff0c;但对于…

编程(41) ----------线程池

本篇主要提及线程池的相关内容. 依旧是从最基础的含义开始. 什么是线程池? 在计算机中池的是一个很大的概念, 分为很多种. 但无论是什么池, 其核心都是存取相关数据. 线程池也不例外, 即存放线程的池. 其存在意义与线程异曲同工. 线程产生并使用是因为进程太"重"了…

Andriod开发 ViewPager PageTabStrip

1. ViewPager ViewPager常见于APP的引导页或者产品介绍&#xff0c;左右滑动展示不同页面。 ViewPager用PagerAdapter来绑定数据。PagerAdapter是个抽象类&#xff0c;所以需要写一个子类来实现它。 xml: <?xml version"1.0" encoding"utf-8"?> …

设计模式(十五):行为型之命令模式

设计模式系列文章 设计模式(一)&#xff1a;创建型之单例模式 设计模式(二、三)&#xff1a;创建型之工厂方法和抽象工厂模式 设计模式(四)&#xff1a;创建型之原型模式 设计模式(五)&#xff1a;创建型之建造者模式 设计模式(六)&#xff1a;结构型之代理模式 设计模式…

I2C与I3C

Improved Inter Integrated Circuit &#xff0c;是 MIPI&#xff08;Mobile Industry Processor Interface&#xff09;移动产业处理器接口联盟推出的改进型 i2c (Inter-Integrated Circuit Bus)总线接口。 I3C Introduction I3C &#xff1a;Improved Inter Integrated Cir…

CoreDX DDS应用开发指南(10)通信状态Communication Status

13 Communication Status通信状态 DDS基础设施跟踪与数据通信相关的许多状态和统计信息。应用程序可以选择了解这些状态和统计信息中的一些、全部或全部。 每个DDS实体都有其相关状态,如表13-1所示。 一些通信状态与可用于订阅应用程序的数据相关联。这些被称为读取…

Python发展5大方向,5个对应例子让你更清晰的认知Python!

目录 前言1.数据分析相关路线&#xff1a;案例&#xff1a;使用Python进行股票数据分析 2.人工智能学习路线&#xff1a;案例&#xff1a;使用Python进行图像识别 3.Web开发学习路线&#xff1a;案例&#xff1a;使用Python和Django开发博客网站 4.科学计算学习路线&#xff1a…

(小甲鱼python)类和对象(III)总结 类的继承---构造函数、重写、钻石继承、super()函数

一、基础复习 1.类和对象&#xff08;I&#xff09;总结 类的定义、self的用法 2.类的继承(II)、类的判断isinstance()、issubclass()、多重继承、类的组合 3.类和对象&#xff08;III&#xff09;总结 类的绑定&#xff0c;self&#xff0c;__dict__的妙用 二、类的继承 1.…

4.4.2 译码器

1. 学习基础知识&#xff1a;首先&#xff0c;我会了解译码器的基本概念、原理和应用。通过阅读教科书、参考资料或在线资源&#xff0c;我会学习译码器的工作原理、不同类型的译码器以及它们在电子系统中的应用场景。 2. 研究示例和练习题&#xff1a;为了更好地理解译码器的…

12、Nginx高级之高级模块(secure_link/secure_link_md5)

一、功能 防盗链&#xff1b; ngx_http_secure_link_module模块用于检查所请求链接的真实性&#xff0c;保护资源免受未经授权的访问&#xff0c;并限制链接寿命。 该模块提供两种可选的操作模式。 第一种模式由 secure_link_secret 指令启用&#xff0c;用于检查所请求链接的真…

【Python爬虫开发基础⑤】HTML概述与基本标签详解

专栏&#xff1a;python网络爬虫从基础到实战 欢迎订阅&#xff01;近期还会不断更新~ 往期推荐&#xff1a; 【Python爬虫开发基础①】Python基础&#xff08;变量及其命名规范&#xff09; 【Python爬虫开发基础②】Python基础&#xff08;正则表达式&#xff09; 【Python爬…

出境游复苏加速,距离“回到过去”还有多远?

6月14日一早&#xff0c;日本驻华大使馆一则“自6月19日起正式签发电子签证”的消息&#xff0c;引起了旅游圈的广泛关注。尽管其电子签方案因为流程繁琐甚至超过纸质签证&#xff0c;收获了一片吐槽之声&#xff0c;但游客对出境游的期待&#xff0c;却实打实地得到了展现。 …

solr快速上手:整合SolrJ实现客户端操作(九)

0. 引言 我们前面学习了solr的服务端基础操作&#xff0c;实际项目中我们还需要在客户端调用solr&#xff0c;就像调用数据库一样&#xff0c;我们可以基于solrJ来实现对solr的客户端操作 1. SolrJ简介 SolrJ 是 Solr官方提供的 Java 客户端库&#xff0c;主要用于与 Solr 服…

【Java学习记录-8】集合

集合 特点结构Collection概述创建方式常用方法遍历方式 List概述遍历方式特有方法 特点 提供一种存储空间可变的存储类型&#xff0c;存储的数据容量可以随时发生改变 结构 Collection 概述 是单列集合的顶层接口&#xff0c;它表示一组对象&#xff0c;这些对象也称为Coll…