用matlab实现交通分布预测方法——增长系数法

前言

对于我的第一篇文章:Matlab实现交通分布预测方法 —— 增长系数法 | 平均增长率法、底特律法、福莱特法,有不少同学私信我询问关于如何在 matlab 中调用函数、拆分代码以及需要大量调用的问题。于是我便想着把内容做一些优化,放在这篇文章里。

原来那篇文章开头有我写第一次文章时的感慨,每次打开看到感觉和下面相对理性的内容不符。。

增长系数法算法步骤

首先准备条件要有:

  • 现状完整 OD 表
  • 将来 OD 表中各小区发生、吸引交通量及生成总量

算法流程图如下:

算法流程图

matlab 代码

原来那篇文章,我是设置的交互式代码,即需要在命令行手动输入选择的方法。当需要大量使用时,有些不便。于是我把每个方法都封装成一个函数,需要哪个调用即可。

另外有些同学没有 matlab 基础,不知道如何调用函数,可以看我原来那篇文章里的使用说明部分。如果还是有困难,有需求的人多的话,我会出一期视频教程。

平均增长系数法

先上代码:

function [ res,o,d,m,T,Fo,Fd] = func_Average( od_now,U,V )
%FUNC_AVERAGE 平均增长系数法
%  res 为最终预测的od矩阵
%  o,d分别为未来各小区的总吸引量、发生量
%  m为迭代次数,T为未来出行生成总量
%  Fo,Fd分别为最终发生、吸引增长系数值
%  od_now 为现状OD矩阵(n x n) 
%  U为未来各小区发生量,V为未来各小区吸引量,均为行向量。
n=size(od_now,1);     % 小区个数
O = sum(od_now,2)';    % 现状小区发生量
D = sum(od_now,1);    % 现状小区吸引量
% 计算发生增长系数和吸引增长系数
F_o = U ./ O;   F_d = V ./ D;
alpha = 0.03;    % 误差常数
m = 0;     % 记录迭代次数
while true     % 开始循环
    m = m+1;
    % 计算系数
    f = zeros(n);
    for i = 1:n
      for j = 1:n
         f(i,j)=0.5*(F_o(i)+F_d(j)); 
      end
    end
    % 计算新od表
    od_now = f .* od_now;
    % 更新现状O和D
    O = sum(od_now,2)';    
    D = sum(od_now,1);
    % 计算新的发生和吸引系数
    F_o = U ./ O;   F_d = V ./ D;
    % 判断收敛
    if abs([F_o,F_d]-1) <= alpha
       res = od_now;
       o = sum(res,2)';
       d = sum(res,1);
       T = sum(o);
       Fo = F_o;
       Fd = F_d;
       break
    elseif m >= 100
        disp('请注意,迭代已超过100次,下面输出第100次迭代结果。');
        res = od_now;
        o = sum(res,2)';
        d = sum(res,1);
        T = sum(o);
        Fo = F_o;
        Fd = F_d;
        break
    end
end
end

我实现增长,用的是两个矩阵点乘。唯一相较困难的是增长系数放在循环结构里的位置。下面其他方法基本上如法炮制。

底特律法

function [ res,o,d,m,T,Fo,Fd] = func_Detroit( od_now,U,V )
%FUNC_Detroit 平均增长系数法
%  res 为最终预测的od矩阵
%  o,d分别为未来各小区的总吸引量、发生量
%  m为迭代次数,T为未来出行生成总量
%  Fo,Fd分别为最终发生、吸引增长系数值
%  od_now 为现状OD矩阵(n x n) 
%  U为未来各小区发生量,V为未来各小区吸引量,均为行向量。
n=size(od_now,1);     % 小区个数
O = sum(od_now,2)';    % 现状小区发生量
D = sum(od_now,1);    % 现状小区吸引量
% 计算发生增长系数和吸引增长系数
F_o = U ./ O;   F_d = V ./ D;
alpha = 0.03;    % 误差常数
m = 0;     % 记录迭代次数
while true     % 开始循环
    m = m+1;
    % 计算系数
    G = sum(O)/sum(U);  % 生成量增长率的倒数
    f = zeros(n);
    for i = 1:n
      for j = 1:n
         f(i,j)=G*F_o(i)*F_d(j); 
      end
    end
    % 计算新od表
    od_now = f .* od_now;
    % 更新现状O和D
    O = sum(od_now,2)';    
    D = sum(od_now,1);
    % 计算新的发生和吸引系数
    F_o = U ./ O;   F_d = V ./ D;
    % 判断收敛
    if abs([F_o,F_d]-1) <= alpha
       res = od_now;
       o = sum(res,2)';
       d = sum(res,1);
       T = sum(o);
       Fo = F_o;
       Fd = F_d;
       break
    elseif m >= 100
        disp('请注意,迭代已超过100次,下面输出第100次迭代结果。');
        res = od_now;
        o = sum(res,2)';
        d = sum(res,1);
        T = sum(o);
        Fo = F_o;
        Fd = F_d;
        break
    end
