交通规划中的基于MSA的DAIL算法

  • 主函数

% 本方法需要用到matlab网络图工具箱
%% 输入初始信息%O=[1,1,2,2,3,4,4,5,5,6,7,8,9];%网络节点%D=[2,4,3,5,6,5,7,6,8,9,8,9,9];%网络节点 %W=[2,2,2,2,2,1,2,1,2,2,2,2,0];%权重
% O=[1,1,2,2,2,3,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,10,10,10];
% D=[2,3,1,3,4,1,2,4,5,2,3,6,3,6,7,4,5,8,5,8,9,10,6,7,10,7,10,7,8,9];
% W=[5,7,10,2,5,7,2,3,5,5,3,8,5,3,3,8,3,2,3,6,5,7,2,6,5,5,10,7,5,10];
%O=[1 1 2 2 3 3 4 5 5 6 7 7 7 8 9 10];
%D=[2 3 3 4 4 5 6 6 7 8 8 9 10 10 10 10];
%W=[5 7 2 5 3 5 8 3 3 2 6 5 7 5 10 0];
%O=[1 1 2 2 2 2 3 3 3 4 4 4 4 5 5 6 6 6 7 7 7 8 8 8 9 9 9 10 10 10 ];
%D=[2 6 1 6 7 3 2 8 4 3 5 10 9 4 10 1 2 7 2 6 8 7 3 9 4 8 10 4 5 9];
%W=[7 5 7 2 3 5 5 3 3 3 5 7 6 5 10 5 3 5 3 5 8 8 3 2 6 2 5 7 10 5];%SUE输入
O=[1 1 4 4 5 5 6 6 7 7 8 9 9 10 11 11 12 12 13];
D=[5 12 5 9 6 9 7 10 8 11 2 10 13 11 2 3 6 8 3];
W=[12 12 12 24 12 12 12 12 12 12 12 12 24 12 12 12 12 36 12];
linkweight=sparse(O,D,W);%构建稀疏矩阵%num_nodes=length(O);
%求起点到终点最短路s%计算likelihood
theta=1.6;
%setp 2 先前计算权重,将L变为稀疏矩%% 网络参数
OD_pair=[4 1 2 3];
OD_demand=[1 1 4 4;2 3 2 3; 2500 2000 2000 2500];
ODnum=size(OD_demand,2);T=sparse(O,D,W);
T=full(T);
T=T(:)';%将自由流时间同样转换成1*(节点数*节点数)的存储形式
%单向网络
Maxcapacity=[3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000];
Maxcapacity=sparse(O,D,Maxcapacity);
Maxcapacity=Maxcapacity(:)';
G_vexnum=19;%边数
G_nodenum=13;%节点数
Total_link=G_nodenum*G_nodenum;
ZO=ones(1,length(O));
ZO1=sparse(O,D,ZO);%0-1矩阵
G_graph=full(ZO1);for i=1:ODnumorigin=OD_demand(1,i);destination=OD_demand(2,i);pathset=findPath(G_graph,origin,destination,0);pathset=pathset(:,1:size(pathset,2)-1);%构造0-1关联矩阵path_link_matrix{1,i} = construct2(pathset,G_nodenum);%构造路段0-1矩阵,分别存储在元胞里%P{i}=construct(pathset,G_nodenum,destination);%路段延误,路径
%     [pathcost{i},path_link{i}]=convertpath(pathset,destination,ZO2,Maxcapacity,Free_time,G_vexnum);
%     free_time=sparse(O,D,Free_time);
%     free_time=full(free_time);
end
%% dial分配
OD_input=[0 2500 2000 0;...0   0   0   0;...0   0   0   0;...0 2000 2500 0];[count1 count2]=dial(theta,OD_pair,O,D,W,OD_input,linkweight);
%%
X1=count1(:)';
k=1;error=0.3;
epsilon = 0.0001;%设置初始误差及迭代次数while error>epsilon%% step1:更新路段行驶时间timetime=T.*(1+1.*(X1./Maxcapacity).^2);time(isnan(time))=0;for i=1:G_nodenumtime(i+G_nodenum*(i-1))=0;end%检验(debug)for i=1:ODnumpathcost{i}=path_link_matrix{i}*time';pathcost{i}=pathcost{i}';end pc2=pathcost{1};%% step2: 按step1中计算出的路段时间和OD交通量,执行一次0-1分配,得到一组附加交通量Y1for i = 1:ODnum[Min(i),short_path(i)]=min(pathcost{i}); endShort=short_pathY1=zeros(1,Total_link);
%     for i = 1:G_nodenum
%     linkweight(:,i) = time(((i-1)*G_nodenum+1):i*G_nodenum)';
%     end
%     linkweight=sparse(linkweight);
%
%     for i=1:length(O)
%         W(i)=linkweight(O(i),D(i));
% %     end
%     [count1 count2]=dial(theta,OD_pair,O,D,W,OD_input,linkweight);
%     Y1=count1(:)';for i = 1:ODnumtemp = path_link_matrix{i};Y1 = temp(short_path(i),:).*OD_demand(3,i) + Y1;endpanduan=Y1==X1;%% step3 计算各路段当前交通量X2=X1+1./k*(Y1-X1); %   0< phi<1 phi=0.%% step4 判断当路段流量是否满足收敛条件error= sum(abs(X1-X2))/sum(X1);%else 继续迭代X1=X2;k=k+1;
end
fprintf('迭代次数%d\n',k)%% 还原矩阵
for i = 1:G_nodenumX(:,i) = X1(((i-1)*G_nodenum+1):i*G_nodenum)';
end% count=count_positive+count_negative';
% plotHH(count)
  • dail.m文件
