數學建模 圖論最短路徑問題

1、圖的基本概念

圖論中的圖(Graph)是由若干給定的點及連接兩點的線 所構成的圖形,這種圖形通常用來描述某些事物之間的某種 特定關係,用點代表事物,用連接兩點的線表示相應兩個事 物間具有這種關係。
一個圖可以用數學語言描述爲G(V(G),E(G))。V(vertex)指 的是圖的頂點集,E(edge)指的是圖的邊集。根據邊是否有方向,可將圖分爲有向圖(圖一)和無向圖(圖二)。另外,有些圖的邊上還可能有權值,這樣的圖稱爲有權圖(圖三)。
在這裏插入圖片描述

2、作圖

1、在線作圖

2、matlab作圖

%% Matlab作無向圖
%1)無權重(每條邊的權重默認爲1% 函數graph(s,t):可在 s 和 t 中的對應節點之間創建邊,並生成一個圖
% s 和 t 都必須具有相同的元素數;這些節點必須都是從1開始的正整數,或都是字符串元胞數組。
s1 = [1,2,3,4];
t1 = [2,3,1,1];
G1 = graph(s1, t1);
plot(G1)
% 注意哦,編號最好是從1開始連續編號,不要自己隨便定義編號
s1 = [1,2,3,4];
t1 = [2,3,1,1];
G1 = graph(s1, t1);
plot(G1)

% 注意字符串元胞數組是用大括號包起來的哦
s2 = {'學校','電影院','網吧','酒店'};
t2 = {'電影院','酒店','酒店','KTV'};
G2 = graph(s2, t2);
plot(G2, 'linewidth', 2)  % 設置線的寬度
% 下面的命令是在畫圖後不顯示座標
set( gca, 'XTick', [], 'YTick', [] );  

%2)有權重
% 函數graph(s,t,w):可在 s 和 t 中的對應節點之間以w的權重創建邊,並生成一個圖
s = [1,2,3,4];
t = [2,3,1,1];
w = [3,8,9,2];
G = graph(s, t, w);
plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2) 
set( gca, 'XTick', [], 'YTick', [] );  

%% Matlab作有向圖
% 無權圖 digraph(s,t)
s = [1,2,3,4,1];
t = [2,3,1,1,4];
G = digraph(s, t);
plot(G)
set( gca, 'XTick', [], 'YTick', [] );  

% 有權圖 digraph(s,t,w)
s = [1,2,3,4];
t = [2,3,1,1];
w = [3,8,9,2];
G = digraph(s, t, w);
plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2) 
set( gca, 'XTick', [], 'YTick', [] );  

3、無向圖的權重鄰接矩陣

在這裏插入圖片描述

4、迪傑斯特拉算法

在線觀看算法
缺點:不能計算帶有負權重的圖

5、Bellman‐Ford(貝爾曼‐福特)算法

剛剛改變訪問狀態的節點爲0號節點(A) 我們要更新與0號節點相鄰的節點信息(B),注意, 這裏的B節點是未訪問的哦 更新的規則如下: 如果(A與B的距離+ A列表中的距離)小於(B列表中 的距離),那麼我們就將B列表中的距離更新爲較小的 距離,並將B的父親節點更新爲A
事實上,貝爾曼‐福特算法不再將節點區分爲是否已 訪問的狀態,因爲貝爾曼‐福特模型是利用循環來進 行更新權重的,且每循環一次,貝爾曼福特算法都會 更新所有的節點的信息。
貝爾曼‐福特算法不支持含有負權迴路的圖。 (Floyd(弗洛伊德)算法也不可以)
負權迴路:在一個圖裏每條邊都有一個權值(有正有負) 如果存在一個環(從某個點出發又回到自己的路徑),而且 這個環上所有權值之和是負數,那這就是一個負權環,也叫負權 迴路。存在負權迴路的圖是不能求兩點間最短路的,因爲只要在負 權迴路上不斷兜圈子,所得的最短路長度可以任意小。

6、matlab計算最短路徑

可用的算法:
在這裏插入圖片描述

% 注意哦,Matlab中的圖節點要從1開始編號,所以這裏把0全部改爲了9
% 編號最好是從1開始連續編號,不要自己隨便定義編號
s = [9 9 1 1 2 2 2 7 7 6 6  5  5 4];
t = [1 7 7 2 8 3 5 8 6 8 5  3  4 3];
w = [4 8 3 8 2 7 4 1 6 6 2 14 10 9];
G = graph(s,t,w);
plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2) 
set( gca, 'XTick', [], 'YTick', [] );  
[P,d] = shortestpath(G, 9, 4)  %注意:該函數matlab2015b之後纔有哦

% 在圖中高亮我們的最短路徑
myplot = plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2);  %首先將圖賦給一個變量
highlight(myplot, P, 'EdgeColor', 'r')   %對這個變量即我們剛剛繪製的圖形進行高亮處理(給邊加上r紅色)

% 求出任意兩點的最短路徑矩陣
D = distances(G)   %注意:該函數matlab2015b之後纔有哦
D(1,2)  % 1 -> 2的最短路徑
D(9,4)  % 9 -> 4的最短路徑

% 找出給定範圍內的所有點  nearest(G,s,d)
% 返回圖形 G 中與節點 s 的距離在 d 之內的所有節點
[nodeIDs,dist] = nearest(G, 2, 10)   %注意:該函數matlab2016a之後纔有哦
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章