📄 fun_sigma.asv
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%计算优化影响因子sigma,这里可以计算无向图的Sigma,但是不能计算有向图的
%% 输入:网络G=(V,E),ni个节点,m条边; 网络内各个节点的质量(向量)
%% 输出:二维矩阵,【熵,影响因子】
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [Flt_H] = Fun_Sigma( Relation, Lin_Mass)
%% 转换成0表示两个节点之间没有连边
Int_Num = size(Relation ,1);
Net =Relation;
for i=1:Int_Num
for j= 1: Int_Num
if Relation(i, j) == Inf
Net(i,j) = 0;
end
end
end
%% 计算图中各个节点的度,得到一个行向量
Row_Degree = sum( Net, 1);
%%计算图的距离矩阵
Net = Fun_Distance (Relation);
%%各个节点的质量设为1,影响范围为所有的节点都有影响。
% Lin_Mass = ones(1,Int_Num);
Num_EffectRange = Inf;
Sigma= 0.002;
j=1;
while Sigma < 10 %%算到Sigma<6就可以了,如果需要画图,再多算一点。
for i = 1: Int_Num
Lin_H(i) = Fun_ComputePotential (Mat_Distance(:),i, Sigma, Lin_Mass,Num_EffectRange);
%(距离行向量,需要计算的目的节点号,影响因子,质量向量,影响范围)
end
Flt_H(j,1)= Fun_H(Lin_H);
Flt_H(j,2)=Sigma;
j=j+1;
Sigma= Sigma+0.01;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 计算图中某一某一节点i的势函数
%%输入:距离矩阵的第i行Mat_DistanceLine, 节点总数Num_Node, 需要计算的节点i——Num_ObjectNode,
%%影响因子Num_Sigma,质量矩阵Mat_Mass, 有效值范围 Num_EffectRange;
%%输出:图中节点i的势值;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [Num_ObjectNodePotential] = Fun_ComputePotential (Mat_DistanceLine, Num_ObjectNode, Num_Sigma,Lin_Mass,Num_EffectRange)
%%对变量进行初始化;
Num_Node = size( Mat_DistanceLine, 2);
Num_ObjectNodePotential = 0;
Num_line = Num_Node;
Lin_ObjectNodePotentail = zeros(1,Num_line);
%%%%%%%%%%%%%%%%% 计算单个节点对目标节点产生的势值,并将其存入临时矩阵中
for i = 1:Nodes
%% 若节点与目标节点之间的距离大于制定影响范围,则对该节点产生的势值为0,否则计算对该节点的势值
if Mat_DistanceLine( i) > Num_EffectRange
Lin_ObjectNodePotential( i) = 0;
else
Num_AMidValue = Mat_DistanceLine( i) / Num_Sigma;
Lin_ObjectNodePotential( i) = Lin_Mass(i)* exp( (-1) * Num_AMidValue * Num_AMidValue);
end
end
for i = 1 : Nodes
Num_ObjectNodePotential = Num_ObjectNodePotential + Lin_ObjectNodePotential( i);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 该函数计算图 点i到到点j的最短路径
%%输入:图的链接矩阵;
%%输出:距离矩阵
%%By Xiao Lp, 2007-07-06
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [b] = Fun_Distance(Edge);
N=size(Edge,1); %%节点个数
%%floyd
b=Edge+Edge';
path=zeros(length(b));
for k=1:N
for i=1:N
for j=1:N
if b(i,j)>b(i,k)+b(k,j)
b(i,j)=b(i,k)+b(k,j);
path(i,j)=k;
end
end
end
end
b=b/2;
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %% 计算势熵H
% %% 输入:势向量
% %% 输出:势熵
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [Flt_H] = Fun_H( Lin_Potential)
Int_Num = size(Lin_Potential ,2);
Flt_Z= 0;
%%计算归一化因子Z——Flt_Z
for i = 1:Int_Num
Flt_Z = Lin_Potential(i) + Flt_Z;
end
Lin_H = zeros(1,Int_Num);
Flt_H = 0;
for i = 1:Int_Num
Lin_H(i) = (-1) * (Lin_Potential(i) / Flt_Z) * log( Lin_Potential(i) / Flt_Z);
end
for i = 1:Int_Num
Flt_H = Flt_H + Lin_H(i);
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -