圖論07—經過指定兩點的最短路

========================================================
經過兩點(某路段)的最短路規劃.
========================================================
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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章