将人工鱼群算法Artificial Fish Swarm Algorithm, AFSA应用于基于OFDM的认知无线电Cognitive Radio, CR网络的功率分配是一个非常经典的启发式算法解决通信资源分配的跨领域课题。传统的拉格朗日乘子法或凸优化工具在应对大规模OFDM子载波和复杂干扰约束时极易陷入“维度灾难”或局部最优。而AFSA凭借其无需梯度信息、全局寻优能力强、对初值不敏感的特点简直是为这种高维、非凸的功率分配问题量身定制的。一、 系统模型与问题建模1. 场景设定假设我们有一个由NNN个子载波组成的OFDM认知无线电系统。次用户SU在保障不干扰主用户PU的前提下利用这些子载波进行数据传输。2. 数学模型设pip_ipi​为第iii个子载波上分配的传输功率hih_ihi​为对应的信道增益。则次用户在第iii个子载波上的可达速率为Rilog⁡2(1pihiσ2IiPU) R_i \log_2 \left( 1 \frac{p_i h_i}{\sigma^2 I_i^{PU}} \right)Ri​log2​(1σ2IiPU​pi​hi​​)σ2\sigma^2σ2为噪声功率IiPUI_i^{PU}IiPU​为主用户在子载波iii上对次用户的跨频段干扰3. 目标函数与约束条件我们的目标是最大化次用户系统的总传输速率Maximize ∑i1Nlog⁡2(1pihiσ2IiPU) \text{Maximize } \sum_{i1}^{N} \log_2 \left( 1 \frac{p_i h_i}{\sigma^2 I_i^{PU}} \right)Maximizei1∑N​log2​(1σ2IiPU​pi​hi​​)受制于以下约束次用户总功率约束∑i1Npi≤Ptotal\sum_{i1}^{N} p_i \le P_{total}∑i1N​pi​≤Ptotal​主用户干扰温度约束核心CR特性∑i1Npigi≤Ith\sum_{i1}^{N} p_i g_i \le I_{th}∑i1N​pi​gi​≤Ith​gig_igi​是次用户发射机到主用户接收机的干扰信道增益IthI_{th}Ith​是主用户能容忍的最大干扰门限单载波功率非负约束0≤pi≤Pmax0 \le p_i \le P_{max}0≤pi​≤Pmax​二、 算法设计AFSA与功率分配的映射在AFSA中每一尾“人工鱼”代表一个可能的功率分配方案。鱼的位置 (XiX_iXi​)一个1×N1 \times N1×N的向量即[p1,p2,...,pN][p_1, p_2, ..., p_N][p1​,p2​,...,pN​]。食物浓度适应度函数即目标函数总速率但必须将约束条件转换为惩罚项加入。三、 核心 MATLAB 实现代码你可以直接在MATLAB中新建脚本将以下三个部分分别保存为独立的.m文件。3.1 主程序cr_ofdm_afsa_main.m%% 基于AFSA算法的OFDM认知无线电功率分配主程序clear all;close all;clc;%% 1. 系统参数初始化N16;% OFDM子载波数量P_total10;% 次用户总功率限制 (W)I_th5;% 主用户干扰温度门限 (W)P_max2;% 单子载波最大功率 (W)sigma21e-4;% 噪声功率 (W)% 随机生成信道增益和干扰增益 (实际中由信道估计得到)Hrandn(1,N).^21;% 次用户合法信道增益Grandn(1,N).^2*0.5;% 对主用户的干扰信道增益 (通常较弱)I_purandn(1,N).^2*0.1;% 主用户对次用户的跨频干扰params.NN;params.P_totalP_total;params.I_thI_th;params.P_maxP_max;params.sigma2sigma2;params.HH;params.GG;params.I_puI_pu;%% 2. 人工鱼群算法参数fish_num50;% 鱼群规模max_iter200;% 最大迭代次数step0.5;% 移动步长visual2.0;% 感知距离try_number10;% 觅食行为尝试次数delta0.618;% 拥挤度因子% 初始化鱼群 (位置、适应度)fish_posrand(fish_num,N)*P_total/N;best_fishfish_pos(1,:);best_fitness-inf;fitness_historyzeros(max_iter,1);%% 3. 迭代寻优foriter1:max_iterfori1:fish_num% 计算当前鱼的适应度current_fishfish_pos(i,:);current_fitnesscalculate_fitness(current_fish,params);% 更新全局最优ifcurrent_fitnessbest_fitness best_fitnesscurrent_fitness;best_fishcurrent_fish;end% --- AFSA 核心行为 ---% 1. 觅食行为 (Prey)new_pos_preyprey_behavior(current_fish,fish_pos,step,visual,try_number,params);fitness_preycalculate_fitness(new_pos_prey,params);% 2. 聚群行为 (Swarm)new_pos_swarmswarm_behavior(current_fish,fish_pos,step,visual,delta,params);fitness_swarmcalculate_fitness(new_pos_swarm,params);% 3. 追尾行为 (Follow)new_pos_followfollow_behavior(current_fish,fish_pos,step,visual,delta,params);fitness_followcalculate_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];ifmax_fitnesscurrent_fitnessfish_pos(i,:)new_positions(idx,:);else% 随机移动 (Bulletin)fish_pos(i,:)random_behavior(current_fish,step,params);endend% 记录历史最优适应度fitness_history(iter)best_fitness;ifmod(iter,10)0fprintf(迭代次数: %d, 最大总速率: %.4f bps/Hz\n,iter,best_fitness);endend%% 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.mfunctionfitnesscalculate_fitness(power_alloc,params)% 计算适应度 (系统总速率)并将约束转化为惩罚项Nparams.N;Hparams.H;I_puparams.I_pu;sigma2params.sigma2;P_totalparams.P_total;I_thparams.I_th;P_maxparams.P_max;% 防止出现非法功率值power_alloc(power_alloc0)0;power_alloc(power_allocP_max)P_max;% 计算基础目标函数 (总速率)rate0;fori1:N sinr(power_alloc(i)*H(i))/(sigma2I_pu(i));rateratelog2(1sinr);end% --- 约束条件的惩罚函数设计 ---penalty0;% 1. 总功率越界惩罚ifsum(power_alloc)P_total penaltypenalty1000*(sum(power_alloc)-P_total)^2;end% 2. 干扰温度越界惩罚% 假设干扰增益 G 在 calc 里传入这里为了简化直接在 params 取Gparams.G;interferencesum(power_alloc.*G);ifinterferenceI_th penaltypenalty1000*(interference-I_th)^2;end% 最终适应度 目标函数值 - 惩罚项fitnessrate-penalty;end3.3 AFSA 核心行为函数封装版(建议将它们放在与主程序同一路径下)%% 觅食行为 (Prey)functionnew_posprey_behavior(current_pos,fish_pos,step,visual,try_number,params)idxrandperm(length(current_pos),1);fori1:try_number rand_poscurrent_posvisual*(2*rand(size(current_pos))-1);ifcalculate_fitness(rand_pos,params)calculate_fitness(current_pos,params)new_poscurrent_posstep*(rand_pos-current_pos)/norm(rand_pos-current_pos);return;endendnew_poscurrent_pos;% 如果没有更好的位置则原地不动end%% 聚群行为 (Swarm)functionnew_posswarm_behavior(current_pos,fish_pos,step,visual,delta,params)Nsize(fish_pos,1);center_posmean(fish_pos);distnorm(current_pos-center_pos);ifdistvisualcalculate_fitness(center_pos,params)/Ndelta*calculate_fitness(current_pos,params)new_poscurrent_posstep*(center_pos-current_pos)/dist;elsenew_poscurrent_pos;endend%% 追尾行为 (Follow)functionnew_posfollow_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_neighborfish_pos(best_idx,:);distnorm(current_pos-best_neighbor);ifdistvisualcalculate_fitness(best_neighbor,params)delta*calculate_fitness(current_pos,params)new_poscurrent_posstep*(best_neighbor-current_pos)/dist;elsenew_poscurrent_pos;endend%% 随机行为 (Bulletin)functionnew_posrandom_behavior(current_pos,step,params)new_poscurrent_posstep*(2*rand(size(current_pos))-1);new_posmax(0,min(new_pos,params.P_max));% 限制在合法范围内end参考代码 基于OFDM的认知无线电网络www.youwenfan.com/contentcsu/63302.html四、 仿真结果与分析预期运行上述代码后你将得到两张图收敛曲线展示随着迭代次数增加系统总速率如何快速上升并最终趋于平稳证明AFSA能够有效逼近最优解。功率分配瀑布图展示在众多子载波中哪些信道条件好HiH_iHi​大且GiG_iGi​小的子载波被分配了更高的功率而那些可能引起主用户干扰的子载波则被“压制”功率接近0。这正是**注水算法Water-filling**在干扰约束下的认知无线电表现形式。