MATLAB生成大规模无线通信网络拓扑(任意节点数量)

发布于:2025-06-09 ⋅ 阅读:(19) ⋅ 点赞:(0)

功能:

 生成任意节点数量的网络拓扑,符合现实世界节点空间分布和连接规律

效果:

30节点:

100节点:

500节点:

程序:

%创建时间:2025年6月8日
%zhouzhichao
%自然生长出n节点的网络

% function [tp,tp_list] = large_nodes_tp(P_list,N)
close all
clear
N = 500;
P_list = ones(N,1);




tp = zeros(N);
tp(1,2)=1;tp(1,3)=1;tp(1,4)=1;%原点附近的拓扑关系直接写好
x = zeros(N,1);%存储每个节点的位置,以连接各个节点
y = zeros(N,1);
a_list = zeros(N,1);%存储每个节点角度

%%
%初级节点
%节点数量:1
%节点总数:1
%半径:0

x(1) = 0;
y(1) = 0;

c_R = 1;%当前圆环半径
c_M = 3;%当前圆环节点数量
c_index = 1;%当前节点index
last_r_list = [];


while c_index<=N
    
    r_list = [];%存储当前圆环上的节点
    alpha = 2*pi/c_M;
    initial_phase = rand(1)*2*pi;
    for i =1:c_M
        disp(["c_index: ",c_index])
        pause(0.01)
        r_list = [r_list,c_index];%存储当前节点
        %下面处理好当前节点的各种信息
        a = initial_phase+i*alpha;
        x(c_index)=c_R*cos(a);
        y(c_index)=c_R*sin(a);
        
        if ~isempty(last_r_list)
            p = min_d_node(c_index,last_r_list,x,y);
            tp(c_index,p) = 1;
        end
        c_index = c_index + 1;
        
    end
    
    %下一个圆环的半径增大
    last_r_list = r_list;%存储圆环上节点信息,方便下一个圆环生成节点时连接拓扑
    c_R = c_R + 1;
    a = round(1.8*c_M);
    if c_index + a<=N
        c_M = a;
    else
        c_M = N - c_index + 1;
    end
    
    
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