将人工鱼群算法(Artificial Fish Swarm Algorithm, AFSA)应用于基于OFDM的认知无线电(Cognitive Radio, CR)网络的功率分配,是一个非常经典的启发式算法解决通信资源分配的跨领域课题。
传统的拉格朗日乘子法或凸优化工具在应对大规模OFDM子载波和复杂干扰约束时,极易陷入“维度灾难”或局部最优。而AFSA凭借其无需梯度信息、全局寻优能力强、对初值不敏感的特点,简直是为这种高维、非凸的功率分配问题量身定制的。
一、 系统模型与问题建模
1. 场景设定
假设我们有一个由
2. 数学模型
设
(
3. 目标函数与约束条件
我们的目标是最大化次用户系统的总传输速率:
受制于以下约束:
- 次用户总功率约束:
- 主用户干扰温度约束(核心CR特性):
(是次用户发射机到主用户接收机的干扰信道增益, 是主用户能容忍的最大干扰门限) - 单载波功率非负约束:
二、 算法设计: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
四、 仿真结果与分析预期
运行上述代码后,你将得到两张图:
- 收敛曲线:展示随着迭代次数增加,系统总速率如何快速上升并最终趋于平稳,证明AFSA能够有效逼近最优解。
- 功率分配瀑布图:展示在众多子载波中,哪些信道条件好(
大且 小)的子载波被分配了更高的功率,而那些可能引起主用户干扰的子载波则被“压制”(功率接近0)。这正是注水算法(Water-filling)在干扰约束下的认知无线电表现形式。