1.算法仿真效果
matlab2022a仿真结果如下:
2.算法涉及理论知识概要
3.1鲸鱼算法
鲸鱼算法(Whale Optimization Algorithm,WOA)[1]。鲸鱼优化算法(WOA)是 2016 年由澳大利亚格里菲斯大学的 Mirjalili 等提出的一种新的群体智能优化算法,因算法简练易于实现,且对目标函数条件要求宽松,参数控制较少等种种优点受到一批又一批学者的亲睐,且经过不断的改进WOA已应用于许多领域。WOA算法设计的既精妙又富有特色,它源于对自然界中座头鲸群体狩猎行为的模拟, 通过鲸鱼群体搜索、包围、追捕和攻击猎物等过程实现优时化搜索的目的。在原始的WOA中,提供了包围猎物,螺旋气泡、寻找猎物的数学模型。
WOA算法的初始阶段中,座头鲸并不知道食物所在的位置,他们都是通过群体合作来获得食物的位置信息,因此,距离食物最近的鲸鱼相当于当前的一个局部最优解,其他鲸鱼个体都会朝这个位置靠近,从而逐步包围食物,因此使用下列的数学模型表示:
2.2气泡攻击
本阶段模仿座头鲸进行气泡攻击,通过收缩包围和螺旋更新位置来设计鲸鱼捕食吐出气泡的行为,从而达到鲸鱼局部寻优的目的。
(1)螺旋更新位置
座头鲸个体首先计算与当前最优鲸鱼的距离,然后再以螺旋方式游走,在进行食物的搜索时候,螺旋游走方式的数学模型为:
2.3寻觅食物阶段
座头鲸通过控制|A|向量游走获取食物,当|A|>1的时候,座头鲸个体向着参考座头鲸的位置靠近,鲸鱼个体朝着随机选取的座头鲸更新位置,这种方式保证了座头鲸个体能够进行全局搜索,获得全局最优解,其数学模型表示如下:
3.2 5G通信系统资源分配
5G针对不同的服务、部署场景和频谱,可以游戏可扩展的numerology。对于具有可扩展numerology的资源块设计,支持PRB定义,其中对于所有numerology,每个PRB的子载波数相同,每个PRB的子载波数一般为12。对于2n*15kHz的子载波间隔,子载波在频域中以嵌套方式映射到15kHz的子载波间隔的子集/超集上。当多个numerology在时域多路复用时,在一个载波中,不同numerology的RB位于相对固定的网格上,对于2n*15kHz的子载波间隔,RB网格被定义为在频域中嵌套的15kHz子载波间隔RB网格的子集/超集。
对于每个PRB的子载波数,在NR中,12和16被视为候选,并在表1中进行比较:
NR和LTE之间的频谱共享:每个PRB 12个子载波更好地支持NR和LTE之间的频谱共享。当NR和LTE的PRB定义相同时,对实现的影响将最小化。对于每个RB设计16个子载波,必须为NR设计独立实现。
LTE设计的重用:每个PRB有12个子载波,可以重用许多LTE设计方面,例如LTE中的TBS表。由于每个PRB有16个子载波,调度器必须重新设计,并且必须为实现和规范付出巨大的努力。数据包大小/资源利用率:对于较小的数据包大小,例如用于URLLC模拟的32字节的URLLC服务,12可以提供比16更高的资源利用率和更少的冗余RE。对于中等和较大的分组大小,例如URLLC和eMBB服务,很难说哪一个更好,因为分组大小是灵活的,并且可以用12个子载波间隔分配比16子载波间隔分配更多的RB,具有相似的资源数量,即相似的利用率。
BW利用率:在系统频带内,两个备选方案支持类似的BW利用率。同意支持高达约100%的带宽利用率。以20MHz BW和15kHz SCS为例,99.9%的带宽利用率和111个RB将在每个PRB有12个子载波的情况下处于活动状态,99.6%的带宽利用率和83个RB将在每个PRB有16个子载波的情况下处于活动状态。
DCI的大小:在给定的BW下,每个RB 16个子载波提供的RB数少于12个,并且资源块分配所需的比特数也将更少。然而,通过适当的设计,DCI的尺寸可以减小,影响可以最小化。
3.MATLAB核心程序
Flag = 0;
Positions = initialization(SearchAgents_no, dim, ub, lb);
Convergence_curve = zeros(1,Max_iter);
iter = 0;
while iter < Max_iter && Flag <= 3
for i = 1:size(Positions,1)
%返回超出搜索空间边界的搜索代理
Flag4ub = Positions(i,:) > ub;
Flag4lb = Positions(i,:) < lb;
Positions(i,:) = (Positions(i,:).*(~(Flag4ub+Flag4lb))) + ub.*Flag4ub + lb.*Flag4lb;
% 计算每个搜索代理的目标函数
fitness = fobj(Positions(i,:));
%更新
if fitness < Leader_score
Leader_score = fitness;
Leader_pos = Positions(i,:);
end
end
a = 2 - iter*((2)/Max_iter);
a2 = -1 + iter*((-1)/Max_iter);
% 更新搜索代理的位置
for i = 1:size(Positions,1)
r1 = rand();
r2 = rand();
A = 2*a*r1-a;
C = 2*r2;
b = 1;
l = (a2-1)*rand + 1;
p = rand();
for j = 1:size(Positions,2)
if p < 0.5
if abs(A) >= 1
rand_leader_index = floor(SearchAgents_no*rand()+1);
X_rand = Positions(rand_leader_index, :);
D_X_rand = abs(C*X_rand(j) - Positions(i,j));
Positions(i,j) = X_rand(j) - A*D_X_rand;
elseif abs(A) < 1
D_Leader = abs(C*Leader_pos(j) - Positions(i,j));
Positions(i,j) = Leader_pos(j) - A*D_Leader;
end
elseif p>=0.5
distance2Leader = abs(Leader_pos(j)-Positions(i,j));
Positions(i,j) = distance2Leader*exp(b.*l).*cos(l.*2*pi) + Leader_pos(j);
end
end
end
iter = iter + 1;
Convergence_curve(iter) = -Leader_score;
[iter -Leader_score]
end
end
function Positions = initialization(SearchAgents_no, dim, ub, lb)
Boundary_no = size(ub,2);
if Boundary_no == 1
Positions = rand(SearchAgents_no,dim).*(ub - lb) + lb;
end
if Boundary_no > 1
for i = 1:dim
ub_i = ub(i);
lb_i = lb(i);
Positions(:,i) = rand(SearchAgents_no,1).*(ub_i - lb_i) + lb_i;
end
end
end