当前位置: 首页 > 专利查询>东南大学专利>正文

基于主观福祉最大化的交通网络设计软件制造技术

技术编号:22595009 阅读:39 留言:0更新日期:2019-11-20 11:14
本发明专利技术采用R语言开发了一种基于出行者主观福祉最大化的交通网络设计软件。从算法上,这是一个双层模型,其上层用于实现给定投资预算下的出行者主观福祉最大化,下层是Nested Logit模型和用户均衡模型之间的反馈过程。由于出行需求预测采用了离散选择模型,这也使得可以对出行者的主观福祉进行测度。然而,双层模型的求解非常具有挑战性,传统的优化算法难以获得全局最优解,本软件设计了一种模拟退火算法来寻找最优解。从开发语言上,R语言开源免费,矩阵语言算法效率高,使得本软件易于为科研人员和业界使用。仿真研究表明,本发明专利技术可以有效找到给定投资预算下出行者主观福祉最大的交通网络设计。

Traffic network design software based on subjective well-being maximization

The invention uses R language to develop a traffic network design software based on maximizing the subjective well-being of travelers. In terms of algorithm, this is a two-tier model, the upper layer is used to maximize the subjective well-being of travelers under a given investment budget, and the lower layer is the feedback process between nested logit model and user equilibrium model. Because of the discrete choice model, the subjective well-being of travelers can be measured. However, the solution of the bilevel model is very challenging. The traditional optimization algorithm is difficult to obtain the global optimal solution. This software designs a simulated annealing algorithm to find the optimal solution. In terms of development language, R language is open-source and free, and matrix language algorithm is efficient, which makes the software easy for researchers and the industry to use. Simulation research shows that the invention can effectively find the traffic network design with the largest subjective well-being of travelers under a given investment budget.

【技术实现步骤摘要】
基于主观福祉最大化的交通网络设计软件
:本专利技术采用R语言开发了一种基于主观福祉最大化的交通网络设计方法,属于交通工程

技术介绍
:以用户为中心的移动服务是未来新兴的移动服务之一。与传统的以车辆为中心的移动服务不同,其主张以提升用户体验为中心的移动解决方案。虽然有很多方法可以测度用户体验,但主观福祉或社会福利是最常见的指标。高福祉意味着个人或群体的体验是积极的,而低福祉则与消极的体验相关联。福祉研究分为主观福祉研究和客观福祉研究。客观福祉通常指的是总体水平上的消费者剩余。它被定义为消费者愿意或能够支付某项产品或服务的总金额与他们实际支付的总金额之间的差额。主观福祉则指的是基于消费者个人效用的社会福利。它是将消费者从产品或服务中获得的所有个人效用相加而成的。客观福祉在弹性出行需求的交通网络设计中得到了广泛应用。它通常表现为消费者剩余,甚至有时称为社会福利。应当指出的是,虽然消费者剩余和社会福利在经济学中是两个不同的概念,但在以往的交通网络分析中这两个概念是可以互换的。它们都是指消费者愿意或能够支付的总出行费用与他们实际支付的总本文档来自技高网...

【技术保护点】
1.本专利技术采用R语言开发了一种基于主观福祉最大化的交通网络设计软件,该软件在算法上是一种双层模型,具体包括以下特征:/n(1)上层模型是通过调整交通网络设计使得出行者的主观福祉最大化,主观福祉的测度基于非集计的离散选择模型,具体一点,对于出行生成和目的地选择采用了Nestedlogit模型,这使得可以对出行者的主观福祉进行测度;/n(2)下层模型是交通系统平衡,其是用于出行-目的地选择的Nested logit模型和用于交通配流的用户平衡模型之间的反馈迭代过程,是出行者对于上层交通网络设计作出的一系列行为反应,对于每一个上层交通网络设计都对应一个下层交通系统平衡,在此基础上进行出行者主观福...

