综合算法02—指定点之间的K短路

%注意:程序中调用了Dijkstras算法,若需要运行,请自行将其放在同目录下。

function [W_Section,Line_Section_01Mat,Mxf]=KSP(Road_Net,Line_Station)
%% 问题描述
%已知路网数据和线路节点数据,求指定点之间的K短路。

%% 程序功能
%路段自动编号(上下行作为2个路段分别对待)
%将路径-节点转换为路径-路段
%求出一般定义的K短路
%求出各条路径的换乘点
%求出各条路径的换乘费用
%求出各条路径的总费用(不换乘&换乘)
%求出路径与路段的关系矩阵(作为Frank_Wolfe算法的已知条件)
%本程序中的换乘仅指一次换乘,本研究假定不会选择三次以及以上换乘次数
%***********************************************************************
%程序完成时间:2015-12-30
%运行测试环境:MATLAB 8.3.0.532
%制作人:兰州交通大学  刘志祥
%***********************************************************************

%% 变量说明
%                                         KPaths: K短路路径集合
%                                        KCosts-: K短路费用集合
%                                           Kmax: 指定的K短路路径数量(若大于全部路径数,多余的部分会自动舍去)
%                                              a: 路段编号
%                                              P: 保存当前已找到的路径
%                                              X: P的子集,表示一个路径
%                                    path_number: 路径编号
%                                      current_P: 当前路径编号(P_)
%                                         size_X: X的大小
%                                w_index_in_path: 偏差节点在当前路径中的位置
%                                       KSP.: 结构体,为了集中展现结果
%                                       Road_Net: 路网矩阵,带权的邻接方阵
%                                   Line_Station: 路网路线集合
%                                Section_Station: 路段(Section)是由哪两个节点(Station)组成的
%                                      W_Section: 路段权重
%                                 W_Line_Section: 路线上各路段的权重
%                                       Original: 起点
%                                    Destination: 终点
%                                         path_0: 直达路线(一条直达路线上可能有不只一个的直达路径)
%                               Transfer_Station: 可能的换乘点
%                               Cost_of_Transfer: 换乘一次要增加的费用
%                                              H: 可容忍的绕路倍数
%                                        path_k1: 途经起始点到第一个换乘点的所有点的直达路线集合
%                                        path_k2: 途经所有换乘点的路线集合
%                                        path_k3: 途经最后一个换乘点到终点的所有点路径集合
%     Irrespective_of_the_Transfer_KPaths_number: 不考虑换乘的K短路按升序排列编号
%            Irrespective_of_the_Transfer_KPaths: 不考虑换乘的K短路路径
%            Irrespective_of_the_Transfer_KCosts: 不考虑换乘的K短路费用
%                       Transfer_Station_of_Path: 路径上的换乘点
%                              Times_of_Transfer: 换乘次数
%                             KCosts_of_Transfer: 换乘的额外费用
%                   Consider_the_Transfer_KCosts: 考虑换乘的费用
%            Consider_not_consider_KPaths_number: 考虑换乘后的路径排序(对应于不考虑换乘的排序)
%                   Consider_the_Transfer_KPaths: 考虑换乘后升序的K短路费用


%% 模块1:输入并处理相关的路网数据
%例
% Road_Net =[
%      0     2   Inf     1   Inf   Inf   Inf   Inf   Inf
%      2     0     2   Inf     3   Inf   Inf   Inf   Inf
%    Inf     3     0   Inf   Inf     2   Inf   Inf   Inf
%      1   Inf   Inf     0     3   Inf     5   Inf   Inf
%    Inf     3   Inf     3     0     1   Inf     2   Inf
%    Inf   Inf     2   Inf     1     0   Inf   Inf     3
%    Inf   Inf   Inf     5   Inf   Inf     0     2   Inf
%    Inf   Inf   Inf   Inf     2   Inf     2     0     4
%    Inf   Inf   Inf   Inf   Inf     3   Inf     4     0];
% Line_Station={[1 2 3 6 9 8 7 4],[2 5 8 9],[1 4 5 6]};
Original=input('Original=');
Destination=input('Destination=');
tic

%% 定义变量及常量
Cost_of_Transfer=2.5;                                             %预定义换乘时间,本文的换乘时间指平均换乘时间,只要发生换乘就会多话费这么多时间
H=1.5;                                                            %预定义的最大绕路倍数
a=0;                                                              %路段编号初始化
Kmax=100;                                                         %预定义的路径数量,这里尽可能取大,因为绕路倍数能够自动过滤不需要计算的k(启发式算法)

%% 根据路网对路段进行自动标号并求出每个路段的距离
for i=1:length(Road_Net)
    for j=1:length(Road_Net)
        if Road_Net(i,j)~=0&Road_Net(i,j)~=inf
            a=a+1;
            [Section_Station{a},W_Section{a}]=dijkstra(Road_Net,i,j);
        end
    end
end

%% 根据路段标号和路线-节点关系,求出路线-路段的0-1矩阵
Line_Section_01Mat=zeros(length(Line_Station),length(Section_Station));           %线路-路径0-1矩阵,表示某线路是否包含该路段
m=1;
while m<&
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值