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​,Lij​m∈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)​wmj​wij​​,​j=r其他​

实例

求一下网络的单位流率(实心顶点为起讫点)

图形数据说明:顶点编号如图,从左到右从上到下,从1为起始号进行编号,在程序中顶点i编号则为i-1

准备

使用工具及环境:
编程语言:python3.6(Anaconda3发行版)
依赖库:numpy,pandas
编译环境:Ubantu -> Vim / Windows -> Pycharm /Spyder
程序运行要求:当使用相对位置读取文件时,解释器的工作文件夹应与数据文件位置保持一致,否则会出现无法读取文件的问题。(解决办法:import os)

流程图

代码

  1. 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实现相关推荐

  1. Graham-Scan算法计算凸包的Python代码实现

    对于一个点集P来讲,它的凸包就是一个凸多边形Q,其中满足P中的每个点都在Q的边界上或内部.就像下图所示 凸包的计算算法有好多种,wiki和算法导论第33章中都有比较详细的介绍,比如下面是算法导论中给出 ...

  2. python中日期格式转换,计算单位天数时间差

    一.字符串转别的时间格式 datetime的模块(包)中,集成了3个主要的类型: datatime类型: 日期和时间 date类型: 日期 time类型: 时间 import datetime sta ...

  3. 用狄克斯特拉算法计算带权最短路径

    目录 用狄克斯特拉算法计算带权最短路径 狄克斯特拉算法思想 举一个栗子:起点到终点 举二个栗子:换钢琴 Warning 代码代码代码 python C JAVA 图文来源 用狄克斯特拉算法计算带权最短 ...

  4. 用通俗易懂的方式讲解:主成分分析(PCA)算法及案例(Python 代码)

    文章目录 知识汇总 加入方式 一.引入问题 二.数据降维 三.PCA基本数学原理 3.1 内积与投影 3.2 基 3.3 基变换的矩阵表示 3.4 协方差矩阵及优化目标 3.5 方差 3.6 协方差 ...

  5. 算法学习之模拟退火算法路径规划(python代码实现)

    模拟退火算法路径规划(python代码实现) 一.引言 二.算法介绍以及伪代码 1.算法通俗介绍 2.路径规划算法伪代码 三.算法流程及代码实现 1.地图创建 2.初始化路径 小结 3.计算适应度值 ...

  6. 数据结构与算法基础(基于python)

    用大O法表示运行时间,log都表示log2(以2为底的对数) 所有的算法都是基于python写的 一.二分查找法: 1.输入:一个有序的元素列表 2.输出:如果要查找的元素包含在列表中,二分查找返回其 ...

  7. 机器学习算法清单!附Python和R代码

    来源:数据与算法之美 本文约6000字,建议阅读8分钟. 通过本文为大家介绍了3种机器学习算法方式以及10种机器学习算法的清单,学起来吧~ 前言 谷歌董事长施密特曾说过:虽然谷歌的无人驾驶汽车和机器人 ...

  8. 相似图片检测:感知哈希算法之dHash的Python实现

    原文:https://blog.csdn.net/haluoluo211/article/details/52769325 相似图片检测:感知哈希算法之dHash的Python实现 某些情况下,我们需 ...

  9. python算法与程序设计基础第二版-算法与程序设计基础(Python版) - 吴萍

    基本信息 书名:21世纪高等学校计算机基础实用规划教材:算法与程序设计基础(Python版) 定价:39.00元 作者:吴萍21世纪高 出版社:清华大学出版社 出版日期:2015_2_1 ISBN:9 ...

最新文章

  1. J2EE环境的搭建之二—oracle的安装与详解
  2. 写文件 追加_总结Java中创建并写文件的5种方式
  3. 2020年财富金字塔出炉,你距离高净值还有多远?
  4. 基于英特尔® 优化分析包(OAP)的 Spark 性能优化方案
  5. 我来做百科(第一天)
  6. opencv图像配准_Milvus 实战 | 基于 Milvus 的图像查重系统
  7. tcp_wrapper:简单的基于主机的访问控制工具
  8. Futter基础第5篇: 实现列表、动态列表【ListView、ListView.builder】
  9. 【java】 jsp网页session和application,全局变量方法
  10. Lua学习小记——语言
  11. 什么是OM3、OM4光纤跳线?
  12. testbench实例 vhdl_[转载]VHDL的testbench的编写
  13. chrome插件-Web开发者助手 FeHelper
  14. 诺基亚n1平板电脑刷机教程_Z Launcher详细使用教程_诺基亚 N1_平板电脑新闻-中关村在线...
  15. 微信小程序如何上传图片
  16. Win10应用商店无法下载XBOX怎么办?
  17. 2021-2-2有道翻译在线翻译爬虫
  18. “刀片嗓”“水泥鼻”“咳出肺”可以这样缓解!
  19. 如何用python来打印一个三角形
  20. c++ 函数后面加一个冒号的含义

热门文章

  1. Fractal Streets(经典分形递归+坐标旋转)
  2. 苹果笔记本上网很慢怎么回事?macbook无线上网慢的解决方法
  3. 番茄时间管理——规则
  4. android自定义相机打开闪光灯,Android 照相机(闪光灯,切换摄像头)
  5. 机器学习 最小角回归 LARS
  6. 搞定计算机网络面试,看这篇就够了
  7. (CVE-2020-11800)Zabbix_Server_trapper_命令注入漏洞
  8. flex局部的知识总结
  9. Docker 定制容器镜像的2种方法
  10. How to solve the lossless offline problem of Spring Cloud Alibaba service instance in Kubernetes