經過兩點(某路段)的最短路規劃.
========================================================
function jingguoliangdianzuiduanlu(W)
clc
qidian=input('起點:');
zhongdian=input('終點:');
t1=input('經過點1:');%不是必須先經過點1
t2=input('經過點2:');
[p1 d1]=liangdianzuiduanlu(W,qidian,t1);
[p2 d2]=liangdianzuiduanlu(W,t1,t2);
[p3 d3]=liangdianzuiduanlu(W,t2,zhongdian);
dt1=d1+d2+d3;
[p4 d4]=liangdianzuiduanlu(W,qidian,t2);
[p5 d5]=liangdianzuiduanlu(W,t2,t1);
[p6 d6]=liangdianzuiduanlu(W,t1,zhongdian);
dt2=d4+d5+d6;
if dt1<=dt2
lujing=[p1 p2(2:length(p2)) p3(2:length(p3))];
d=dt1;
else
lujing=[p4 p5(2:length(p2)) p6(2:length(p3))];
d=dt2;
end;
lujing
d
========================================================
評:相當於求6次兩點間最短路徑,分兩種情況:
(1)qidian-t1-t2-zhongdian
(2)qidian-t2-t1-zhongdian
每種情況求起點-中間點1,中間點1-中間點2,中間點2-終點共3個路徑3個距離
缺點是有時會漏解(兩條最短路距離相同,只會輸出其中一條)
拓展:若需要,可增加至經過3點、4點等情況,只是排列組合情況複雜而已。
========================================================
例:求下圖中起點1,終點8,經過4和7的最短路。(可以想象成列車必須經停4、7站)
解:
(1)寫權值矩陣
quanzhijuzhen=[ 0 2 8 1 Inf Inf Inf Inf
2 0 6 Inf 1 Inf Inf Inf
8 6 0 7 5 1 2 Inf
1 Inf 7 0 Inf Inf 9 Inf
Inf 1 5 Inf 0 3 Inf 8
Inf Inf 1 Inf 3 0 4 6
Inf Inf 2 9 Inf 4 0 3
Inf Inf Inf Inf 8 6 3 0]
(2)帶入程序(格式整理後輸出如下)
>> jingguoliangdianzuiduanlu(quanzhijuzhen)
起點:1
終點:8
經過點1:4
經過點2:7
lujing =
1 4 3 7 8
d =
13
說明:起點1,終點8,經過4和7的最短路徑爲1->4->3->7->8,最短距離爲 13.