DIAL算法计算单位流率-python实现
dail算法
DIAL算法又称STOCH算法,它基于路段分配流量,并将OD量仅仅加载到连接OD对的有效路径上,成功避免了路径枚举,被公认为是相当高效的Logit型随机网络加载算法。也就是说,DIAL算法并非利用Logit随机加载模型计算路径流量和路段流量,但结果却与这些公式吻合。
dail算法步骤
对OD起点r,DIAL算法执行如下3个步骤:
步骤1:预处理
(1)对 ∀i∈N\forall i∈ N∀i∈N,计算从r到i的最短路径长度rir_iri;
(2)对 ∀(i,j)∈A\forall(i,j)∈ A∀(i,j)∈A,按下式计算路段似然值LijL_{ij}Lij
Lij={eθ(rj−ri−tij),ri≤rj0,其他L_{ij}=\left\{ \begin{aligned} e^{\theta(r_j-r_i- t_{ij})}, & {r_i \leq r_j} \\ 0, & 其他 \end{aligned} \right. Lij={eθ(rj−ri−tij),0,ri≤rj其他
步骤2:正向计算路段权重
从r开始,按rir_iri的升序依次处理每个节点i,即对 ∀j∈F(i)\forall j∈ F(i)∀j∈F(i),按下式计算路段(i,j)的权重wijw_{ij}wij
wij={Lij,i=rLij∑m∈B(i)wmi,其他w_{ij}=\left\{ \begin{aligned} L_{ij}, & i= r \\ \\ L_{ij}\sum_{m∈ B(i)}{w_{mi}} , & 其他 \end{aligned} \right. wij=⎩⎪⎪⎪⎨⎪⎪⎪⎧Lij,Lijm∈B(i)∑wmi,i=r其他
步骤3:反向分配路段流量
从具有最大rjr_jrj值的节点开始,按rjr_jrj的降序依次处理每个节点j,即对 ∀i∈B(j)\forall i∈ B(j)∀i∈B(j),按下计算路段(i,j)的流量xijx_{ij}xij
xij={0,j=r(qrj+∑∀m∈F(j)xjm)wij∑∀m∈B(j)wmj,其他x_{ij}=\left\{ \begin{aligned} 0, & j= r \\ \\ (q_{rj}+ \sum_{\forall m∈ F(j)}x_{jm})\frac{w_{ij}}{\sum _{\forall m∈ B(j)}w_{mj}} , & 其他 \end{aligned} \right. xij=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧0,(qrj+∀m∈F(j)∑xjm)∑∀m∈B(j)wmjwij,j=r其他
实例
求一下网络的单位流率(实心顶点为起讫点)
图形数据说明:顶点编号如图,从左到右从上到下,从1为起始号进行编号,在程序中顶点i编号则为i-1
准备
使用工具及环境:
编程语言:python3.6(Anaconda3发行版)
依赖库:numpy,pandas
编译环境:Ubantu -> Vim / Windows -> Pycharm /Spyder
程序运行要求:当使用相对位置读取文件时,解释器的工作文件夹应与数据文件位置保持一致,否则会出现无法读取文件的问题。(解决办法:import os)
流程图
代码
- daildemo.py
#!/usr/bin/env python
import numpy as np
import pandas as pd
#import networkx as nxdef get_T_matrix(file):f = open(file)first_ele = Truefor data in f.readlines():data = data.strip('\n')nums = data.split("\t")if first_ele:nums = [int(x) for x in nums]T = np.array(nums,dtype = float)first_ele = Falseelse:nums = [int(x) for x in nums]T = np.c_[T,nums]f.close()nnode = T.shape[0]T0 = T.flatten()for index in range(T0.shape[0]):if T0[index] == 0:T0[index] = np.infT = T0.reshape((nnode,nnode))for i in range(nnode):T[i,i] = 0return Tdef get_information(T):print('请输入起点(1~',T.shape[0],"):",end = '')r = input()r = int(r)-1print("请输入讫点(1~",T.shape[0],"):",end = '')s = input()s = int(s)-1q = input("请输入总需求量(q>=0):")q = int(q)thita = input("请输入参数(默认为1):")thita = int(thita)info = (r,s,q,thita)return(info)def dial(T,r,s,q,thita):'''利用dial算法计算单位流率T 路网邻接矩阵r 标号起点s 标号讫点q 总需求量thita dial算法中的参数'''nnode = T.shape[0]print("step1 求最短距离","="*70,sep = '\n')R = all_shortest_path(T,r)# 根据到起点的最短距离进行标号connection = np.zeros((nnode,nnode)) #对于connection[i,j]合理路段为1,其他为0for i in range(nnode):for j in range(nnode):if(T[i,j] != 0 and T[i,j] != np.inf ):if(R[i] < R[j]):connection[i,j] = 1 #i为j的前项print("step2 计算合理路径使用概率","="*70,sep = '\n')P = np.zeros((nnode,nnode))for i in range(nnode):for j in range(nnode):if connection[i,j]:P[i,j] = np.exp(thita*(R[j]-R[i]-T[i,j]))P_f = pd.DataFrame(P)print("路段使用概率:",P_f.round(3),sep = '\n')print("step3 计算线权","="*70,sep = '\n')W = np.zeros((nnode,nnode)) # 初始化线权矩阵for i in range(nnode):for j in range(nnode):if connection[i,j]:if i == r:W[i,j] = 1*P[i,j]else:W[i,j] = P[i,j]*connection[:,i].dot(W[:,i].T)W_f = pd.DataFrame(W)print("线权:",W_f.round(3),sep = '\n')print("step4 计算单位流率","="*70,sep = '\n')Qw = np.zeros((nnode,nnode))for i in range(nnode-1,-1,-1):for j in range(nnode-1,-1,-1):if connection[i,j]:if (connection[:,j].dot(W[:,j].T)):if j==s:Qw[i,j] = q*W[i,j]/(connection[:,j].dot(W[:,j].T))else:Qw[i,j] = Qw[j].dot(connection[j].T)*W[i,j]/(connection[:,j].dot(W[:,j].T))print("单位流率:")Qw_f = pd.DataFrame(Qw)print(Qw_f.round(3))return Qw_fdef all_shortest_path(T,r):nnode = T.shape[0]path = np.zeros((nnode,nnode),dtype = int)Tmin = T.copy()for i in range(nnode):for j in range(nnode):if(T[i,j] != np.inf and T[i,j] != 0):path[i][j] = ifor a in range(nnode):for b in range(nnode):for c in range(nnode):if(Tmin[b,a]+Tmin[a,c]<Tmin[b,c]):Tmin[b,c] = Tmin[b,a]+Tmin[a,c]path[b][c] = path[a][c]print("result:")print("节点标号:",'\n',Tmin[r])return(Tmin[r])# 程序整体流程print("="*70)
print(" "*25,"dail计算单位流率")
print("使用环境:python3.6 依赖库:numpy pandas")
print("班级","姓名","学号",sep = '\t')
print("文件要求:数据文件以txt格式导入,当前工作文件夹与数据文件所在文件夹相同")
print("-"*70)
print('''选择例题对应的数据文件或自定义数据文件:(1.图1 2.图2 3.图3 4.自定义):''',end = '\t')
flag = input()
file = {'1':'tu1.txt','2':'tu2.txt','3':'tu3.txt'}
if flag == '4':f = input("输入文件名:")
else:f = file[flag]T = get_T_matrix(f) #从文件或内置材料读取路网拓扑数据
info = get_information(T) #获取配流必要的起讫点及流量、参数信息
Qw = dial(T,info[0],info[1],info[2],info[3]) # 向核心算法传参
#数据后处理
flag1 = input("是否保存配流数据文件到工作文件夹(1.保存 2.离开):")
if flag1 == '1':Qw.to_excel("单位流率.xls")
内置网络文件
2. tu1.txt
0 3 2 4 0 0 0 0 0 0 0
3 0 2 0 3 0 0 0 0 0 0
2 2 0 1 5 7 0 0 0 0 0
4 0 1 0 0 0 3 0 0 0 0
0 3 5 0 0 0 0 3 3 0 0
0 0 7 0 0 0 0 0 3 5 0
0 0 0 3 0 0 0 0 0 2 0
0 0 0 0 3 0 0 0 2 0 4
0 0 0 0 3 3 0 2 0 3 2
0 0 0 0 0 5 2 0 3 0 4
0 0 0 0 0 0 0 4 2 4 0
3.tu2.txt
0 2 2 0 3 0 0 0 0 0
2 0 0 3 0 0 0 0 0 0
2 0 0 4 1 5 0 0 0 0
0 3 4 0 0 2 0 0 0 0
3 0 1 0 0 2 5 0 7 0
0 0 5 2 2 0 0 5 0 0
0 0 0 0 5 0 0 4 6 3
0 0 0 0 0 5 4 0 0 4
0 0 0 0 7 0 6 0 0 2
0 0 0 0 0 0 3 4 2 0
4.tu3.txt
0 1 3 0 0 0 0 0 0 0 0 0 0 0 0
1 0 4 2 0 0 0 0 0 0 0 0 0 0 0
3 4 0 0 2 0 0 0 0 0 0 0 0 0 0
0 2 0 0 3 1 0 0 0 0 0 0 0 0 0
0 0 2 3 0 2 3 0 5 0 0 0 0 0 0
0 0 0 1 2 0 0 4 5 0 0 0 0 0 0
0 0 0 0 3 0 0 0 3 0 0 0 0 9 0
0 0 0 0 0 4 0 0 6 5 7 0 0 0 0
0 0 0 0 5 5 3 6 0 3 0 0 6 0 0
0 0 0 0 0 0 0 5 3 0 0 2 0 0 0
0 0 0 0 0 0 0 7 0 0 0 4 0 0 0
0 0 0 0 0 0 0 0 0 2 4 0 4 0 3
0 0 0 0 0 0 0 0 6 0 0 4 0 5 6
0 0 0 0 0 0 9 0 0 0 0 0 5 0 0
0 0 0 0 0 0 0 0 0 0 0 3 6 0 0
运行结果
参考资料
[1] 可直接计算转向流量的改进型DIAL交通分配算法,任刚,王炜,中国公路学报Vol.18 No.4 Oct. 2005
[2] 配流DAIL算法-刘志祥
DIAL算法计算单位流率-python实现相关推荐
- Graham-Scan算法计算凸包的Python代码实现
对于一个点集P来讲,它的凸包就是一个凸多边形Q,其中满足P中的每个点都在Q的边界上或内部.就像下图所示 凸包的计算算法有好多种,wiki和算法导论第33章中都有比较详细的介绍,比如下面是算法导论中给出 ...
- python中日期格式转换,计算单位天数时间差
一.字符串转别的时间格式 datetime的模块(包)中,集成了3个主要的类型: datatime类型: 日期和时间 date类型: 日期 time类型: 时间 import datetime sta ...
- 用狄克斯特拉算法计算带权最短路径
目录 用狄克斯特拉算法计算带权最短路径 狄克斯特拉算法思想 举一个栗子:起点到终点 举二个栗子:换钢琴 Warning 代码代码代码 python C JAVA 图文来源 用狄克斯特拉算法计算带权最短 ...
- 用通俗易懂的方式讲解:主成分分析(PCA)算法及案例(Python 代码)
文章目录 知识汇总 加入方式 一.引入问题 二.数据降维 三.PCA基本数学原理 3.1 内积与投影 3.2 基 3.3 基变换的矩阵表示 3.4 协方差矩阵及优化目标 3.5 方差 3.6 协方差 ...
- 算法学习之模拟退火算法路径规划(python代码实现)
模拟退火算法路径规划(python代码实现) 一.引言 二.算法介绍以及伪代码 1.算法通俗介绍 2.路径规划算法伪代码 三.算法流程及代码实现 1.地图创建 2.初始化路径 小结 3.计算适应度值 ...
- 数据结构与算法基础(基于python)
用大O法表示运行时间,log都表示log2(以2为底的对数) 所有的算法都是基于python写的 一.二分查找法: 1.输入:一个有序的元素列表 2.输出:如果要查找的元素包含在列表中,二分查找返回其 ...
- 机器学习算法清单!附Python和R代码
来源:数据与算法之美 本文约6000字,建议阅读8分钟. 通过本文为大家介绍了3种机器学习算法方式以及10种机器学习算法的清单,学起来吧~ 前言 谷歌董事长施密特曾说过:虽然谷歌的无人驾驶汽车和机器人 ...
- 相似图片检测:感知哈希算法之dHash的Python实现
原文:https://blog.csdn.net/haluoluo211/article/details/52769325 相似图片检测:感知哈希算法之dHash的Python实现 某些情况下,我们需 ...
- python算法与程序设计基础第二版-算法与程序设计基础(Python版) - 吴萍
基本信息 书名:21世纪高等学校计算机基础实用规划教材:算法与程序设计基础(Python版) 定价:39.00元 作者:吴萍21世纪高 出版社:清华大学出版社 出版日期:2015_2_1 ISBN:9 ...
最新文章
- J2EE环境的搭建之二—oracle的安装与详解
- 写文件 追加_总结Java中创建并写文件的5种方式
- 2020年财富金字塔出炉,你距离高净值还有多远?
- 基于英特尔® 优化分析包(OAP)的 Spark 性能优化方案
- 我来做百科(第一天)
- opencv图像配准_Milvus 实战 | 基于 Milvus 的图像查重系统
- tcp_wrapper:简单的基于主机的访问控制工具
- Futter基础第5篇: 实现列表、动态列表【ListView、ListView.builder】
- 【java】 jsp网页session和application,全局变量方法
- Lua学习小记——语言
- 什么是OM3、OM4光纤跳线?
- testbench实例 vhdl_[转载]VHDL的testbench的编写
- chrome插件-Web开发者助手 FeHelper
- 诺基亚n1平板电脑刷机教程_Z Launcher详细使用教程_诺基亚 N1_平板电脑新闻-中关村在线...
- 微信小程序如何上传图片
- Win10应用商店无法下载XBOX怎么办?
- 2021-2-2有道翻译在线翻译爬虫
- “刀片嗓”“水泥鼻”“咳出肺”可以这样缓解!
- 如何用python来打印一个三角形
- c++ 函数后面加一个冒号的含义
热门文章
- Fractal Streets(经典分形递归+坐标旋转)
- 苹果笔记本上网很慢怎么回事?macbook无线上网慢的解决方法
- 番茄时间管理——规则
- android自定义相机打开闪光灯,Android 照相机(闪光灯,切换摄像头)
- 机器学习 最小角回归 LARS
- 搞定计算机网络面试,看这篇就够了
- (CVE-2020-11800)Zabbix_Server_trapper_命令注入漏洞
- flex局部的知识总结
- Docker 定制容器镜像的2种方法
- How to solve the lossless offline problem of Spring Cloud Alibaba service instance in Kubernetes