end
end

福莱特法

function [ res,o,d,m,T,Fo,Fd] = func_Fratar( od_now,U,V )
%FUNC_Detroit 平均增长系数法
%  res 为最终预测的od矩阵
%  o,d分别为未来各小区的总吸引量、发生量
%  m为迭代次数,T为未来出行生成总量
%  Fo,Fd分别为最终发生、吸引增长系数值
%  od_now 为现状OD矩阵(n x n) 
%  U为未来各小区发生量,V为未来各小区吸引量,均为行向量。
n=size(od_now,1);     % 小区个数
O = sum(od_now,2)';    % 现状小区发生量
D = sum(od_now,1);    % 现状小区吸引量
% 计算发生增长系数和吸引增长系数
F_o = U ./ O;   F_d = V ./ D;
alpha = 0.03;    % 误差常数
m = 0;     % 记录迭代次数
while true     % 开始循环
    m = m+1;
    % 计算系数
    f = zeros(n);
    for i = 1:n
      for j = 1:n
         Li = O(j)/sum((od_now(:,j)' .* F_d));
         Lj = D(i)/sum((od_now(i,:) .* F_o));
         f(i,j)=0.5*(Li+Lj)*F_o(i)*F_d(j); 
      end
    end
    % 计算新od表
    od_now = f .* od_now;
    % 更新现状O和D
    O = sum(od_now,2)';    
    D = sum(od_now,1);
    % 计算新的发生和吸引系数
    F_o = U ./ O;   F_d = V ./ D;
    % 判断收敛
    if abs([F_o,F_d]-1) <= alpha
       res = od_now;
       o = sum(res,2)';
       d = sum(res,1);
       T = sum(o);
       Fo = F_o;
       Fd = F_d;
       break
    elseif m >= 100
        disp('请注意,迭代已超过100次,下面输出第100次迭代结果。');
        res = od_now;
        o = sum(res,2)';
        d = sum(res,1);
        T = sum(o);
        Fo = F_o;
        Fd = F_d;
        break
    end
end
end

测试

用邵春福老师的第二版《交通规划原理》中的例子来测试一下。

测试例子数据

新建一个脚本文件,放进以下代码:

clear;clc
od_now = [17 7 4;
     7 38 6;
     4 5 17;];   % 现状od
U=[38.6 91.9 36]; % 未来各小区发生量
V=[39.3 90.3 36.9]; % 未来各小区吸引量
% [ res,o,d,m,T] = func_Average(od_now, U, V);
% [ res,o,d,m,T] = func_Detroit(od_now, U, V);
[ res,o,d,m,T] = func_Fratar(od_now, U, V);

倒数三行代码是用来调用函数的,想使用哪个方法,就去掉其前面的百分号注释,像现在就是在使用福莱特法。各种方法得到的 res 结果如下:

平均增长系数法测试结果

底特律法测试结果

福莱特法测试结果

除了底特律法外,其他结果和书中非常接近,应该是四舍五入的问题。底特律法的结果我猜测是书中的结果有误,因为我用计算器跟着书上的例子算了一遍,最后一步迭代的时候,书上算错了。

红框部分,用计算器按一下就知道结果不对。计算器的结果和我代码跑出来的结果对得上。

我原来的文章是用的王炜老师的第二版《交通规划》中的算例。可以发现这俩算例数据和步骤一模一样,底特律法结果同样是有问题的,可能是数字太多疏忽了吧。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】MySQL从0到0.9 - 持续更新ing

MySQL SQL 基础 DDL 语句 show databases; show tables; desc table_name; # 获取表信息 show create table 表名; // 查询指定表的建表语句 数据类型 char(10) 不满10个会用空格填充&#xff0c;性能好一点 varchar(10) 变长字符串&#xff0c;性能差一点 CREATE TABLE tabl…

nginx设置缓存时间

一、设置缓存时间 当网页数据返回给客户端后&#xff0c;可针对静态网页设置缓存时间&#xff0c;在配置文件内的http段内server段添加location&#xff0c;更改字段expires 1d来实现&#xff1a;避免重复请求&#xff0c;加快访问速度 第一步&#xff1a;修改主配置文件 #修…

[NOIP2011 普及组] 数字反转

AC代码&#xff1a; #include<iostream>using namespace std;int main() {long long n;cin >> n;long long temp n;long long sum 0;while(temp ! 0){int c temp % 10;sum sum * 10 c;temp temp / 10;}printf("%lld",sum);return 0; }

Spring 中 ApplicationContext 和 BeanFactory 的区别有哪些

先看一张类图&#xff1a; 区别&#xff1a; 1&#xff1a;包目录不同&#xff1a; spring-beans.jar 中 org.springframework.beans.factory.BeanFactory spring-context.jar 中 org.springframework.context.ApplicationContext 2&#xff1a;国际化&#xff1a; BeanFacto…

APP被针对攻击了,要怎么解决

随着APP行业的兴起&#xff0c;游戏公司异军突起&#xff0c;不管是在控证还是攻击方面都是属于最复杂的一个场面&#xff0c;游戏APP逐渐成为DDOS流量攻击的“重灾区”。没有提前做好了解就盲目进军游戏APP行业&#xff0c;一旦被攻击就会让公司束手无策。那么&#xff0c;刚上…

Python从入门到精通指南【第101篇—入门到精通】【文末送书-24】

文章目录 Python从入门到精通指南第一步&#xff1a;入门基础1.1 安装Python1.2 Hello World1.3 变量和数据类型1.4 控制流程 第二步&#xff1a;深入学习2.1 函数和模块2.2 列表、元组和字典2.3 文件操作 第三步&#xff1a;高级主题3.1 面向对象编程3.2 异常处理3.3 正则表达…

python_pyecharts绘制漏斗图

python-pyecharts绘制漏斗图 from pyecharts.charts import Funnel from pyecharts import options as opts# 数据 data [("访问", 100), ("咨询", 80), ("订单", 60), ("点击", 40), ("展现", 20)]# 创建漏斗图 funnel …

Qt OpenGL程序在Windows下正常,但在Linux下无显示问题【已解决】

Qt OpenGL程序在Windows下正常&#xff0c;但在Linux下无显示问题【已解决】 引言一、问题描述二、解决方案三、解决过程记录3.1 定位问题3.2 解决问题&#xff0c;深入分析 引言 在Windows上正常运行的OpenGL程序&#xff0c;到Linux下正常编译…但是没有任何显示(只有背景颜…

【数据结构与算法】动态规划法解题20240227

动态规划法 一、什么是动态规划二、动态规划的解题步骤三、509. 斐波那契数1、动规五部曲&#xff1a; 四、70. 爬楼梯1、动规五部曲&#xff1a; 五、746. 使用最小花费爬楼梯1、动规五部曲&#xff1a; 一、什么是动态规划 动态规划&#xff0c;英文&#xff1a;Dynamic Pro…

23年中科院1区算法|长鼻浣熊优化算法COA原理及其利用与改进(Matlab/Python)

文章来源于我的个人公众号&#xff1a;KAU的云实验台&#xff0c;主要更新智能优化算法的原理、应用、改进 CEC2005中的测试 本文 KAU将介绍一个2023年1月发表在中科院1区KBS上的优化算法——长鼻浣熊优化算法(Coati Optimization Algorithm&#xff0c;COA)[1] 该算法由Dehg…

SpringBoot源码解读与原理分析(三十四)SpringBoot整合JDBC(三)声明式事务的传播行为控制

文章目录 前言10.5 声明式事务的传播行为控制10.5.1 修改测试代码&#xff08;1&#xff09;新建一个Service类&#xff0c;并引用UserService&#xff08;2&#xff09;修改主启动类 10.5.2 PROPAGATION_REQUIRED10.5.2.1 tm.getTransaction&#xff08;1&#xff09;获取事务…

IO进程线程作业day7

信号灯集共享内存 自定义头文件 #ifndef SEM_H_ #define SEM_H_ //创建信号灯集, int creat_t(int number); //申请释放资源 int P(int semid,int semno); //申请释放资源 int V(int semid,int semno); //删除信号灯集 int del(int semid); #endif信号灯集函数集合 #include…

物资管理新篇章:Java+SpringBoot实战

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

基于 ResNet50和 SVM + 决策树的人脸口罩检测

欢迎收看&#xff0c;这篇文章是关于我如何使用 ResNet50作为特征提取器来构建掩码检测&#xff0c;然后使用支持向量机(SVM) 决策树和叠加集成方法作为分类器的一个快速解释。 为了向研究人员致敬&#xff0c;这个应用程序是基于研究论文&#xff0c;题目是“在2019冠状病毒…

分布式应用:kylin 部署 zabbix 监控平台

目录 一、实验 1.环境 2. kylin 修改mysql数据库 3. kylin 部署 zabbix 监控平台 4. kylin 修改 zabbix 配置 5. kylin 修改zabbix web 二、问题 1. zabbix_server 查看版本报错 2.zabbix_server 文件如何去掉注释"#"和空行 3. zabbix图表显示异常 4.zabbi…

前端常见面试题之vue3

文章目录 1. vue3比vue2有哪些优势2. 描述vue3的生命周期3. 如何看待vue3中的Composition API 和 Options API4. 如何理解ref、 toRef、和toRefs?5. vue3升级了哪些功能6. Composition API如何实现代码逻辑的复用&#xff08;hook)7. Vue3如何实现响应式的8.Vue3使用Proxy对象…

2-22 方法、面向对象、类、JVM内存、构造方法

文章目录 方法的重载面向对象类、属性和方法成员变量默认值属性JVM简单内存分析栈空间堆空间 构造方法执行过程构造器注意点 方法的重载 一个类中名称相同&#xff0c;但是参数列表不同的方法 参数列表不同是指&#xff1a; 形参类型形参个数形参顺序 面向对象 field —— …

linux系统---防火墙拓展

目录 一、iptables 1.基本语法 2.四表五链——重点记忆 2.1四表 2.2五链 2.3总结 3.iptables选项示例 3.1 -Z 清空流量计数 3.2 -P 修改默认规则 3.3 -D 删除规则 3.4 -R 指定编号替换规则 4.白名单 5.通用匹配 6.示例 6.1添加回环网卡 6.2可以访问端口 6.3 主…

架构设计实践:熟悉架构设计方法论,并动手绘制架构设计图

文章目录 一、架构设计要素1、架构设计目标2、架构设计模式&#xff08;1&#xff09;分而治之&#xff08;2&#xff09;迭代式设计 3、架构设计的输入&#xff08;1&#xff09;概览&#xff08;2&#xff09;功能需求 - WH分析法&#xff08;3&#xff09;质量 - “怎么”分…

都说了别用BeanUtils.copyProperties,这不翻车了吧

分享是最有效的学习方式。 博客&#xff1a;https://blog.ktdaddy.com/ 故事 新年新气象&#xff0c;小猫也是踏上了新年新征程&#xff0c;自从小猫按照老猫给的建议【系统梳理大法】完完整整地梳理完毕系统之后&#xff0c;小猫对整个系统的把控可谓又是上到可一个新的高度。…