MATLAB 程序实现了一个层次化光网络的数据传输模拟系统

发布于:2025-04-18 ⋅ 阅读:(21) ⋅ 点赞:(0)
% 主程序
num_pods = 4;                % Pod 数量
num_racks_per_pod = 4;       % 每个 Pod 的 Rack 数量
num_nodes_per_rack = 4;      % 每个 Rack 的 Node 数量
max_wavelength = 50;         % 可用波长数(根据冲突图动态调整)
num_packets = 1000;          % 模拟的数据包数量
packet_size = 1500;          % 数据包大小(字节)
link_bandwidth = 100e6;      % 链路带宽(100 Mbps)
link_delay = 1e-6;           % 链路传播时延(1微秒)

% 生成网络拓扑(优化连接,减少全连接)
[adj_matrix, node_list] = generate_topology(num_pods, num_racks_per_pod, num_nodes_per_rack);

% 生成动态流量矩阵(含热点区域)
traffic_matrix = generate_traffic_matrix(length(node_list), num_packets);

% 波长分配(使用 Misra & Gries 和贪心算法)
[wavelength_assignment, conflict_graph] = assign_wavelengths(adj_matrix, max_wavelength);

% 输出冲突图信息
fprintf('冲突图边数: %d\n', sum(conflict_graph(:)) / 2);
fprintf('波长分配完成,使用的波长数: %d\n', length(unique(wavelength_assignment)));

% 模拟数据传输(包含动态时延和阻塞率计算)
[avg_delay, blocking_rate] = simulate_network(adj_matrix, wavelength_assignment, traffic_matrix, link_bandwidth, link_delay, packet_size);

% 输出结果
fprintf('平均时延: %.6f 秒\n', avg_delay);
fprintf('阻塞率: %.2f%%\n', blocking_rate * 100);

% ================== 函数定义 ================== %

function [adj_matrix, node_list] = generate_topology(num_pods, num_racks_per_pod, num_nodes_per_rack)
    % 生成层次化网络拓扑
    total_nodes = num_pods * num_racks_per_pod * num_nodes_per_rack;
    adj_matrix = zeros(total_nodes, total_nodes); % 邻接矩阵
    node_list = 1:total_nodes; % 节点列表

    % 构建Pod内Rack间的连接
    for pod = 1:num_pods
        start_rack = (pod-1)*num_racks_per_pod + 1;
        end_rack = pod*num_racks_per_pod;
        racks_in_pod = start_rack:end_rack;

        % 每个Rack内的Node全连接
        for rack = racks_in_pod
            nodes = (rack-1)*num_nodes_per_rack + 1 : rack*num_nodes_per_rack;
            adj_matrix(nodes, nodes) = 1;
        end

        % Pod内Rack间的连接(50%概率)
        for i = 1:length(racks_in_pod)
            for j = i+1:length(racks_in_pod)
                if rand() < 0.5
                    rack1 = racks_in_pod(i);
                    rack2 = racks_in_pod(j);
                    range1 = (rack1-

网站公告

今日签到

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