【技术特征摘要】
1.本发明采用R语言开发了一种基于主观福祉最大化的交通网络设计软件,该软件在算法上是一种双层模型,具体包括以下特征:
(1)上层模型是通过调整交通网络设计使得出行者的主观福祉最大化,主观福祉的测度基于非集计的离散选择模型,具体一点,对于出行生成和目的地选择采用了Nestedlogit模型,这使得可以对出行者的主观福祉进行测度;
(2)下层模型是交通系统平衡,其是用于出行-目的地选择的Nestedlogit模型和用于交通配流的用户平衡模型之间的反馈迭代过程,是出行者对于上层交通网络设计作出的一系列行为反应,对于每一个上层交通网络设计都对应一个下层交通系统平衡,在此基础上进行出行者主观福祉的测度,将结果反馈回上层模型;
(3)使用模拟退火算法求解该双层模型。


2.对于权利1中的算法采用R语言编写,具体归纳如下:
#基于主观福祉最大化的交通网络设计软件
#弹性交通需求(nestedlogit):生成平衡的OD出行时间
#步骤1:初始化,按格式输入数据和必要的包
#1.1加载计算最短路径的包,准备调用dijkstra最短路径算法,注意igraph包首次使用需要安装,然后才能调用
#install.packages(″igraph″)#首次运行时需要安装igraph包
library(igraph)
options(digits=3)
#1.2创建网络的信息矩阵,包含所有的路段,第一列为路段标号(Road),第二列为路段起点标号(Roadorigin),第三列为路段终点标号(Roaddestination),第四列为该路段自由流时间(freeflowtime),第五列为道路通行能力(capacity),第六列为道路长度(length),此处以交通研究中常用的Nguyen-Dupuis网络为例,详细的参数设置可参考程序文档
#也可以在Excel中复制,然后执行
#e=read.delim(″clipboard″,header=F)
e=matrix(c(1,1,5,7.0,800,4.00,2,1,12,9.0,400,6.00,3,4,5,9.0,200,5.00,4,4,9,12.0,800,8.00,5,5,6,3.0,350,2.00,6,5,9,9.0,400,5.00,7,6,7,5.0,800,3.00,8,6,10,13.0,250,8.00,9,7,8,5.0,250,3.00,10,7,11,9.0,300,6.00,11,8,2,9.0,550,5.00,12,9,10,10.0,550,6.00,13,9,13,9.0,600,5.00,14,10,11,6.0,700,4.00,15,11,2,9.0,500,6.00,16,11,3,8.0,300,5.00,17,12,6,7.0,200,4.00,18,12,8,14.0,400,6.00,19,13,3,11.0,600,7.00),ncol=6,byrow=TRUE)
colnames(e)=c(″Road″,″Roadorigin″,″Roaddestination″,″FreeTime″,″Roadcapacity″,″Roadlength″)
#e#用于检查程序的断点
#1.3输入交通需求矩阵d0,第一列为起讫点对的标号(ODpair),第二列为起点标号(origin),第三列为终点标号(destination),第四列为交通需求(demand)
sg=c(2000,3000)#各小区的潜在交通发生量,注意Nguyen-Dupuis网络中只有两个起点
d0=matrix(c(1,1,2,0.5*sg[1],2,1,3,0.5*sg[1],3,4,2,0.5*sg[2],4,4,3,0.5*sg[2]),ncol=4,byrow=TRUE)#初始交通分配方案,这里使用了平均分布
colnames(d0)=c(″ODpair″,″Origin″,″Destination″,″Demand″)
#d0#用于检查程序的断点
#交通配流函数:自定义的用于交通配流的Frank-Wolfe算法函数,注意输入的需求矩阵d形式如d0,交通网络e的形式如上面的e,迭代停止的相对误差(RRSE)为0.01
fw=function(e,d)
{
#1.4根据路径自由流时间计算各个OD对的最短路径和路径流量
g=add.edges(graph.empty(13),t(e[,2:3]),weight=e[,4])#创建图,13为节点的个数,以时间为权重而非路径的长度
b12=get.shortest.paths(g,from=″1″,to=″2″,mode=″out″,output=″epath″)$epath[[1]]#从起点1到终点2的最短路径
b13=get.shortest.paths(g,from=″1″,to=″3″,mode=″out″,output=″epath″)$epath[[1]]#从起点1到终点3的最短路径
b42=get.shortest.paths(g,from=″4″,to=″2″,mode=″out″,output=″epath″)$epath[[1]]#从起点4到终点2的最短路径
b43=get.shortest.paths(g,from=″4″,to=″3″,mode=″out″,output=″epath″)$epath[[1]]#从起点4到终点3的最短路径
#创建一个矩阵,用于保存各个OD对的最短路径和流量
V=cbind(e[,1])
st0=numeric(4)#存放各OD对自由流最短行驶时间
colnames(V)=″Road″
V
#OD对12的最短路径和流量
sp12=as.vector(b12)#转化为路段标号(Road)
st0[1]=sum(e[sp12,4])#各路段时间求和
x12=cbind(e[sp12,1],rep(d[1,4],length(sp12)))#路段标号和流量,算法中的迭代起点
colnames(x12)=c(″Road″,″V12″)
x12
V=merge(V,x12,by=″Road″,all=TRUE)#定义V为专门保存迭代起点的矩阵
V[is.na(V)]=0
V
#OD对13的最短路径和流量
sp13=as.vector(b13)#转化为路段标号(Road)
st0[2]=sum(e[sp13,4])#各路段时间求和
x13=cbind(e[sp13,1],rep(d[2,4],length(sp13)))#路段标号和流量,算法中的迭代起点
colnames(x13)=c(″Road″,″V13″)
x13
V=merge(V,x13,by=″Road″,all=TRUE)#定义V为专门保存迭代起点的矩阵
V[is.na(V)]=0
V
#OD对42的最短路径和流量
sp42=as.vector(b42)#转化为路段标号(Road)
st0[3]=sum(e[sp42,4])#各路段时间求和
x42=cbind(e[sp42,1],rep(d[3,4],length(sp42)))#路段标号和流量,算法中的迭代起点
colnames(x42)=c(″Road″,″V42″)
x42
V=merge(V,x42,by=″Road″,all=TRUE)#定义V为专门保存迭代起点的矩阵
V[is.na(V)]=0
V
#OD对43的最短路径和流量
sp43=as.vector(b43)#转化为路段标号(Road)
st0[4]=sum(e[sp43,4])#各路段时间求和
x43=cbind(e[sp43,1],rep(d[4,4],length(sp43)))#路段标号和流量,算法中的迭代起点
colnames(x43)=c(″Road″,″V43″)
x43
V=merge(V,x43,by=″Road″,all=TRUE)#定义V为专门保存迭代起点的矩阵
V[is.na(V)]=0
V
#当所有最短路径上的流量求和,得到初始流量
VS=rowSums(V[,seq(ncol(V)-3,ncol(V))])
VS
#步骤2:更新各路段的阻抗
t0=e[,4]#自由流时间
c=e[,5]#道路通行能力
a=0.15
b=4
tp=function(v){
t0*(1+a*(v/c)^b)
}
repeat{
#步骤3:寻找下一个迭代方向
g2=add.edges(graph.empty(13),t(e[,2:3]),weight=tp(VS))#构造图,13为节点的个数,调用步骤2定义的路段阻抗更新函数
b12=get.shortest.paths(g2,from=″1″,to=″2″,mode=″out″,output=″epath″)$epath[[1]]#从起点1到终点2的最短路径
b13=get.shortest.paths(g2,from=″1″,to=″3″,mode=″out″,output=″epath″)$epath[[1]]#从起点1到终点3的最短路径
b42=get.shortest.paths(g2,from=″4″,to=″2″,mode=″out″,output=″epath″)$epath[[1]]#从起点4到终点2的最短路径
b43=get.shortest.paths(g2,from=″4″,to=″3″,mode=″out″,output=″epath″)$epath[[1]]#从起点4到终点3的最短路径
#创建一个临时矩阵,用于保存各个OD对的最短路径和流量
V=cbind(e[,1])
colnames(V)=″Road″
V
#OD对12的最短路径和流量
sp12=as.vector(b12)#转化为路段标号(Road)
x12=cbind(e[sp12,1],rep(d[1,4],length(sp12)))#路段标号和流量,算法中的迭代起点
colnames(x12)=c(″Road″,″V12″)
x12
V=merge(V,x12,by=″Road″,all=TRUE)#定义V为专门保存迭代起点的矩阵
V[is.na(V)]=0
V
#OD对13的最短路径和流量
sp13=as.vector(b13)#转化为路段标号(Road)
x13=cbind(e[sp13,1],rep(d[2,4],length(sp13)))#路段标号和流量,算法中的迭代起点
colnames(x13)=c(″Road″,″V13″)
x13
V=merge(V,x13,by=″Road″,all=TRUE)#定义V为专门保存迭代起点的矩阵
V[is.na(V)]=0
V
#OD对42的最短路径和流量
sp42=as.vector(b42)#转化为路段标号(Road)
x42=cbind(e[sp42,1],rep(d[3,4],length(sp42)))#路段标号和流量,算法中的迭代起点
colnames(x42)=c(″Road″,″V42″)
x42
V=merge(V,x42,by=″Road″,all=TRUE)#定义V为专门保存迭代起点的矩阵
V[is.na(V)]=0
V
#OD对43的最短路径和流量
sp43=as.vector(b43)#转化为路段标号(Road)
x43=cbind(e[sp43,1],rep(d[4,4],length(sp43)))#路段标号和流量,算法中的迭代起点
colnames(x43)=c(″Road″,″V43″)
x43
V=merge(V,x43,by=″Road″,all=TRUE)#定义V为专门保存迭代起点的矩阵
V[is.na(V)]=0
V
#当所有最短路径上的流量求和,得到迭代方向
VS2=rowSums(V[,seq(ncol(V)-3,ncol(V))])
VS2
#步骤4:计算迭代步长,调用optimize函数进行一维搜索
step=function(lamda){
x2=VS2
x1=VS
q=x1+lamda*(x2-x1)
sum((x2-x1)*tp(q))
}
#lamda=uniroot(step,c(0,1))$root#注意lamda的取值范围,步长不能太长,uniroot要求c(0,1)两端的函数值符号相反,有的函数不一定满足,采用optimize函数可以确保找到一元函数的最优值
g=function(lamda){step(lamda)^2}
lamda=optimize(g,c(0,1))$minimum
lamda
#步骤5:确定新的迭代起点
VS3=VS+lamda*(VS2-VS)
VS3
#步骤6:收敛性检验
if((sqrt(sum((VS3-VS)^2))/sum(VS))<0.01)break#满足收敛条件就退出
VS=VS3#如果不满足收敛条件则用新点VS3替代原点VS,如此循环直到收敛
}
#步骤7:输出平衡状态的结果矩阵result和OD行驶时间矩阵u
#步骤7.1:输出平衡状态各路径的流量、通行时间和速度
result=cbind(e[,1],round(VS,0),tp(VS),e[,6]/(tp(VS)/60),e[,5],round(VS,0)/e[,5])
colnames(result)=c(″Road″,″Volume″,″Time″,″Speed″,″RoadCapacity″,″LevelofService″)
#步骤7.2:输出各OD行驶时间矩阵u
g=add.edges(graph.empty(13),t(e[,2:3]),weight=result[,3])#创建图,13为节点的个数,result为步骤7生成的矩阵
b12=get.shortest.paths(g,from=″1″,to=″2″,mode=″out″,output=″epath″)$epath[[1]]#从起点1到终点2的最短路径
b13=get.shortest.paths(g,from=″1″,to=″3″,mode=″out″,output=″epath″)$epath[[1]]#从起点1到终点3的最短路径
b42=get.shortest.paths(g,from=″4″,to=″2″,mode=″out″,output=″epath″)$epath[[1]]#从起点4到终点2的最短路径
b43=get.shortest.paths(g,from=″4″,to=″3″,mode=″out″,output=″epath″)$epath[[1]]#从起点4到终点3的最短路径
#创建一个行驶时间矩阵,用于保存各个OD对的行程时间,初始假设各OD行程时间为0
u=matrix(c(1,1,2,0,2,1,3,0,3,4,2...

【专利技术属性】
技术研发人员:林宏志尹璐
申请(专利权)人:东南大学
类型:发明
国别省市:江苏;32

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1