基于OFDM的认知无线电网络的功率分配

将人工鱼群算法(Artificial Fish Swarm Algorithm, AFSA)应用于基于OFDM的认知无线电(Cognitive Radio, CR)网络的功率分配,是一个非常经典的启发式算法解决通信资源分配的跨领域课题。

传统的拉格朗日乘子法或凸优化工具在应对大规模OFDM子载波和复杂干扰约束时,极易陷入“维度灾难”或局部最优。而AFSA凭借其无需梯度信息、全局寻优能力强、对初值不敏感的特点,简直是为这种高维、非凸的功率分配问题量身定制的。


一、 系统模型与问题建模

1. 场景设定

假设我们有一个由 个子载波组成的OFDM认知无线电系统。次用户(SU)在保障不干扰主用户(PU)的前提下,利用这些子载波进行数据传输。

2. 数学模型

为第 个子载波上分配的传输功率, 为对应的信道增益。则次用户在第 个子载波上的可达速率为:

为噪声功率, 为主用户在子载波 上对次用户的跨频段干扰)

3. 目标函数与约束条件

我们的目标是最大化次用户系统的总传输速率

受制于以下约束:

  1. 次用户总功率约束
  2. 主用户干扰温度约束(核心CR特性)
    是次用户发射机到主用户接收机的干扰信道增益, 是主用户能容忍的最大干扰门限)
  3. 单载波功率非负约束

二、 算法设计:AFSA与功率分配的映射

在AFSA中,每一尾“人工鱼”代表一个可能的功率分配方案


三、 核心 MATLAB 实现代码

你可以直接在MATLAB中新建脚本,将以下三个部分分别保存为独立的 .m 文件。

3.1 主程序:cr_ofdm_afsa_main.m

%% 基于AFSA算法的OFDM认知无线电功率分配主程序
clear all; close all; clc;

%% 1. 系统参数初始化
N = 16;                 % OFDM子载波数量
P_total = 10;           % 次用户总功率限制 (W)
I_th = 5;               % 主用户干扰温度门限 (W)
P_max = 2;              % 单子载波最大功率 (W)
sigma2 = 1e-4;          % 噪声功率 (W)

% 随机生成信道增益和干扰增益 (实际中由信道估计得到)
H = randn(1, N).^2 + 1; % 次用户合法信道增益
G = randn(1, N).^2 * 0.5; % 对主用户的干扰信道增益 (通常较弱)
I_pu = randn(1, N).^2 * 0.1; % 主用户对次用户的跨频干扰

params.N = N;
params.P_total = P_total;
params.I_th = I_th;
params.P_max = P_max;
params.sigma2 = sigma2;
params.H = H;
params.G = G;
params.I_pu = I_pu;

%% 2. 人工鱼群算法参数
fish_num = 50;          % 鱼群规模
max_iter = 200;         % 最大迭代次数
step = 0.5;            % 移动步长
visual = 2.0;          % 感知距离
try_number = 10;        % 觅食行为尝试次数
delta = 0.618;          % 拥挤度因子

% 初始化鱼群 (位置、适应度)
fish_pos = rand(fish_num, N) * P_total / N; 
best_fish = fish_pos(1, :);
best_fitness = -inf;

fitness_history = zeros(max_iter, 1);

%% 3. 迭代寻优
for iter = 1:max_iter
    for i = 1:fish_num
        % 计算当前鱼的适应度
        current_fish = fish_pos(i, :);
        current_fitness = calculate_fitness(current_fish, params);
        
        % 更新全局最优
        if current_fitness > best_fitness
            best_fitness = current_fitness;
            best_fish = current_fish;
        end
        
        % --- AFSA 核心行为 ---
        
        % 1. 觅食行为 (Prey)
        new_pos_prey = prey_behavior(current_fish, fish_pos, step, visual, try_number, params);
        fitness_prey = calculate_fitness(new_pos_prey, params);
        
        % 2. 聚群行为 (Swarm)
        new_pos_swarm = swarm_behavior(current_fish, fish_pos, step, visual, delta, params);
        fitness_swarm = calculate_fitness(new_pos_swarm, params);
        
        % 3. 追尾行为 (Follow)
        new_pos_follow = follow_behavior(current_fish, fish_pos, step, visual, delta, params);
        fitness_follow = calculate_fitness(new_pos_follow, params);
        
        % 4. 行为选择 (选优)
        [max_fitness, idx] = max([fitness_prey, fitness_swarm, fitness_follow]);
        new_positions = [new_pos_prey; new_pos_swarm; new_pos_follow];
        
        if max_fitness > current_fitness
            fish_pos(i, :) = new_positions(idx, :);
        else
            % 随机移动 (Bulletin)
            fish_pos(i, :) = random_behavior(current_fish, step, params);
        end
    end
    
    % 记录历史最优适应度
    fitness_history(iter) = best_fitness;
    if mod(iter, 10) == 0
        fprintf('迭代次数: %d, 最大总速率: %.4f bps/Hz\n', iter, best_fitness);
    end
