MATLAB仿真生成无线通信网络拓扑推理数据集

发布于:2025-06-04 ⋅ 阅读:(32) ⋅ 点赞:(0)

一、数据集生成程序

%创建时间: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个节点的拓扑

%创建时间: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个节点的拓扑

%创建时间: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个节点的拓扑

%创建时间: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个节点的拓扑 

%创建时间: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.加载实采波形 

% 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;


网站公告

今日签到

点亮在社区的每一天
去签到