function [count1 count2]=dial(theta,OD_pair,O,D,W,OD,linkweight)
%求起点到终点最短路
for i=1:max(O)for j=1:max(O)[dist,path]=graphshortestpath(linkweight,i,j);%最短路工具箱dis(i,j)=dist;end
end
r=dis(1,:);%节点1到任何一节点的最短路
s=dis(:,max(O));%任何一点到节点j的最短路
%定义发点
for i=1:max(O)m=find(O==i);Oi{i}=[D(m)];
end
%定义收点
%for i=1:9
for i=1:max(O)m=find(D==i);Di{i}=[O(m)];
end
Di{1}=1;
%输入起点和终点%%正向流
count_positive=sparse(O,D,zeros(1,length(O)));
for i=1:length(OD_pair)-1origin=OD_pair(i);for j=(i+1):length(OD_pair)%origin=2;%destination=5;destination=OD_pair(j);r=dis(origin,:);s=dis(:,destination)';Q=OD(i,j);Lsparse=likelihood(r,s,theta,W,O,D);Wi=weight2(r,Lsparse,Oi,Di,origin,O,D,destination);Xi=flow2(s,O,D,Oi,Di,Wi,destination,Q,origin);count_positive=count_positive+Xi;end
end%%反向流
count_negative=sparse(O,D,zeros(1,length(O)));
for i=1:length(OD_pair)-1origin=OD_pair(i);for j=(i+1):length(OD_pair)%origin=2;%destination=5;destination=OD_pair(j);r=dis(origin,:);s=dis(:,destination)';Q=OD(j,i);Lsparse=likelihood(r,s,theta,W,O,D);Wi=weight2(r,Lsparse,Oi,Di,origin,O,D,destination);Xi=flow2(s,O,D,Oi,Di,Wi,destination,Q,origin);count_negative=count_negative+Xi;end
end
count1=full(count_positive);
count2=full(count_negative)';
end
  • 搜索有效路径findpath.m
function possiablePaths = findPath(Graph, partialPath, destination, partialWeight)
% findPath按深度优先搜索所有可能的从partialPath出发到destination的路径,这些路径中不包含环路
% Graph: 路网图,非无穷或0表示两节点之间直接连通,矩阵值就为路网权值
% partialPath: 出发的路径,如果partialPath就一个数,表示这个就是起始点
% destination: 目标节点
% partialWeight: partialPath的权值,当partialPath为一个数时,partialWeight为0
pathLength = length(partialPath);
lastNode = partialPath(pathLength); %得到最后一个节点
nextNodes = find(0<Graph(lastNode,:) & Graph(lastNode,:)<inf); %根据Graph图得到最后一个节点的下一个节点
GLength = length(Graph);
possiablePaths = [];
if lastNode == destination% 如果lastNode与目标节点相等,则说明partialPath就是从其出发到目标节点的路径,结果只有这一个,直接返回possiablePaths = partialPath;possiablePaths(GLength + 1) = partialWeight;return;
elseif length( find( partialPath == destination ) ) ~= 0return;
end
%nextNodes中的数一定大于0,所以为了让nextNodes(i)去掉,先将其赋值为0
for i=1:length(nextNodes)if destination == nextNodes(i)%输出路径tmpPath = cat(2, partialPath, destination);      %串接成一条完整的路径tmpPath(GLength + 1) = partialWeight + Graph(lastNode, destination); %延长数组长度至GLength+1, 最后一个元素用于存放该路径的总路阻possiablePaths( length(possiablePaths) + 1 , : ) = tmpPath;nextNodes(i) = 0;elseif length( find( partialPath == nextNodes(i) ) ) ~= 0nextNodes(i) = 0;end
end
nextNodes = nextNodes(nextNodes ~= 0); %将nextNodes中为0的值去掉,因为下一个节点可能已经遍历过或者它就是目标节点
for i=1:length(nextNodes)tmpPath = cat(2, partialPath, nextNodes(i));tmpPsbPaths = findPath(Graph, tmpPath, destination, partialWeight + Graph(lastNode, nextNodes(i)));possiablePaths = cat(1, possiablePaths, tmpPsbPaths);
end
  • 计算权重
