MATLAB仿真生成无线通信网络拓扑推理数据集
一、数据集生成程序
%创建时间:2025年6月3日
%用途:生成不同节点样本,统计稀疏性约束情况
%zhouzhichaoclose all
clearfor n = [20,30,40,50]dataset_n = 100;nodes_P = ones(n,1);for Sampling_M = [3000]%获取一帧信号及对应功率[ack,fs] = ack_generate(Sampling_M);ack_L = length(ack);signal = ack;P_signal = sum(abs(signal).^2);ack_noise = randn(ack_L, 1);P_noise_1 = sum(ack_noise.^2); % 计算当前噪声的能量as_slot_N = round(7*ack_L);ave_edge = round(1.5*n);L = ave_edge*3*a_slot_N;signals = zeros(n,L);% for snr=14:-2:0for snr=14:14Signals = zeros(dataset_n,n,L);Tp = zeros(dataset_n,n,n);Tp_list = cell(dataset_n,1);A = 10^(snr/10);P_noise = P_signal/A;alpha = sqrt(P_noise / P_noise_1); % 计算缩放因子noise = alpha*randn(1, L);for k=1:dataset_ndisp(["k: ",k])pause(0.01)switch ncase 20[tp,tp_list] = a20nodes_tp(nodes_P);case 30[tp,tp_list] = a30nodes_tp(nodes_P);case 40[tp,tp_list] = a40nodes_tp(nodes_P);case 50[tp,tp_list] = a50nodes_tp(nodes_P);endc = 0;% alpha = 0.01;n_edge = length(tp_list);for epoch=1:3index_list = randperm(n_edge);for i =index_listthis_slot_start_point = c*a_slot_N+1;p = tp_list(i,1);q = tp_list(i,2);P1 = nodes_P(p);P2 = nodes_P(q);%三次响应for m=1:3r_P = 0.9 + (1.1 - 0.9) * rand;signal = r_P*P1*ack;signals(p,this_slot_start_point+(2*m-2)*ack_L:this_slot_start_point+(2*m-1)*ack_L-1) = signal;r_P = 0.9 + (1.1 - 0.9) * rand;signal = r_P*P2*ack;signals(q,this_slot_start_point+(2*m-1)*ack_L:this_slot_start_point+(2*m)*ack_L-1) = signal;endc = c + 1;endendfor i=1:nsignals(i,:) = signals(i,:) + noise;endaa = tp*tp;D_list = zeros(n,1);for i=1:nD_list(i) = aa(i,i);endSignals(k,:,:) = signals;Tp(k,:,:) = tp;Tp_list{k} = tp_list;% set(gca, 'FontName', 'Times New Roman');save("D:\无线通信网络认知\论文1\大修意见\Reviewer1-3 稀疏性约束统计\graph of differ nodes\"+num2str(n)+"_nodes_dataset_snr-"+num2str(snr)+"_M_"+num2str(Sampling_M)+".mat","Tp","Tp_list","Signals")endendend
end
disp("数据集生成完成")
二、核心函数
1.生成20个节点的拓扑
%创建时间:2024年9月2日
%最后修改:2024年9月2日
%zhouzhichao
%自然生长出20节点网络function [tp,tp_list] = a20nodes_tp(P_list)% close all
% clear
N = 20;
% P_list = ones(N,1);tp = zeros(N);
count = 0;x = zeros(N,1);
y = zeros(N,1);%%
%中心节点附近的节点,2级别
x(1) = 0;
y(1) = 0;r2_list = [2,3,4];
a_list = zeros(N,1);a_list(2) = 0;
a_list(3) = 120/360*2*pi;
a_list(4) = 240/360*2*pi;x(2) = 1*cos(a_list(2));
y(2) = 1*sin(a_list(2));
x(3) = 1*cos(a_list(3));
y(3) = 1*sin(a_list(3));
x(4) = 1*cos(a_list(4));
y(4) = 1*sin(a_list(4));tp(1,2)=1;
tp(1,3)=1;
tp(1,4)=1;%%
%3级节点
m = 5;
r3_list = [];
alpha = 2*pi/m;
for i=1:mindex = i+4;r3_list = [r3_list,index];a = 60/360*2*pi+i*alpha;a_list(index) = a;x(index)=2*cos(a);y(index)=2*sin(a);p = min_d_node(index,r2_list,x,y);tp(index,p) = 1;
end%%
%4级节点
m = 8;
r4_list = [];
alpha = 2*pi/m;
for i=1:mindex = i+9;r4_list = [r4_list,index];a = 60/360*2*pi+i*alpha;a_list(index) = a;x(index)=3*cos(a);y(index)=3*sin(a);p = min_d_node(index,r3_list,x,y);tp(index,p) = 1;
end%%
m = 3;
% r4_list = [];
alpha = 2*pi/m;
for i=1:mindex = i+17;
% r4_list = [r4_list,index];a = 60/360*2*pi+i*alpha;a_list(index) = a;x(index)=4*cos(a);y(index)=4*sin(a);p = min_d_node(index,r4_list,x,y);tp(index,p) = 1;
end%%
%补环
x = x + (rand(size(x)) - 0.5) * 0.6;
y = y + (rand(size(y)) - 0.5) * 0.6;tp = tp + tp';
tp = add_circle(tp,x,y);
tp = add_circle(tp,x,y);
% tp = add_circle(tp,x,y);%%
%绘图% tp = tp + tp';% hold on;
%
% for i = 1:N
% for j = i+1:N
% if tp(i, j) == 1
% plot([x(i) x(j)], [y(i) y(j)], 'b', 'Color', [125/255, 178/255, 251/255]);
% end
% end
% end
%
% for i =1:length(x)
% % scatter(x(i), y(i), 100*P_list(i), [47/255, 132/255, 248/255], 'filled', 'MarkerFaceAlpha', P_list(i));
% scatter(x(i), y(i), 100, [47/255, 132/255, 248/255], 'filled', 'MarkerFaceAlpha', P_list(i));
% text(x(i)-0.1, y(i)+0.4, num2str(i), 'FontSize', 8, 'Color', [0/255, 0/255, 248/255]);
% end
% % scatter(x, y, [], [47/255, 132/255, 248/255], 'filled');
% xlabel('X');
% ylabel('Y');
% x_min = round(min(x)-1);
% x_max = round(max(x)+1);
% y_min = round(min(y)-1);
% y_max = round(max(y)+1);
% xlim([x_min x_max]);
% ylim([y_min y_max]);
% set(gca, 'FontName', 'Times New Roman');
%
%
% axis off;tp_list = [];% 遍历拓扑矩阵,找到所有有连接的节点对for i = 1:Nfor j = i+1:Nif tp(i, j) == 1% 添加节点对 [i, j] 到 nodePairs 矩阵tp_list = [tp_list; i, j];endendend
2.生成30个节点的拓扑
%创建时间:2024年8月28日
%最后修改:2024年9月2日
%zhouzhichao
%自然生长出N节点网络function [tp,tp_list] = a30nodes_tp(P_list)% close all
% clearN = 30;
tp = zeros(N);
count = 0;x = zeros(N,1);
y = zeros(N,1);%%
%中心节点附近的节点,2级别
x(1) = 0;
y(1) = 0;r2_list = [2,3,4];
a_list = zeros(N,1);a_list(2) = 0;
a_list(3) = 120/360*2*pi;
a_list(4) = 240/360*2*pi;x(2) = 1*cos(a_list(2));
y(2) = 1*sin(a_list(2));
x(3) = 1*cos(a_list(3));
y(3) = 1*sin(a_list(3));
x(4) = 1*cos(a_list(4));
y(4) = 1*sin(a_list(4));tp(1,2)=1;
tp(1,3)=1;
tp(1,4)=1;%%
%3级节点
m = 5;
r3_list = [];
alpha = 2*pi/m;
for i=1:mindex = i+4;r3_list = [r3_list,index];a = 60/360*2*pi+i*alpha;a_list(index) = a;x(index)=2*cos(a);y(index)=2*sin(a);p = min_d_node(index,r2_list,x,y);tp(index,p) = 1;
end%%
%4级节点
m = 8;
r4_list = [];
alpha = 2*pi/m;
for i=1:mindex = i+9;r4_list = [r4_list,index];a = 60/360*2*pi+i*alpha;a_list(index) = a;x(index)=3*cos(a);y(index)=3*sin(a);p = min_d_node(index,r3_list,x,y);tp(index,p) = 1;
end%%
m = 13;
% r4_list = [];
alpha = 2*pi/m;
for i=1:mindex = i+17;
% r4_list = [r4_list,index];a = 60/360*2*pi+i*alpha;a_list(index) = a;x(index)=4*cos(a);y(index)=4*sin(a);p = min_d_node(index,r4_list,x,y);tp(index,p) = 1;
end%%
%补环
x = x + (rand(size(x)) - 0.5) * 0.6;
y = y + (rand(size(y)) - 0.5) * 0.6;tp = tp + tp';
tp = add_circle(tp,x,y);
tp = add_circle(tp,x,y);
% tp = add_circle(tp,x,y);%%
%绘图tp_list = [];% 遍历拓扑矩阵,找到所有有连接的节点对for i = 1:Nfor j = i+1:Nif tp(i, j) == 1% 添加节点对 [i, j] 到 nodePairs 矩阵tp_list = [tp_list; i, j];endendend
3.生成40个节点的拓扑
%创建时间:2024年9月2日
%最后修改:2024年9月2日
%zhouzhichao
%自然生长出N节点网络function [tp,tp_list] = a40nodes_tp(P_list)% close all
% clearN = 40;
% P_list = ones(N,1);tp = zeros(N);count = 0;x = zeros(N,1);
y = zeros(N,1);%%
%中心节点附近的节点,2级别
x(1) = 0;
y(1) = 0;r2_list = [2,3,4];
a_list = zeros(N,1);a_list(2) = 0;
a_list(3) = 120/360*2*pi;
a_list(4) = 240/360*2*pi;x(2) = 1*cos(a_list(2));
y(2) = 1*sin(a_list(2));
x(3) = 1*cos(a_list(3));
y(3) = 1*sin(a_list(3));
x(4) = 1*cos(a_list(4));
y(4) = 1*sin(a_list(4));tp(1,2)=1;
tp(1,3)=1;
tp(1,4)=1;%%
%3级节点
m = 5;
r3_list = [];
alpha = 2*pi/m;
for i=1:mindex = i+4;r3_list = [r3_list,index];a = 60/360*2*pi+i*alpha;a_list(index) = a;x(index)=2*cos(a);y(index)=2*sin(a);p = min_d_node(index,r2_list,x,y);tp(index,p) = 1;
end%%
%4级节点
m = 8;
r4_list = [];
alpha = 2*pi/m;
for i=1:mindex = i+9;r4_list = [r4_list,index];a = 60/360*2*pi+i*alpha;a_list(index) = a;x(index)=3*cos(a);y(index)=3*sin(a);p = min_d_node(index,r3_list,x,y);tp(index,p) = 1;
end%%
m = 13;
r5_list = [];
alpha = 2*pi/m;
for i=1:mindex = i+17;r5_list = [r5_list,index];a = 60/360*2*pi+i*alpha;a_list(index) = a;x(index)=4*cos(a);y(index)=4*sin(a);p = min_d_node(index,r4_list,x,y);tp(index,p) = 1;
end%%
m = 10;
% r4_list = [];
alpha = 2*pi/m;
for i=1:mindex = i+30;
% r4_list = [r4_list,index];a = 60/360*2*pi+i*alpha;a_list(index) = a;x(index)=5*cos(a);y(index)=5*sin(a);p = min_d_node(index,r5_list,x,y);tp(index,p) = 1;
end%%
%补环
x = x + (rand(size(x)) - 0.5) * 0.6;
y = y + (rand(size(y)) - 0.5) * 0.6;tp = tp + tp';
tp = add_circle(tp,x,y);
tp = add_circle(tp,x,y);
% tp = add_circle(tp,x,y);%%tp_list = [];% 遍历拓扑矩阵,找到所有有连接的节点对for i = 1:Nfor j = i+1:Nif tp(i, j) == 1% 添加节点对 [i, j] 到 nodePairs 矩阵tp_list = [tp_list; i, j];endendend
4.生成50个节点的拓扑
%创建时间:2024年9月2日
%最后修改:2024年9月2日
%zhouzhichao
%自然生长出N节点网络function [tp,tp_list] = a50nodes_tp(P_list)% close all
% clearN = 50;
% P_list = ones(N,1);tp = zeros(N);count = 0;x = zeros(N,1);
y = zeros(N,1);%%
%中心节点附近的节点,2级别
x(1) = 0;
y(1) = 0;r2_list = [2,3,4];
a_list = zeros(N,1);a_list(2) = 0;
a_list(3) = 120/360*2*pi;
a_list(4) = 240/360*2*pi;x(2) = 1*cos(a_list(2));
y(2) = 1*sin(a_list(2));
x(3) = 1*cos(a_list(3));
y(3) = 1*sin(a_list(3));
x(4) = 1*cos(a_list(4));
y(4) = 1*sin(a_list(4));tp(1,2)=1;
tp(1,3)=1;
tp(1,4)=1;%%
%3级节点
m = 5;
r3_list = [];
alpha = 2*pi/m;
for i=1:mindex = i+4;r3_list = [r3_list,index];a = 60/360*2*pi+i*alpha;a_list(index) = a;x(index)=2*cos(a);y(index)=2*sin(a);p = min_d_node(index,r2_list,x,y);tp(index,p) = 1;
end%%
%4级节点
m = 8;
r4_list = [];
alpha = 2*pi/m;
for i=1:mindex = i+9;r4_list = [r4_list,index];a = 60/360*2*pi+i*alpha;a_list(index) = a;x(index)=3*cos(a);y(index)=3*sin(a);p = min_d_node(index,r3_list,x,y);tp(index,p) = 1;
end%%
m = 13;
r5_list = [];
alpha = 2*pi/m;
for i=1:mindex = i+17;r5_list = [r5_list,index];a = 60/360*2*pi+i*alpha;a_list(index) = a;x(index)=4*cos(a);y(index)=4*sin(a);p = min_d_node(index,r4_list,x,y);tp(index,p) = 1;
end%%
m = 20;
% r4_list = [];
alpha = 2*pi/m;
for i=1:mindex = i+30;
% r4_list = [r4_list,index];a = 60/360*2*pi+i*alpha;a_list(index) = a;x(index)=5*cos(a);y(index)=5*sin(a);p = min_d_node(index,r5_list,x,y);tp(index,p) = 1;
end%%
%补环
x = x + (rand(size(x)) - 0.5) * 0.6;
y = y + (rand(size(y)) - 0.5) * 0.6;tp = tp + tp';
tp = add_circle(tp,x,y);
tp = add_circle(tp,x,y);
% tp = add_circle(tp,x,y);%%tp_list = [];% 遍历拓扑矩阵,找到所有有连接的节点对for i = 1:Nfor j = i+1:Nif tp(i, j) == 1% 添加节点对 [i, j] 到 nodePairs 矩阵tp_list = [tp_list; i, j];endendend
5.加载实采波形
% close all
% clear
%zhouzhichao
%创建时间:2024年8月25日
%最后修改时间:2024年9月3日function [Ack,fs] = ack_generate(M)load("D:\无线通信网络认知\论文1\experiment\直推式拓扑推理实验\拓扑生成\Ack.mat");% M = 2000;
Ack = downsample(Ack, M);
fs = 1e6/M;