matlab实现随机攻击⽹络节点+蓄意攻击⽹络节点(2)
matlab生成随机数上⼀篇介绍了随机攻击⽹络节点与蓄意攻击节点的基本⽅法。
其中随机攻击的部分还有⼀些瑕疵,就是在实际的研究中,需要对⽹络进⾏多次(数⼗次甚⾄上百次)攻击后取指标变化平均值,这样的实验数据才具有⼀定的说服⼒。
其实这个问题乍⼀听起来,原理也⽐较简单:就是让⼀个程序运⾏指定的次数然后,累加程序中某⼀个变量后取平均值。
实现起来也并不费劲,⾸先就是把这个程序定义为⼀个函数,然后把所需要累加的变量作为函数的返回值。然后在另⼀个⽂件中创建循环,在循环中调⽤该函数,⽤⼀个变量接收该函数的返回值,以达到累加的效果,最后在循环外部取⼀个平均值即可。
代码如下所⽰:
定义函数⽂件名称(该名称需要与函数名称相同)
函数的参数介绍:
输⼊值: str:意为数据⽂件的路径;numDelete:删除节点的个数(这⾥的命名只是为了⽅便并不是必选项)
返回值:Eglob,即⽹络效率值的数组
function Eglob = ATestAver(str,numDelete)
%输⼊:
%        str:意为数据⽂件的路径
%        numDelete:删除节点的个数
%返回值:Eglob,即⽹络效率值的数组
%加载数据⽂件
load(str);
Name_Struct = Node_Key_Sort_Descend;      %  Name_Struct 数据集名称,更换⽹络数据集时,需要更改此处结构体名称
A_Init =  Name_Struct.Adjacent_Matrix;      %% ⽹络邻接矩阵
N_Init = size(A_Init,1);                    %% 节点个数
NetEff_Init = zeros(1,numDelete);
Struct_Init = struct('Deg',NetEff_Init);
% 初始⽹络性能
%⽣成随机数,以此进⾏随机攻
Name_Struct.Node_Key_Degree = randperm(440);
%%
%  按照 Degree 算法排序,删除节点
A = A_Init;          %% ⽹络邻接矩阵 A
for i = 1:numDelete
% 按照 Degree 算法排序,删除节点
end
定义测试⽂件:
⽂件中需要定义随机攻击的次数和随机攻击节点的个数,具体参数设置应视具体⽹络⽽定。
在调⽤函数时,要传⼊⽂件路径,和删除节点的个数。
numDelete = 22;
netSum = zeros(1,numDelete);
numRandom = 50;
for i=1:numRandom
netI = ATestAver('Data\test.mat',numDelete);
netSum = netSum + netI;
end
%求出平均值
netAver = netSum/numRandom;
我的测试数据具有⼩世界特性与⽆标度特性。并得到了以下的结果:
⼤家可以看出,经过多次随机攻击取指标平均值之后,曲线近似于⼀条直线,下降速率较⼩且符合实际的⽹络情况。验证了⽆标度⽹络对于随机攻击拥有较好的鲁棒性。
内含完整⼯程⽂件还有测试数据,可直接使⽤。
希望本⽂对⼤家有所帮助,有任何问题或者是建议,欢迎⼤家与我交流。
上⼀篇⽂章:
给⼤家推荐⼀个⾮常好的可以使⽤免费Web of Science、zhi⽹、IEEE、EI等账号。亲测好⽤。这个⽹站拥有众多的数据库,法律的、医学的、⼯科的,等等。
感谢⼤家的时间,并希望以上的内容会对⼤家有所帮助。
并欢迎⼤家访问我的