function Wi=weight2(r,Lsparse,Oi,Di,origin,O,D,destination)
%r=r(origin,:);
[a,b]=sort(r);%对r排序
Wi=sparse(O,D,zeros(1,length(O)));
b=b(1:find(b==destination));
for i=bif i==originWi(i,Oi{i})=Lsparse(i,Oi{i});else Wi(i,Oi{i})=Lsparse(i,Oi{i})*sum(Wi(Di{i},i));endend
end
  • 构建邻接矩阵
function  path_link_matrix=construct2(pathset,G_nodenum)pathnum = size(pathset,1);path_link_matrix = zeros(pathnum,G_nodenum*G_nodenum);
for i = 1:pathnum pathtemp = zeros(G_nodenum);for j = 1:size(pathset,2)-1if pathset(i,j+1) == 0break;elsepathtemp(pathset(i,j),pathset(i,j+1))=1;endendpath_link_matrix(i,:) = pathtemp(:);
end
end
  • 计算极大似然值
function Lsparse=likelihood(r,s,theta,W,O,D)L=zeros(1,length(O));for k=1:length(O)if r(O(k))<r(D(k))&s(O(k))>s(D(k))L(k)=exp(theta*(r(D(k))-r(O(k))-W(k)));end
end
Lsparse=sparse(O,D,L);
end
  • 配流
function Xi=flow2(s,O,D,Oi,Di,Wi,destination,Q,origin)
%r=r(origin,:);
[a,b]=sort(s);
Xi=sparse(O,D,zeros(1,length(O)));
b=b(1:find(b==origin));for i=b%if Oi{i}==9 if i==destination%if Oi{i}==destination Xi(Di{i},i)=Q*Wi(Di{i},i)/sum(Wi(Di{i},i));%Xi(Di{i},i)=Wi(Di{i},i)*sum(Xi(i,Oi{i}))/sum(Wi(Di{i},i));%endelse %if  Wi(Di{i},i)~=0%elseXi(Di{i},i)=Wi(Di{i},i)*sum(Xi(i,Oi{i}))/sum(Wi(Di{i},i));%endend%endend
Xi(isnan(Xi))=0;
end
function []=plotHH(count)
bg=biograph(count);
set(bg.nodes,'shape','circle','color',[1,1,1],'lineColor',[0,0,0]);
set(bg,'layoutType','radial');
set(bg.nodes,'shape','circle','color',[1,1,1],'lineColor',[0,0,0]);
bg.showWeights='on';
set(bg.nodes,'textColor',[0,0,0],'lineWidth',2,'fontsize',9,'Size',[20,20]);
set(bg,'arrowSize',7,'edgeFontSize',6);
get(bg.nodes,'position')
dolayout(bg);bg.nodes(1).position=[0,100];bg.nodes(2).position=[0,0];bg.nodes(3).position=[100,100];bg.nodes(4).position=[100,0];bg.nodes(5).position=[200,100];bg.nodes(6).position=[200,0];bg.nodes(7).position=[300,100];bg.nodes(8).position=[300,0];bg.nodes(9).position=[400,100];bg.nodes(10).position=[400,0];dolayout(bg,'pathsonly',true);view(bg)
end

其实搞清了算法,编程并不会很难。

try, try and try.

