MATLAB實例:構造網絡連接圖(Network Connection)及計算圖的代數連通度(Algebraic Connectivity)
作者:凱魯嘎吉 - 博客園 http://www.cnblogs.com/kailugaji/
1. 圖的代數連通度(Algebraic Connectivity)
圖的代數連通度:Laplace圖譜的次小特征值。
2. 網絡連接圖(Network Connection)的構造
隨機生成一個具有50個節點的傳感器網絡。節點隨機放置在3.5 x 3.5方形區域內,通信距離為0.8。如下圖所示,共有159條邊,其代數連通度為:0.3007。
3. MATLAB程序
demo_Create_Network_Connection.m
%創建無向圖 網絡連接圖 Network Connection. clc; close all; clear; Conf.Square = 3.5; %方形區域的邊長 Conf.NodeNumber = 50; %節點個數 Conf.CommDist = 0.8; %最大通信距離 is_create_network = 1; if is_create_network == 1 [ Network, Dists ] = CreateNetworksFunc(Conf); save Network_1.mat Network else load Network_1.mat end nodenum = size(Network.Nodes.loc,1); %節點個數 lap_matrix = zeros(nodenum); %節點數*節點數 圖的Laplace矩陣:diag(d1,d2,...dn)-鄰接矩陣,di為節點i的度 for i=1:nodenum idx = Network.Nodes.neighbors{i}; %鄰接節點的id lap_matrix(i,idx) = -1; %負的鄰接矩陣 lap_matrix(i,i) = length(idx); %對角線元素為節點的度 end eig_val = eig(lap_matrix); %lap_matrix的特征值 eig_val = sort(eig_val,'ascend'); %從小到大排序,最小特征值為0 algeb_conn = eig_val(2) % algebraic connectivity 代數連通度:lap_matrix的第二小特征值>0,連通圖 avg_deg = sum(diag(lap_matrix))/nodenum % average values 節點度的均值 DrawNetworks(Network); % DrawNetworks(Network, Dists); %把所有的邊的長度(通信距離)都標出來了 print(gcf,'-dpng','Network_1.png'); %保存圖片
CreateNetworksFunc.m
function [ Network, Dists ] = CreateNetworksFunc(Conf) % 創建無向圖 網絡連接圖 Network Connection. num = Conf.NodeNumber; %節點個數 square = Conf.Square; %方形區域的邊長 maxDist = Conf.CommDist; %最大通信距離 loc = square*rand(num,2) - square/2; %num*2的隨機數 節點坐標 Dists = Euclid_Dist(loc(:,1),loc(:,2)); %節點數*節點數,對角線元素為0 % without self-loop 不存在節點自己到自己的路徑,對角線上的元素為無窮大 Dists = Dists + 10*maxDist*eye(num); Neighbors = cell(num,1); maxDegree = 0; %節點的最大度,與節點相鄰的最大邊數 edges = 0; %圖的總邊的個數,無向圖的度/2 for i=1:num Neighbors{i} = find(Dists(i,:)<=maxDist); %找鄰接節點的id if length(Neighbors{i}) > maxDegree maxDegree = length(Neighbors{i}); %節點的最大度 end edges = edges + length(Neighbors{i}); end Nodes.loc = loc; Nodes.neighbors = Neighbors; Network.maxDegree = maxDegree; Network.edges = edges/2; %% undirected graph Network.Conf = Conf; Network.Nodes = Nodes; end function dist = Euclid_Dist(X,Y) % 求兩兩節點之間的距離,輸出[節點*節點]的矩陣,距離矩陣 len = length(X); xx = repmat(X,1,len); %節點數*節點數 yy = repmat(Y,1,len); dist = sqrt((xx-xx').^2+(yy-yy').^2); %節點數*節點數 end
DrawNetworks.m
function fig = DrawNetworks( Network ) %畫無向圖 網絡連接圖 Network Connection. % function fig = DrawNetworks( Network, Dists ) %把所有的邊的長度(通信距離)都標出來了 num = Network.Conf.NodeNumber; %節點個數 loc = Network.Nodes.loc; %節點坐標 square = Network.Conf.Square; %方形區域的邊長 Neighbors = Network.Nodes.neighbors; %鄰接節點的id fig = figure; plot(loc(:,1),loc(:,2),'ro','MarkerSize',8,'LineWidth',2); %節點是紅色圓圈 side=ceil(square/2); axis([-side,side,-side,side]); for i=1:num for k = 1:length(Neighbors{i}) j = Neighbors{i}(k); % c = num2str(Dists(i,j),'%.2f'); % text((loc(i,1) + loc(j,1))/2,(loc(i,2) + loc(j,2))/2,c,'Fontsize',10); %把所有的邊的長度(通信距離)都標出來了 % hold on; line([loc(i,1),loc(j,1)],[loc(i,2),loc(j,2)],'LineWidth',0.8,'Color','b'); %線是藍色 end end set(gcf, 'Color', 'w'); %白色 end
4. 參考文獻
[1] Hua J, Li C. Distributed variational Bayesian algorithms over sensor networks[J]. IEEE Transactions on Signal Processing, 2015, 64(3): 783-798.
[2] 肖恩利, 束金龍, 聞人凱. 圖的代數連通度及其點連通度[J]. 華東師范大學學報(自然科學版), 2003, 2003(4):1-4.
[3] Junhao Hua. Distributed Variational Bayesian Algorithms. Github, 2017.