必经点最短路径问题

经过指定的中间节点集的最短路径算法

目前以Dijkstra算法为基础,针对最短路径问题的研究非常多。多数只是针对起点出发到达终点的情况。如果限制这条最短路径必须要经过某些指定的中间节点,则现有算法将不在适用。

基于Dijkstra算法的经过指定的中间节点集的最短路径算法
Dijkstra算法描述及matlab代码

算法表述:
Step 1: 采集数据集,求取邻接矩阵,设置起点S,终点E,中间节点矩阵M;以及中间节点个数n;

Step 2: 对n个中间节点做全排列,生成一个中间节点序列(n*(n-1)行,n列的矩阵);全排列的起点记为M1;终点积为Mn。计算所有中间节点之间的距离和路径。
求中间节点之间的最短路径方法:
对于一个中间节点序列,若任意两相邻节点有边直接相连,则他们的距离为邻接矩阵中该边的权重值;反之,使用Dijkstra算法求出它们之间的最短路径和距离。若它们之间的路径经过了自由节点,则应将自由节点保存到该路径中。将所有相邻节点间的距离相加即可得到M1到Mn且经过其他所有中间节点的最短距离;将所有相邻节点间的路径(中间可能会经过一些自由节点)相连即得中间节点之间的最短路径。

Step 3: 使用Dijkstra算法求起点S到M1的局部最短路径;使用Dijkstra算法求Mn到终点E的局部最短路径;

Step 4: 将以上三条路径连接起来即得该排列下的(待选)全程最短路径。将以上3条路径的距离相加即得该条待选全程最短路径的距离。

Step 5: 遍历n*(n-1)次求取其中距离最小的即为待求的全程最短距离,对应的路径就是待求的最短路径。

【模型结果】
由上述模型求解的路径可能会经过网络中除了起点、终点和指定的中间节点之外的其他节点(自由节点),同时这条路径中某些节点可能会出现多次,路径中也可能存在回路。

示例

数据点
P_x = [1,6 ,10.6 ,16,16,16,9,4.5,1,7.58,9.6];
P_y = [9.75, 9.75,8.5 , 9.75,4.65,0.75,0.75,0.75,0.75,5.05,7.3];
P = [P_x’,P_y’];
相关节点
第一个为起点,最后一个为终点,中间的为必经点;
R_node = [1,2,10,9,6,5];

1、从起点过必经点到达终点

从起点过必经点到达终点
输出结果
Best_distance = 37.6477;
Best_path =[ 1 2 10 8 9 8 7 6 5];

2、从起点过必经点且不掉头的到达终点

在这里插入图片描述

输出结果
Best_distance = 47.5287;
Best_path =[ 1 9 8 10 2 3 11 10 7 6 5];

3、有指定朝向点,从起点过必经点且不掉头到达终点

在这里插入图片描述

输出结果
Best_distance = 53.1346;
Best_path =[ 1 2 10 8 9 1 2 10 7 6 5];

Matlab源码

经过指定的中间节点集的最短路径算法的matlab源码

Python源码

经过指定的中间节点集的最短路径算法的Python源码

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值