交通分配(MSA_DAIL算法)相关推荐

  1. 3 道路、轨道和公交——TransCAD交通分配模型和算法简介

    交通分配是需求预测的关键步骤,用来预测规划方案的路网流量,估算路段的出行时间和相关的属性,作为估算项目经济效益和空气质量影响的基础.还用于有关路网的运行状态,为方式选择和出行分布等模型提供依据.本文简 ...

  2. DIAL算法计算单位流率-python实现

    dail算法 DIAL算法又称STOCH算法,它基于路段分配流量,并将OD量仅仅加载到连接OD对的有效路径上,成功避免了路径枚举,被公认为是相当高效的Logit型随机网络加载算法.也就是说,DIAL算 ...

  3. matlab girvan newman,基于含权Newman算法的交通控制子区划分

    1. 引言 如何根据交通网络的拓扑结构和交通流的网络分布特征,将庞大且复杂的路网划分成若干独立的子区,有效实现子区上的信号控制,使得整个路网系统变得更加高效.可靠和灵活,一直备受研究者关注.自1971 ...

  4. 4 道路、轨道和公交——TransCAD多模式多用户交通分配模型

    在TransCAD交通分配模型和算法简介一文中,我们介绍了TransCAD中主要包含的交通分配模型和算法,使大家对软件的交通分配模型有了整理的了解,本文介绍TransCAD主打的多模式多用户交通分配模 ...

  5. MSA(Method of Successive Algorithm)算法逻辑及实例

    文章目录 前言 一.MSA算法是什么? 二.求解优化问题 1.典型优化问题 2.求解步骤 三.简单案例 总结 前言 在城市交通网络配流问题的求解中,MSA(Method of Successive A ...

  6. golang通过RSA算法生成token,go从配置文件中注入密钥文件,go从文件中读取密钥文件,go RSA算法下token生成与解析;go java token共用

    RSA算法 token生成与解析 本文演示两种方式,一种是把密钥文件放在配置文件中,一种是把密钥文件本身放入项目或者容器中. 下面两种的区别在于私钥公钥的初始化, init方法,需要哪种取哪种. 通过 ...

  7. 通用解题法——回溯算法(理解+练习)

    积累算法经验,积累解题方法--回溯算法,你必须要掌握的解题方法! 什么是回溯算法呢? 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就&quo ...

  8. 伍六七带你学算法 进阶篇-生命游戏

    有趣的算法题–生命游戏 难度-中等 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 想要体验生命游戏的小伙伴可以到这里-->生命游戏 进入 ...

  9. 伍六七带你学算法 进阶篇-排序算法

    给定一个整数数组 nums,将该数组升序排列. 示例 1: 输入:[5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:[5,1,1,2,0,0] 输出:[0,0,1,1,2,5] 各排序算 ...

最新文章

  1. php linux脚本文件,Unix/Linux中如何直接执行PHP脚本文件?
  2. CSS中绝对定位依据谁进行定位?
  3. 几个ARX取CAD窗口句柄的函数
  4. bzoj1190:[HNOI2007]梦幻岛宝珠
  5. 《古剑奇谭2》详细测评心得
  6. 第七十一期:管理 | 技术Leader:选OKR还是KPI?
  7. 用javascript缓存ajax数据
  8. 使用Mave构建多模块项目
  9. http代码_ssssssss 0.0.1 发布,无需代码的 HTTP 接口快速开发框架
  10. Java集合框架——collections工具类
  11. 树莓派2B使用360随身WiFi2代连接WiFi
  12. 投影幕布必备知识有哪些?
  13. 数字电视标准5种规格720p、1080i和…
  14. FSA确定性识别算法
  15. 绚丽彩虹同学录V1.4公测版
  16. java怎样写网页_java怎么写网站
  17. 41-C++自动存储、静态存储和动态存储
  18. 身份管理的15个安全开发实践
  19. css 让图标上下跳,使用CSS和Bootstrap图标制作上下跳动的指示箭头动画效果
  20. o在计算机进制中,计算机里的0和1,二进制

热门文章

  1. 为什么重写HashCode和Equals
  2. 互联网+下的慧算账体验式营销
  3. 水电站下泄生态流量监控解决方案-智能监测生态流量遥测终端-水电站流量监测站
  4. python-迭代器_高阶函数
  5. 安装neo4j-community(neo4j社区版)
  6. 腾讯Java后端开发实习生(一面)
  7. 比例导引 matlab,单步龙格库塔比例导引弹道计算matlab源程序
  8. Python习题十一
  9. 盘点16种常见的PCB可靠性测试,您的板经得起测试吗?
  10. 利安德巴赛尔启动韩国年产能40万吨的聚丙烯生产设施;固特异完成收购固铂轮胎 | 能动...