MATLAB 复杂网络蓄意攻击代码

利用网络全局效率与网络连通率(极大连通子图节点数÷总结点数)衡量蓄意攻击下网络性能

1 全局效率计算:

clc;clear
A = xlsread('C:\Users\12345\Desktop\adj.xlsx',1);  %导入邻接矩阵
B = A; %copy矩阵,防止原数据被破坏

C=[154,132,167,99,19,39,53,120,102,122,137,164,112,67,162,...
    215,255,110,214,292,243,252,296,270,237,316,277];  %节点攻击顺序
Eglob=[];   %定义全局效率矩阵
Eglob_0=0.4716;  %可利用下面代码先计算网络未被攻击时的初始效率
for i=1:318
    B(C(i),:)=0;
    B(:,C(i))=0;
    B=sparse(B);  %转换为稀疏矩阵
    minpath=1./graphallshortestpaths(B);
    minpath(minpath==inf)=0;
    Eglob(i) =(1/(length(B)*(length(B)-1)))*sum(sum(minpath));  %全局效率
end
Eglob=[Eglob_0,Eglob];
Eglob'
node=0:318;
plot(node,Eglob,'-bs','MarkerFaceColor','b','linewidth',1,'markersize',4,'MarkerIndices',1:10:length(Eglob))
hold on
ylim([0 0.5]);
xlabel('失效节点数n');
ylabel('网络全局效率E_g');
legend('图例名');

2 连通率计算

clc;clear
A = xlsread('C:\Users\12345\Desktop\adj.xlsx',1);
B = A; %copy矩阵,防止原数据被破坏
C=[5,91,189,166,21,113,29,79,185,38,40,163,133,105,5,...
    269,203,267,295,245,43,286,279,278,298,303,288]; %节点攻击顺序
f=[];  %定义网络连通率空矩阵
f_0=1;  %初始连通率为1
zt=[];  %用于存储每次攻击后最大连通子图内节点数量
for i=1:318
    B(C(i),:)=0;
    B(:,C(i))=0;
    B=sparse(B);
    [a mZt]= components(B)  %a为索引,mZt为连通子图内节点数
    zt(i)=max(max(mZt))  %寻求最大连通子图内节点数
    f(i)=max(max(mZt))/318;
end
xlswrite('C:\Users\12345\Desktop\连通子图.xlsx',zt')
f=[f_0,f];
f'
node=0:318;
plot(node,f,'-bs','MarkerFaceColor','b','linewidth',1,'markersize',4,'MarkerIndices',1:10:length(f))
% plot(node,f,'-ro','MarkerFaceColor','r','linewidth',1,'markersize',4,'MarkerIndices',1:10:length(f))
hold on
ylim([0 1]);
xlabel('失效节点数n');
ylabel('网络连通率f');
legend('图例');

  • 8
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
以下是一个用Matlab实现最大全类型连通子图的代码: ```matlab function [maxSubgraph, typeCounts] = max_connected_subgraph(adjMatrix, nodeTypes) % 寻找最大全类型连通子图 % 输入: % adjMatrix - 邻接矩阵,1表示有连接,0表示无连接 % nodeTypes - 节点类型,用一个整数表示 % 输出: % maxSubgraph - 最大全类型连通子图的节点编号 % typeCounts - 最大全类型连通子图中每种类型的节点数 numNodes = size(adjMatrix, 1); % 节点数 typeList = unique(nodeTypes); % 类型列表 maxSubgraph = []; % 最大全类型连通子图的节点编号 maxSize = 0; % 最大全类型连通子图的大小 for i = 1:numNodes % 从每个节点出发,寻找全类型连通子图 queue = i; visited = zeros(1, numNodes); visited(i) = 1; subgraph = i; typeCounts = zeros(size(typeList)); typeCounts(nodeTypes(i) == typeList) = 1; while ~isempty(queue) node = queue(1); queue(1) = []; neighbors = find(adjMatrix(node, :)); for j = 1:length(neighbors) neighbor = neighbors(j); if ~visited(neighbor) visited(neighbor) = 1; if nodeTypes(neighbor) == nodeTypes(i) subgraph(end+1) = neighbor; typeCounts(nodeTypes(neighbor) == typeList) = typeCounts(nodeTypes(neighbor) == typeList) + 1; queue(end+1) = neighbor; end end end end % 判断是否是最大全类型连通子图 subgraphSize = length(subgraph); if subgraphSize > maxSize || (subgraphSize == maxSize && all(typeCounts >= maxTypeCounts)) maxSubgraph = subgraph; maxSize = subgraphSize; maxTypeCounts = typeCounts; end end typeCounts = maxTypeCounts; end ``` 该函数接受邻接矩阵和节点类型作为输入,返回最大全类型连通子图的节点编号和每种类型的节点数。 该函数的思路是从每个节点出发,寻找全类型连通子图。具体来说,从一个节点开始,使用广度优先搜索算法遍历所有与该节点连通的节点,将这些节点组成一个子图。在搜索过程中,记录每种类型的节点数。如果该子图的大小超过了当前找到的最大全类型连通子图的大小,或者该子图的大小与当前找到的最大全类型连通子图的大小相同但各种类型的节点数都不少于当前找到的最大全类型连通子图,就更新最大全类型连通子图的信息。 该算法的时间复杂度为O(n^2),其中n为节点数。如果使用了更高效的搜索算法,如深度优先搜索算法,时间复杂度可以降至O(n)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值