一、问题描述
在路网中,已知站点、线路和线路-站点数据,有条件:1、考虑到换乘时要花费一定的时间,因此对换乘路径费用要加上换乘时间。2、当路网复杂时,为了避免多余计算,定义有效路径,使得路径在有效路径范围内。有效路径为最短路径的(1+h)倍。求满足条件的K短路。
二、算法描述
1.K短路算法:
Step1:令k=1,求出最短路,并加上t换乘;
Step2:k=k+1,求出k短路,并加上t换乘;
Step3:判断,if是有效路径,保存并转Step2;else转Step4;
Step4:删除路径,结束。
2.换乘时间算法(假设换乘时间基于换乘次数):
if 路径所有站点都在线路j上,n=0;
else if 存在i站点,使得起点到i的所有站点都在线路j1上,i到终点的所有站点都在j2上,则n=1;
else if 存在i1、i2,使得起点到i1的所有站点都在线路j1上,i1到i2间所有站点都在j2上,i2到终点的所有站点都在j3上,则n=2;
else n=∞;
t换乘=n*换乘一次的平均时间。
三、算法程序
使用说明:将以下代码分别保存为m文件放在同一个目录下,注意名称不能错,修改案例请打开luwangshuju.m,运行程序请打开KSP.m。
1.fuhaoshuoming.mfprintf('======================================================================\n'); fprintf(' 《换乘方案算法——不对方案排序》\n'); fprintf('运行环境:MATLAB 8.3.0.532 \n'); fprintf('作者信息:兰州交通大学 刘志祥 QQ:531548824\n'); fprintf('说明:本程序用于在已知路网数据时,通过输入起讫点求直达、一次、二次换乘方案。\n') fprintf('======================================================================\n\n'); %% 符号体系 %% 路网数据符号 %========================================================================== % luwangshuju-路网数据,包括站数据(点编号),线数据(线编号),站—线数据(站与线的0-1矩阵,表示站是否在线上),线-站数据(线与站的0-1矩阵,表示线是否包含站),路权数据(如行驶时间或距离)。 % A-起点 % B-终点 % zhan-站集合,本程序中站点以V开头编号 % xian-线集合,可理解为公交车名称,如k102等 % zhan_xian-线与站的关系,表示线路上有哪些站点 %========================================================================== %% 数据处理符号 %========================================================================== % zhan_xian_01-线与站的01矩阵,行表示线,列表示站,0表示不在该线,1表示在该线上 % xian_zhan_01-站与线的01矩阵,行表示站,列表示线,0表示线不经过站,1表示经过,与zhan_xian_01互为转置矩阵 %========================================================================== %% 换乘次数符号 %========================================================================== % KHc_cishu-换乘次数 % KHc_hcd-换乘点 % KHc_hcqj-换乘区间 % KHc_hcld_a-换乘路段 %========================================================================== %% K短路算法符号 %========================================================================== % KPaths-有效路径 % KCosts-有效路径的费用(本文指时间) %==========================================================================
2.luwangshuju.m%========================================================================== % 路网数据 % 运行可得基础路网数据 % 主要计算结果:【输入起讫点 得到路网的站-线-权数据 】 %========================================================================== %% 输入始发点和目的地 % O=input('O='); % D=input('D='); O=2; D=9; %========================================================================== %% 数据for K短路算法 %===================