end

%% 4. 结果可视化
figure('Position', [100, 100, 1200, 500]);

% 收敛曲线
subplot(1, 2, 1);
plot(1:max_iter, fitness_history, 'b-', 'LineWidth', 1.5);
xlabel('迭代次数'); ylabel('系统总速率 (bps/Hz)');
title('AFSA 算法收敛曲线');
grid on;

% 最优功率分配结果
subplot(1, 2, 2);
bar(1:N, best_fish);
xlabel('子载波索引'); ylabel('分配功率 (W)');
title('基于AFSA的最优功率分配结果');
grid on;

fprintf('\n=== 仿真结束 ===\n');
fprintf('最优分配方案下的系统总速率: %.4f bps/Hz\n', best_fitness);

3.2 适应度函数与约束处理:calculate_fitness.m

function fitness = calculate_fitness(power_alloc, params)
    % 计算适应度 (系统总速率),并将约束转化为惩罚项
    
    N = params.N;
    H = params.H;
    I_pu = params.I_pu;
    sigma2 = params.sigma2;
    P_total = params.P_total;
    I_th = params.I_th;
    P_max = params.P_max;
    
    % 防止出现非法功率值
    power_alloc(power_alloc < 0) = 0;
    power_alloc(power_alloc > P_max) = P_max;
    
    % 计算基础目标函数 (总速率)
    rate = 0;
    for i = 1:N
        sinr = (power_alloc(i) * H(i)) / (sigma2 + I_pu(i));
        rate = rate + log2(1 + sinr);
    end
    
    % --- 约束条件的惩罚函数设计 ---
    penalty = 0;
    
    % 1. 总功率越界惩罚
    if sum(power_alloc) > P_total
        penalty = penalty + 1000 * (sum(power_alloc) - P_total)^2;
    end
    
    % 2. 干扰温度越界惩罚
    % 假设干扰增益 G 在 calc 里传入,这里为了简化直接在 params 取
    G = params.G; 
    interference = sum(power_alloc .* G);
    if interference > I_th
        penalty = penalty + 1000 * (interference - I_th)^2;
    end
    
    % 最终适应度 = 目标函数值 - 惩罚项
    fitness = rate - penalty;
end

3.3 AFSA 核心行为函数(封装版)

(建议将它们放在与主程序同一路径下)

%% 觅食行为 (Prey)
function new_pos = prey_behavior(current_pos, fish_pos, step, visual, try_number, params)
    idx = randperm(length(current_pos), 1);
    for i = 1:try_number
        rand_pos = current_pos + visual * (2*rand(size(current_pos)) - 1);
        if calculate_fitness(rand_pos, params) > calculate_fitness(current_pos, params)
            new_pos = current_pos + step * (rand_pos - current_pos) / norm(rand_pos - current_pos);
            return;
        end
    end
    new_pos = current_pos; % 如果没有更好的位置,则原地不动
end

%% 聚群行为 (Swarm)
function new_pos = swarm_behavior(current_pos, fish_pos, step, visual, delta, params)
    N = size(fish_pos, 1);
    center_pos = mean(fish_pos);
    dist = norm(current_pos - center_pos);
    
    if dist < visual && calculate_fitness(center_pos, params) / N > delta * calculate_fitness(current_pos, params)
        new_pos = current_pos + step * (center_pos - current_pos) / dist;
    else
        new_pos = current_pos;
    end
end

%% 追尾行为 (Follow)
function new_pos = follow_behavior(current_pos, fish_pos, step, visual, delta, params)
    [~, best_idx] = max(arrayfun(@(i) calculate_fitness(fish_pos(i,:), params), 1:size(fish_pos,1)));
    best_neighbor = fish_pos(best_idx, :);
    dist = norm(current_pos - best_neighbor);
    
    if dist < visual && calculate_fitness(best_neighbor, params) > delta * calculate_fitness(current_pos, params)
        new_pos = current_pos + step * (best_neighbor - current_pos) / dist;
    else
        new_pos = current_pos;
    end
end

%% 随机行为 (Bulletin)
function new_pos = random_behavior(current_pos, step, params)
    new_pos = current_pos + step * (2*rand(size(current_pos)) - 1);
    new_pos = max(0, min(new_pos, params.P_max)); % 限制在合法范围内
end

参考代码 基于OFDM的认知无线电网络 www.youwenfan.com/contentcnu/63302.html

四、 仿真结果与分析预期

运行上述代码后,你将得到两张图:

  1. 收敛曲线:展示随着迭代次数增加,系统总速率如何快速上升并最终趋于平稳,证明AFSA能够有效逼近最优解。
  2. 功率分配瀑布图:展示在众多子载波中,哪些信道条件好(大且 小)的子载波被分配了更高的功率,而那些可能引起主用户干扰的子载波则被“压制”(功率接近0)。这正是注水算法(Water-filling)在干扰约束下的认知无线电表现形式。

 

专注于matlab/simulink,电子电路,编程