配流02—DIAL算法(改进)
欢迎使用Markdown编辑器写博客
function dialsuanfaxishujuzhen(T)
%程序说明
clc
disp('======================================================================================');
disp(' 《基于LOGIT的STOCH配流法——改进的dial算法》');
disp('运行环境:MATLAB 8.3.0.532 ');
disp('制 作 人:兰州交通大学 刘志祥');
disp('Q Q:531548824');
fprintf('说 明:本程序用于进行静态配流,在经典Dial算法的基础上进行修改,重新定义了有效路径,使得在用\n户的容忍绕路范围内比原来多走h倍路(一般情况下0<h<1,针对路段T(i,j)),即最多不超过2倍的路程,若\nh=0则等同经典算法.dial算法分四大步骤:一是求最短路,二是求边权似然数,三是求路权,四是配流\n');
disp('======================================================================================');
disp('按任意键继续...');
pause;%数据获取,人机交互
disp(' ***请按照提示输入以下参数***');
Q=input('总 需 求 量:');
thita=input('参 数 thita:');
h=input('容忍绕路倍数:');
r=input('起 点:');
s=input('终 点:');
n=size(T,1);%初始化
L=zeros(n,n);
W=zeros(n,n);
X=zeros(n,n);%求最短距离矩阵及最短路径
disp('step1->:求最短距离,其中');
disp('---------------------------------------------------------------------------------------');
disp(' R—起点r到其他点的最短距离');
disp(' S—其他点到终点s的最短距离');
disp('按任意键继续...');
pause;
for i=1:nfor j=1:nif T(i,j)==infT(i,j)=0;endend
end
T=sparse(T);
Tmin=graphallshortestpaths(T);
[dist,path]=graphshortestpath(T,r,s);
disp('________________________________________________________________');
R=Tmin(r,:)
S=Tmin(:,s)'%注意因为方向性,这里作转置处理
disp('________________________________________________________________');%画出初始图及最短路,边权为阻抗值t
disp('初始图及最短路径(红色)如图所示:');
chushitu=view(biograph(T,[],'showW','ON'));
set(chushitu.Nodes(path),'Color',[1 0 0]);
edges=getedgesbynodeid(chushitu,get(chushitu.Nodes(path),'ID'));
set(edges,'Linecolor',[1 0 0]);
disp('最短路径:');
path
disp('最短路距离:');
dist%找上游节点和下游节点(显然up和down互为转置——对称,因为若j是i的下游节点,则i必是j的上游节点)
for i=1:nfor j=1:nif T(i,j)>0down(i,j)=1;up(j,i)=1;elsedown(i,j)=0;up(j,i)=0;endend
end
down=sparse(down);
up=sparse(up);%计算边权
disp('step2->:计算边权似然值(任意键继续)');
disp('---------------------------------------------------------------------------------------');
pause;
for i=1:nfor j=1:nif down(i,j)if R(i)+T(i,j)-R(j)<(1+h)*T(i,j)&&S(j)+T(i,j)-S(i)<(1+h)*T(i,j)P=1;elseP=0;endL(i,j)=P*exp(thita*(R(j)-R(i)-T(i,j)));endend
end
L=sparse(L)
disp('边权如图所示:');
bianquantu=view(biograph(L,[],'showW','ON'));%计算路权
disp('step3->:计算路权(任意键继续)');
disp('---------------------------------------------------------------------------------------');
pause;
for i=1:nfor j=1:nif down(i,j)~=0if R(i)+T(i,j)-R(j)<(1+h)*T(i,j)&&S(j)+T(i,j)-S(i)<(1+h)*T(i,j)if i==rW(i,j)=L(i,j);elseW(i,j)=L(i,j)*(up(i,:)*W(:,i));%这是核心句,先找到上游节点,再写出上游节点到i的W值(若还没有,则递归直到能够算出),请仔细查阅路权的算法好好理解。endendendend
end
W=sparse(W)
disp('路权如图所示:');
luquantu=view(biograph(W,[],'showW','ON'));%配流
disp('step4->:配流(任意键继续)');
disp('------------------------------------------------------------------------------------------');
pause;
for i=n:-1:1for j=n:-1:1if down(i,j)==1if R(i)+T(i,j)-R(j)<(1+h)*T(i,j)&&S(j)+T(i,j)-S(i)<(1+h)*T(i,j)if j==sX(i,j)=Q*W(i,j)/((up(j,:)*W(:,j)));elseX(i,j)=X(j,:)*down(j,:)'*W(i,j)/(up(j,:)*W(:,j));%注意X(j,:)是1*n行向量,down(j,:)是1*n行向量,因此要将down向量转置为1*n的列向量才能相乘。endendendend
end
X=sparse(X)
disp('配流结果如图所示:');
peiliutu=view(biograph(X,[],'showW','ON'));
disp('======================================================================================');
disp('<程序运行完毕>');
例:某路网如图所示,阻抗已标注于边上(这里阻抗用距离值表示),需求为1000,起点为v1,终点为v9,θ=1,用户可容忍的绕路倍数为0.5.请用改进的ial算法进行配流。
解:(1)写权值矩阵
quanzhijuzhen=[0 2 Inf 2 Inf Inf Inf Inf InfInf 0 2 Inf 2 Inf Inf Inf InfInf Inf 0 Inf Inf 2 Inf Inf InfInf Inf Inf 0 1 Inf 2 Inf InfInf Inf Inf Inf 0 1 Inf 2 InfInf Inf Inf Inf Inf 0 Inf Inf 2Inf Inf Inf Inf Inf Inf 0 2 InfInf Inf Inf Inf Inf Inf Inf 0 2Inf Inf Inf Inf Inf Inf Inf Inf 0];
(2)带入程序(格式整理后输出如下)
dialsuanfaxishujuzhen(quanzhijuzhen)======================================================================================《基于LOGIT的STOCH配流法——改进的dial算法》
运行环境:MATLAB 8.3.0.532
制 作 人:兰州交通大学 刘志祥
Q Q:531548824
说 明:本程序用于进行静态配流,在经典Dial算法的基础上进行修改,重新定义了有效路径,使得在用
户的容忍绕路范围内比原来多走h倍路(一般情况下0<h<1,针对论断T(i,j)),即最多不超过2倍的路程,若
h=0则等同经典算法.dial算法分四大步骤:一是求最短路,二是求边权似然数,三是求路权,四是配流
======================================================================================
按任意键继续...
***请按照提示输入以下参数***
总 需 求 量:1000
参 数 thita:1
容忍绕路倍数:0.5
起 点:1
终 点:9
step1->:求最短距离,其中
---------------------------------------------------------------------------------------
R—起点r到其他点的最短距离
S—其他点到终点s的最短距离
按任意键继续...
________________________________________________________________
R =0 2 4 2 3 4 4 5 6
S =6 5 4 4 3 2 4 2 0
________________________________________________________________
初始图及最短路径(红色)如图所示:
最短路径:
path =
1 4 5 6 9
最短路距离:
dist =
6
step2->:计算边权似然值(任意键继续)
---------------------------------------------------------------------------------------
L =
(1,2) 1.0000
(2,3) 1.0000
(1,4) 1.0000
(2,5) 0.3679
(4,5) 1.0000
(3,6) 0.1353
(5,6) 1.0000
(4,7) 1.0000
(5,8) 1.0000
(7,8) 0.3679
(6,9) 1.0000
(8,9) 0.3679
边权如图所示:
step3->:计算路权(任意键继续)
---------------------------------------------------------------------------------------
W =
(1,2) 1.0000
(2,3) 1.0000
(1,4) 1.0000
(2,5) 0.3679
(4,5) 1.0000
(3,6) 0.1353
(5,6) 1.3679
(4,7) 1.0000
(5,8) 1.3679
(7,8) 0.3679
(6,9) 1.5032
(8,9) 0.6386
路权如图所示:
step4->:配流(任意键继续)
------------------------------------------------------------------------------------------
X =
(1,2) 298.1420
(2,3) 63.1887
(1,4) 701.8580
(2,5) 234.9533
(4,5) 638.6693
(3,6) 63.1887
(5,6) 638.6693
(4,7) 63.1887
(5,8) 234.9533
(7,8) 63.1887
(6,9) 701.8580
(8,9) 298.1420
配流结果如图所示:
======================================================================================
<程序运行完毕>说明:显然改进的算法更符合实际情况,因为人们通常不会因为需要绕一点点路而长时间等待。
配流02—DIAL算法(改进)相关推荐
- 配流01—DIAL算法(经典)
function dialsuanfa(T) %程序说明 clc disp('============================================================= ...
- 综合算法03—FrankWolfe_BPR配流算法
%% 算法符号及程序说明 %说明:本程序为采用美国联邦公路阻抗函数BPR时的frankwolfe算法,考虑了换乘(已经将等待时 %间考虑在内并在K短路的确定过程中计算)及拥挤附加时间,在路网情况已知时 ...
- 配流05—增量配流算法
说明:指定两点间的客流需求总量,建立费用函数(阻抗函数),一般情况下费用是流量的函数,就可以运用增量配流法配流,核心还是全有全无算法,只是该方法把流量等分为N份,每次全有全无配流1份,直至流量全部被加 ...
- 配流03—全有全无配流算法(1)
说明:指定两点间的客流需求总量,建立费用函数(阻抗函数),一般情况下费用是流量的函数,就可以运用全有全无算法进行配流. step1:建立费用函数m文件:feiyonghanshu.m function ...
- DIAL算法计算单位流率-python实现
dail算法 DIAL算法又称STOCH算法,它基于路段分配流量,并将OD量仅仅加载到连接OD对的有效路径上,成功避免了路径枚举,被公认为是相当高效的Logit型随机网络加载算法.也就是说,DIAL算 ...
- 吴恩达机器学习6——机器学习算法改进、系统设计
吴恩达机器学习6 一.机器学习算法改进 1. 机器学习算法评价 1.1 评估模型 1.2 模型选择和交叉验证集 2. 偏差与方差 2.1 诊断偏差和方差 2.2 正则化和偏差/方差 2.3 学习曲线 ...
- 网络流初步:最大流(Dinic算法)
网络流初步:最大流 标签: 网络流 最大流 Dinic 最大流 例题 POJ****(USACO4.2.1) 在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水.这意味着草地被水 ...
- CV之IC之AlexNet:基于tensorflow框架采用CNN卷积神经网络算法(改进的AlexNet,训练/评估/推理)实现猫狗分类识别案例应用
CV之IC之AlexNet:基于tensorflow框架采用CNN卷积神经网络算法(改进的AlexNet,训练/评估/推理)实现猫狗分类识别案例应用 目录 基于tensorflow框架采用CNN(改进 ...
- 【文献阅读】多目标优化算法改进-Part1
一.改进NSGA-Ⅱ算法 文献:改进NSGA-Ⅱ算法的动力总成悬置系统怠速振动优化 摘要:在NSGA-Ⅱ算法的基础上引入自适应遗传因子以提高其寻优性.收敛性,基于改进的NSGA-Ⅱ算法,使用 振型叠加 ...
最新文章
- Ext分区文件恢复工具extundelete
- Python3高并发定时更新任务进程池和线程池的使用
- Numpy.array矩阵百分制化(比例化)
- android 通知折叠点击,如何折叠Android通知?
- POJ - 4045 Power Station(树形dp/树的重心)
- Linux用户对System76的Darter Pro笔记本电脑的评论
- git 使用http方式的一个小问题
- HDOJ 2071 Max Num
- ad14 drc报错_AD怎么设置DRC检查常规检查项报错?
- MATLAB基础教程-台大郭彦甫-学习笔记
- 计算机英语拼读法,常用计算机英语词汇:DVD
- Learning Community Embedding with Community Detection and Node Embedding on Graphs
- 云呐|加强固定资产设备信息化管理工作
- 责任链模式:“张三为了纪念王二请假的悲催经历想出来的一种设计模式”
- STM32笔记 (十三)定时器输入捕获(利用定时器捕获高电平时间)
- 组织、结构与部分、整体
- 【云原生】阿里云服务器部署 Docker Swarm集群
- 学习记录--生成微信url schema
- 喜马拉雅xm文件格式转码为mp3格式
- 基于JAVA深州市特色蜜桃产业电子商务系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
热门文章
- 这一次,为广州扛旗举鼎的为什么是融创文旅城?
- easyX中loadimage()函数共计有5个参数详解
- Android OpenMobileAPI、OMA、智能卡开发总结
- 微信公众平台开发之Java实现群发消息
- 【华为云CCE】 k8s部署nacos集群
- 让AI看哈利波特就为了学······剧透?!还能不能愉快的玩耍了?
- 想拥有一个自由时间的职业_如何以自由职业者的身份管理时间
- 浅谈使用Word和Baklib制作帮助文档区别
- 网页在线浏览ppt的实现
- 空值排序与时间倒叙问题