一、数据集生成程序
Matlab
%创建时间:2025年6月3日
%用途:生成不同节点样本,统计稀疏性约束情况
%zhouzhichao
close all
clear
for 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:0
for snr=14:14
Signals = 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_n
disp(["k: ",k])
pause(0.01)
switch n
case 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);
end
c = 0;
% alpha = 0.01;
n_edge = length(tp_list);
for epoch=1:3
index_list = randperm(n_edge);
for i =index_list
this_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:3
r_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;
end
c = c + 1;
end
end
for i=1:n
signals(i,:) = signals(i,:) + noise;
end
aa = tp*tp;
D_list = zeros(n,1);
for i=1:n
D_list(i) = aa(i,i);
end
Signals(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")
end
end
end
end
disp("数据集生成完成")
二、拓扑生成部分
1.生成20个节点的拓扑

Matlab
%创建时间: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:m
index = 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:m
index = 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:m
index = 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:N
for j = i+1:N
if tp(i, j) == 1
% 添加节点对 [i, j] 到 nodePairs 矩阵
tp_list = [tp_list; i, j];
end
end
end
2.生成30个节点的拓扑

Matlab
%创建时间:2024年8月28日
%最后修改:2024年9月2日
%zhouzhichao
%自然生长出N节点网络
function [tp,tp_list] = a30nodes_tp(P_list)
% close all
% clear
N = 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:m
index = 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:m
index = 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:m
index = 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:N
for j = i+1:N
if tp(i, j) == 1
% 添加节点对 [i, j] 到 nodePairs 矩阵
tp_list = [tp_list; i, j];
end
end
end
3.生成40个节点的拓扑

Matlab
%创建时间:2024年9月2日
%最后修改:2024年9月2日
%zhouzhichao
%自然生长出N节点网络
function [tp,tp_list] = a40nodes_tp(P_list)
% close all
% clear
N = 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:m
index = 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:m
index = 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:m
index = 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:m
index = 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:N
for j = i+1:N
if tp(i, j) == 1
% 添加节点对 [i, j] 到 nodePairs 矩阵
tp_list = [tp_list; i, j];
end
end
end
4.生成50个节点的拓扑

python
%创建时间:2024年9月2日
%最后修改:2024年9月2日
%zhouzhichao
%自然生长出N节点网络
function [tp,tp_list] = a50nodes_tp(P_list)
% close all
% clear
N = 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:m
index = 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:m
index = 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:m
index = 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:m
index = 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:N
for j = i+1:N
if tp(i, j) == 1
% 添加节点对 [i, j] 到 nodePairs 矩阵
tp_list = [tp_list; i, j];
end
end
end
三、信号生成部分
5.加载实采波形

Matlab
% 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;
6.在拓扑中添加环状结构
Matlab
x = x + (rand(size(x)) - 0.5) * 0.6;%位置x,y加一些随机性
y = y + (rand(size(y)) - 0.5) * 0.6;
tp = tp + tp';
tp = add_circle(tp,x,y);
tp = add_circle(tp,x,y);
Matlab
function new_tp = add_circle(tp,x,y)
aa = tp*tp;
N = length(tp);
D_list = zeros(N,1);
for i =1:length(tp)
D_list(i) = aa(i,i);
end
col_list = find(D_list<3);
i=col_list(randi([1,length(col_list)]));
allow_list = allow_nodes(i,tp,x,y);
% if isempty(allow_list)==1
% continue
% end
min_i = min_d_node(i,allow_list,x,y);
tp(i,min_i)=1;
tp(min_i,i)=1;
% count = count + 1;
new_tp = tp;
7.大规模网络拓扑生成

Matlab
%创建时间:2025年6月5日
%zhouzhichao
%自然生长出100节点的网络
% function [tp,tp_list] = a100nodes_tp(P_list)
close all
clear
N = 100;
P_list = ones(N,1);
tp = zeros(N);
count = 0;
x = zeros(N,1);%存储每个节点的位置,以连接各个节点
y = zeros(N,1);
%%
%初级节点
%节点数量:1
%节点总数:1
%半径:0
x(1) = 0;
y(1) = 0;
%%
%中心节点附近的节点,2级节点
%节点数量:3
%节点总数:4
%半径:1
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级节点
%节点数量:5
%节点总数:9
%半径:2
m = 5;
r3_list = [];%存储每个节点的索引,以连接各个节点
alpha = 2*pi/m;
for i=1:m
index = 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级节点
%节点数量:8
%节点总数:17
%半径:3
m = 8;
r4_list = [];%存储每个节点的索引,以连接各个节点
alpha = 2*pi/m;
for i=1:m
index = 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
%%
%5级节点
%节点数量:13
%节点总数:30
%半径:4
m = 13;
r5_list = [];%存储每个节点的索引,以连接各个节点
alpha = 2*pi/m;
for i=1:m
index = 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
%%
%6级节点
%节点数量:20
%节点总数:50
%半径:5
m = 20;
r6_list = [];%存储每个节点的索引,以连接各个节点
alpha = 2*pi/m;
for i=1:m
index = i+30;
r6_list = [r6_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
%%
%7级节点
%节点数量:35
%节点总数:85
%半径:6
m = 35;
r7_list = [];
alpha = 2*pi/m;
for i=1:m
index = i+50;
r7_list = [r7_list,index];
a = 60/360*2*pi+i*alpha;
a_list(index) = a;
x(index)=6*cos(a);
y(index)=6*sin(a);
p = min_d_node(index,r6_list,x,y);
tp(index,p) = 1;
end
%%
%8级节点
%节点数量:15
%节点总数:100
%半径:7
m = 15;
r8_list = [];
alpha = 2*pi/m;
for i=1:m
index = i+85;
r8_list = [r8_list,index];
a = 60/360*2*pi+i*alpha;
a_list(index) = a;
x(index)=7*cos(a);
y(index)=7*sin(a);
p = min_d_node(index,r7_list,x,y);
tp(index,p) = 1;
end
%%
%补环
x = x + (rand(size(x)) - 0.5) * 0.6;%位置x,y加一些随机性
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';
grid on;
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:N
for j = i+1:N
if tp(i, j) == 1
% 添加节点对 [i, j] 到 nodePairs 矩阵
tp_list = [tp_list; i, j];
end
end
end
早期的一些拓扑生成结果,感觉效果都不是很好,怎么都不像一个正常的网络



