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之後纔有哦