交通分配 代码 ue python_Logit随机用户均衡交通分配问题(SUE-TAP)的基本原理及编程实现...

本文详细介绍了随机用户均衡(SUE)交通分配问题的基本原理,包括模型假设、Fisk模型、无约束优化模型,并阐述了自适应平均法的算法步骤。此外,还提供了C#代码实现的概述,包括网络数据结构的构建和文件读取。案例展示了在Sioux Falls网络中的应用和结果。
摘要由CSDN通过智能技术生成

39e387968e9ad194fd22c0ce2b240229.png

引言:

从本科的课程《交通规划》开始,我们就学习了UE平衡和交通分配(Traffic Assignment)的概念。然而,UE交通分配假设所有的出行者能精确获取整个网络的出行信息,且能准确估算所有路径的出行费用。因此UE对出行者出行行为的刻画并不准确。随机用户均衡(SUE)考虑了出行者感知的出行费用,能更好地描述出行者在网络中的出行选择行为。

本文详细介绍了SUE交通分配问题的基本原理及编程实现过程,与之前的文章《Frank-Wolfe算法基本原理及编程实现》、《随机交通分配Dial算法基本原理及C++并行计算实现》一脉相承,属于Lab“交通流分配”栏目的优质推文。

(注:文中重要的公式和算法用红色五角星★标明,以方便查询)

1 SUE基本原理

1.1 模型假设:

在SUE模型中,假设出行者不能够准确的估计出行阻抗,对实际的出行阻抗有一个理解误差。因此,出行者理解的路径出行费用包含两个部分:实际的路径出行费用和出行费用的理解误差。我们有:

fe9fd99f1290da2adfdc302995a94146.png

其中,第二项是理解出行费用的随机项。

当理解出行费用的随机项服从独立同分布的Gumbel分布时,我们可以得到多项式的Logit模型。此时,理解的路径出行费用是路径流量和路径出行费用的函数,具体如下:

45d3a1dbf4783948ab96041ddd21e19e.png

其中,离散参数θ反映了出行者对于理解阻抗的聚合度量。

1.2 Fisk模型

SUE的均衡条件可以表述如下(Daganzo和Sheffi,1977):在一个随机用户平衡的网络中,没有出行者可以通过单方面改变自己的路径选择来降低自己的理解出行阻抗。Fisk(1980)构造了如下非线性规划问题来描述基于Logit的SUE问题:

f4d7ff68ffd0f6c8a164f04b1b8d73d0.png

上述数学规划问题是一个线性约束下的非线性规划问题。其中,目标函数是人工构造出来的,没有确切的物理含义。当阻抗函数ta(xa)是一个严格凸函数时,该数学规划问题是一个凸规划问题,且路段流量x和路径流量f都具有唯一最优解。

1.3 无约束优化模型

SUE问题可以描述为如下无约束优化问题(Sheffi和Powell,1982):

0ba59a9df1991eefd9f317b4dcfe72c1.png

其中,Sw是满意度函数,并有

0a199571ed9f72b17db91d6780efd6be.png

对于基于Logit的SUE问题,满意度函数为

be08fc7b233012cac5bef32fd3bc8b23.png

满意度函数关于路径出行费用的偏导等于路径选择概率,即有

0c52cc99e9093c7e19591eafdd668e48.png

对于基于Logit的SUE问题,把(6)式代入(7)式,我们有

4ebd4932621c75f0b49314f890940ee5.png

依据定义,我们有

2e85c20fc98fea2363ae155c4bd50dbd.png

于是,我们可以得到无约束优化问题式(4)的目标函数的梯度为:

26ea3dfab01edc5ad282a509f8e22d45.png

对于无约束优化问题式(4),我们可以采用如下可行下降方向:

09dbc024b0da103e7e53577584a9a5bf.png

1.4 路径集的生成

一般而言,路径集的生成对于静态SUE问题是必须的,否则可能造成算法不收敛。很多算法,如Dial(1971)提出的STOCH方法和k短路方法,可以用来生产随机交通分配所需的路径集。

预计在本栏目的下一篇推文为大家详细介绍路径集的生成!需要路径集文件的同学可以点击文末的“阅读原文”获取本文采用的路径集数据。

1.5 自适应平均法

采用自适应平均法求解SUE交通分配问题的详细算法步骤如下(Liu等,2009):

c585bef574b5c588504ede9ea3ddaab4.png

2 求解SUE代码详解

考虑算法的计算量和网络规模,本文以C#语言为例进行代码讲解,擅长使用其他语言的读者可作为参考。

2.1 代码文件Network的编写

(1)准备工作

首先在项目中新建名为“Network.cs”的代码文件(主函数main在默认的“Program.cs”文件中),Network文件开头引用如下命名空间。

using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;

(2)创建描述网络基本属性的类

构建三个类,分别对应网络的节点(CNode)、路段(CLink)、OD对(CODPairs)和路径(CPath),每读取一个网络的节点,就相当于在类CNode中创建一个新的对象。这些类是网络数据结构的基础,在类中分别声明节点、路段、OD对和路径的属性,具体属性见代码的注释部分。

// 节点
public class CNode
{
    public int ID; // 节点的编号,从零开始编号
    public double PositionX; // 节点的X坐标
    public double PositionY; // 节点的Y坐标
    public int Origin_ID = -1; // 节点对应的起点编号,-1表示不是起点
    public List<int> IncomingLink = new List<int>(); // 进入节点的路段编号集合
    public List<int> OutgoingLink = new List<int>(); // 离开节点的路段编号集合	
}


// 路段
public class CLink
{
    public int ID; // 路段的编号,从零开始编号
    public CNode pInNode; // 路段的起节点
    public CNode pOutNode; // 路段的终节点
    public double FreeFlowTravelTime; // 自由流走行时间
    public double TravelTime; // 走行时间
    public double Capacity; // 路段通行能力
    public double Alpha = 0.15; // BPR函数参数,一般取0.15
    public double Power = 4.0; // BPR函数参数,一般取4.0
}


// OD对
public class CODPairs
{
    public int ID; // 起点的编号,从零开始编号
    public List<int> pODNode = new List<int>(); // OD对起点和终点的列表[O,D]
    public double ODDemand; // OD需求
    public int m_nODPath; // OD对之间的路径数量
    public List<int> pODPath = new List<int>(); // OD对之间的路径集合
    public List<double> ChoiceProb = new List<double>(); // OD对之间所有路径被选择的概率
}


// 路径path
public class CPath
{
    public
  • 8
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值