基于免疫算法的认知无线电资源分配优化算法的matlab仿真

简介: 基于免疫算法的认知无线电资源分配优化算法的matlab仿真

1.算法描述

   认知无线电(CR)的概念来自Joseph Mitolo博士1999年的开创性工作。它自适应地调整内部通信机制,通过学习,了解等实时变化特定的无线电操作参数(功率,载波调制和编码等),适应外部无线电环境,并独立空闲频谱它可以被搜索和使用。这有助于用户选择用于无线传输的最佳和最合适的服务,甚至允许基于现有或未来的无线电资源来延迟甚至主动地开始传输。

image.png

免疫算法基本步骤:

1、随机产生初始父代种群A1,根据先验知识抽取疫苗;

2、若当前群体中包含最佳个体,则算法停止运行并输出结果;否则,继续;

3、对当前第k代父本种群Ak进行交叉操作,得到种群Bk;

4、对Bk进行变异操作,得到种群Ck;

5、对Ck进行接种疫苗操作,得到种群Dk;

6、对Dk进行免疫选择操作,得到新一代父本Ak+1,转至第二步。

免疫算法进行子载波分配流程
免疫算法的主要操作如下:

抗体的编码和产生每个抗体由M位十进制整数组成,对应N个子载波,每个整数范围从1到M,表明子载体被分配给M个认知用户中的一个。抗体群是K,对应于K个解决方案。第一代抗体通常是随机产生的。
计算和排序亲和力 根据贪婪算法的基本思想,完成每种抗体的安全传输速率调整。安全传输速率调整完成后,获得每个抗体对应的加权安全吞吐量,然后排序
(3)存储单元的生成在(2)中排序后对应于较高加权吞吐量的抗体被保存为存储单元以避免后续操作中的丢失。

(4)蚂蚁的选择ibodies

浓度概率,亲和概率和选择概率有三个概率。
2.png
3.png

2.仿真效果预览
matlab2022a仿真结果如下:

4.png
5.png
6.png
7.png

3.MATLAB核心程序

    
    pl_cu_pu(1,m)=((loc_cu(m,1)-loc_pu(1,1))^2+(loc_cu(m,2)-loc_pu(1,2))^2)^0.5;
end
pl_cu_pu=10^(0.1*randn*Sigma)./((pl_cu_pu/3).^Eta);  %产生主用户和认知用户的路径损耗
pl_cu_cbs=10^(0.1*randn*Sigma)./((pl_cu_cbs/3).^Eta);  %产生用户和认知基站的路径损耗
for m=1:M
    for i=1:M
        pl_cu_cu(m,i)=((loc_cu(m,1)-loc_cu(i,1))^2+(loc_cu(m,2)-loc_cu(i,2))^2)^0.5;
    end
end
pl_cu_cu=10^(0.1*randn*Sigma)./((pl_cu_cu/3).^Eta);   %产生认知用户和认知用户之间的路径损耗
 
 
%对主用户干扰
to_pu_g=raylrnd(1,[M,N]);   %对主用户的信道干扰增益(第m行是第m个小f中各个子载波的增益)
lamda=zeros(1,N);  %对主用户距离干扰增益
Distance=zeros(1,N);   %第n个子载波和主用户的频带距离
for n=1:N
    Distance(1,n)=((N-(2*n-1)/2)*Delta_f+W/2);
end
F=@(f)((sin(pi*Ts*f)./(pi*Ts*f)).^2);      %积分函数
for n=1:N      %Lamda计算
    lamda(1,n)=Ts*quad(F,(Distance(1,n)-W/2),(Distance(1,n)+W/2));
end
 
for m=1:M
    for n=1:N
        to_pu_g(m,n)=to_pu_g(m,n)*lamda(1,n);   %对主用户的总的干扰增益
    end
end
 
for m=1:M
    to_pu_g(m,:)=to_pu_g(m,:)*pl_cu_pu(1,m);
end
 
 
%同频相互干扰
co_ch_g=zeros(M,M,N);  %同频干扰矩阵,第n页是第n个子载波的同频干扰
 
for n=1:N
    for i=1:M
        for j=i:M              %若要不同的同频干扰,则这里改为1:M
            co_ch_g(i,j,n)=raylrnd(1);
            co_ch_g(j,i,n)=co_ch_g(i,j,n);
        end
    end
end
for n=1:N
    for m=1:M
        co_ch_g(m,m,n)=0;
    end
end
for n=1:N
    co_ch_g(:,:,n)=(co_ch_g(:,:,n).^2).*pl_cu_cu;
end
for n=1:N
    for i=1:M
        co_ch_g(i,i,n)=0;
    end
end
 
%—有关各个子载波的信道增益——
ch_g=raylrnd(1,[M,N]);   %每个子载波的信道增益
for m=1:M
    ch_g(m,:)=(ch_g(m,:).^2)*pl_cu_cbs(1,m);
end
%===—有关运算结果显示=====二=
rate_gen1=zeros(1,genMax);   %每代的最优速率
rate_gen2=zeros(1,genMax);      %每代的最优速率
%rate_gen3=zeros(1,generaMax);   %每代的最优小速率
ratio_gen1=zeros(1,genMax);     %每代的最优速率功率比
ratio_gen2=zeros(1,genMax);     %每代的最优速率功率比
%ratio_gen3=zeros(1,genMax);     %每代的最优速率功率比
Pth=10;
for Ith=[0.001 0.005 0.01]
    for qq=1:10
        %=========程序初始化========
        temp_antibody(:)=Pth/N;       %初始抗体功率是平均分配
        temp_memorycell(:)=Pth/N;      %初始记忆细胞功率也是平均分配
        antibody(:)=temp_antibody(:);      %抗体变量装入初始抗体
        memorycell(:)=temp_memorycell(:);      %记忆细胞变量装入记忆细胞
        
        
        %=========主函数=========
        for gen=1:genMax
            gen
            
            %记忆细胞添加            
            antibody(:,:,(K-L+1):K)=memorycell;
            %antibody_falg((K-L+1):K)=1;                       %记录成型抗体
            
            
            
            %——抗体合格检测
            exceed_Ith=0;   %超过干扰门限的量
            exceed_Pth=0;      %超过功率门限的量
            decr_var_I=zeros(M,N);      %有关干扰的归一化的减少量
            decr_val_P=zeros(M,N);     %有关功率的归一化的减少量
            ratio_P=zeros(1,3);      %计算当前功率与公平性的比值
            standerd_site=0;      %作为基准的用户
            
            for k=1:K
                decr_val_P=antibody(:,:,k)/sum(sum(antibody(:,:,k)));   %根据现有功率计算归一化功率减少量
                if(sum(sum(antibody(:,:,k)))-Pth>eps)
                    exceed_Pth=sum(sum(antibody(:,:,k)))-Pth;   %计算超出多少
                    antibody(:,:,k)=antibody(:,:,k)-exceed_Pth*decr_val_P(:,:);
                end
                
                itfere_pu(:,:,k)=to_pu_g.*antibody(:,:,k);
                decr_val_I=itfere_pu(:,:,k)/sum(sum(itfere_pu(:,:,k)));      %根据现有干扰计算归一化功率减少量
                if(sum(sum(itfere_pu(:,:,k)))-Ith>eps)
                    exceed_Ith=sum(sum(itfere_pu(:,:,k)))-Ith;         %计算超出多少
                    
                    antibody(:,:,k)=antibody(:,:,k)-(exceed_Ith*decr_val_I)./(to_pu_g);
                end
                itfere_pu(:,:,k)=to_pu_g.*antibody(:,:,k);      %更新对主用户的干扰
            end
            
            
            
            
            
            
            %---速率计算
            h=zeros(M,N,K);   %各个子载波的信噪比
            i_ss=zeros(M,N,K);   %各个子载波受到的同频干扰
            for k=1:K
                for n=1:N
                    for m=1:M
                        for i=1:M
                            i_ss(m,n,k)=i_ss(m,n,k)+co_ch_g(i,m,n)*antibody(i,n,k);   %计算各个子载波所受到的同频干扰
                        end
                    end
                end
            end
            
            temp=sum(i_ss);
            
            for k=1:K
                for n=1:N
                    for m=1:M
                        i_ss(m,n,k)=temp(1,n,k)-i_ss(m,n,k);      %计算每个子载波所受到的同频干扰
                    end
                end
            end
            for k=1:K
                h(:,:,k)=ch_g./(N0*Delta_f+i_ss(:,:,k));           %计算信噪比
            end
            
            %rate=Delta_f*log2(1+antibody.*h/Tau);          %计算每个抗体每个小区的速率
            rate=log2(1+antibody.*h/Tau);         %计算每个抗体每个小区的速率
            
            
            %总的公平性调整
            for o=1:O
                %rate_m=zeros(1,3,K);      %各个小区的总速率
                %ratio_r=zeros(1,3);             %计算当前速率与公平性的比值
                standard_site=0;      %作为基准的用户
                decr_val_r=zeros(M,N);        %有关功率的归一化的减少量
                exceed_r=0;            %超过干扰门限的量
                rate_m=sum(rate,2);
                for k=1:K
                    ratio_r=rate_m(:,:,k)./Rate_m';
                    [~,standard_site]=min(ratio_r);     %选取基准功率
                    switch(standard_site)      %进行功率公平性调整
                        case 1   %第一个为基准
                            for m=[2 3]
                                exceed_r=rate_m(1,:,k)/2-rate_m(m,:,k);
                                decr_val_r(m,:)=(rate(m,:,k)/sum(rate(m,:,k)))*exceed_r;
                                if(exceed_r<0)
                                    for n=1:N
                                        antibody(m,n,k)=(2^decr_val_r(m,n)*(Tau+antibody(m,n,k)*h(m,n,k))-Tau)/h(m,n,k);
                                    end
                                end
                            end
                            
                        case 2            %第二个为基准
                            exceed_r=rate_m(2,:,k)*2-rate_m(1,:,k);
                            decr_val_r(1,:)=(rate(1,:,k)/sum(rate(1,:,k)))*exceed_r;
                            if(exceed_r<0)
                                for n=1:N
                                    antibody(1,n,k)=(2^decr_val_r(1,n)*(Tau+antibody(1,n,k)*h(1,n,k))-Tau)/h(1,n,k);
                                end
                            end
                            exceed_r=rate_m(2,:,k)-rate_m(3,:,k);
                            decr_cal_r(3,:)=(rate(3,:,k)/sum(rate(3,:,k)))*exceed_r;
                            if(exceed_r<0)
                                for n=1:N
                                    antibody(3,n,k)=(2^decr_cal_r(3,n)*(Tau+antibody(3,n,k)*h(3,n,k))-Tau)/h(3,n,k);
                                end
                            end
                            
                             
                        case 3              %第三个为基准
                            exceed_r=rate_m(3,:,k)*2-rate_m(1,:,k);
                            decr_val_r(1,:)=(rate(1,:,k)/sum(rate(1,:,k)))*exceed_r;
                            if(exceed_r<0)
                                for n=1:N
                                    antibody(1,n,k)=(2^decr_val_r(1,n)*(Tau+antibody(1,n,k)*h(1,n,k))-Tau)/h(1,n,k);
                                end
                            end
                            exceed_r=rate_m(3,:,k)-rate_m(2,:,k);
                            decr_val_r(2,:)=(rate(2,:,k)/sum(rate(2,:,k)))*exceed_r;
                            if(exceed_r<0)
                                for n=1:N
                                    antibody(2,n,k)=(2^decr_val_r(2,n)*(Tau+antibody(2,n,k)*h(2,n,k))-Tau)/h(2,n,k);
                                end
                            end
                    end
                end
                temp=antibody<=eps;
                antibody(temp)=eps;
                h=zeros(M,N,K);      %各个子载波的信噪比
                i_ss=zeros(M,N,K);          %各个子载波受到的同频干扰
                for k=1:K
                    for n=1:N
                        for m=1:M
                            for i=1:M
                                i_ss(m,n,k)=i_ss(m,n,k)+co_ch_g(i,m,n)*antibody(i,n,k);      %计算各个子载波所受到的同频干扰
                            end
                        end
                    end
                end
                temp=sum(i_ss);
               
                for k=1:K
                    for n=1:N
                        for m=1:M
                            i_ss(m,n,k)=temp(1,n,k)-i_ss(m,n,k);      %计算每个子载波所受到的同频干扰
                        end
                    end
                end
                
                for k=1:K
                    h(:,:,k)=ch_g./(N0*Delta_f+i_ss(:,:,k));             %计算信噪比
                end
                %rate=Delta_f*log2(1+antibody.*h/Tau);   %计算每个抗体每个小区的速率
                rate=log2(1+antibody.*h/Tau);   %计算每个抗体每个小区的速率
            end
            
            %速率功率比计算
            %if gen==genMax
            %rate=floor(rate);
            %end
            rate_antibody=sum(sum(rate));               %计算每个抗体速率
            ratio=rate_antibody./sum(sum(antibody));           %计算每个抗体的速率功率比
            Objective=ratio*Alpha+rate_antibody*(1-Alpha);               %计算优化目标的值
            
            
            
            %亲和力排序
            for i=1:K-1
                for j=i+1:K
                    if(Objective(i)<Objective(j))
                        temp=rate_antibody(i);         %每代速度交换
                        rate_antibody(i)=rate_antibody(j);
                        rate_antibody(j)=temp;
                        
                        temp=rate(:,:,i);               %速率交换
                        rate(:,:,i)=rate(:,:,j);
                        rate(:,:,j)=temp;
                        
                        
                        temp=antibody(:,:,i);            %功率交换
                        antibody(:,:,i)=antibody(:,:,j);
                        antibody(:,:,j)=temp;
                        
                        
                        temp=itfere_pu(:,:,i);            %对主用户干扰交换
                        itfere_pu(:,:,i)=itfere_pu(:,:,j);
                        itfere_pu(:,:,j)=temp;
                        
                        
                        temp=Objective(i);           %每代速度交换
                        Objective(i)=Objective(j);
                        Objective(j)=temp;
                        
                        
                        temp=ratio(i);                 %每代速度交换
                        ratio(i)=ratio(j);
                        ratio(j)=temp;
                        
%                         temp=antibody_flag(i);
%                         antibody_flag(i)=antibody_flag(j);
%                         antibody_flag(j)=temp;
                        
                    end
                end
            end
            
            
            
            %提取记忆细胞
            memorycell=antibody(:,:,1:L);                %前L个个体作为记忆细胞提取
            
            
            %算法结果等待
            rate_gen1(gen)=rate_antibody(1);   %记录每代最优的最小速度
            ratio_gen1(gen)=Objective(1);      %每代最优速率功率比
            
            %抗体选择
            %pd=zeros(1,K);             %浓度概率
            pf=zeros(1,K);                 %适应度概率
            %p=zeros(1,K);                %选择概率
            resemble=zeros(1,K);         %抗体的相似度
            res=zeros(M,N,K);              %各个子载波的距离
            index=zeros(1,K);               %轮盘赌抗体索引
            
            for k=1:K
                for i=1:K
                    res(:,:,i)=abs(antibody(:,:,k)-antibody(:,:,i));               %计算各个子载波的距离
                end
                temp=(res<=Gama*Pth);             %距离过近的子载波个数
                temp=sum(sum(temp));                %计算与每个抗体的距离
                for i=1:K
                    resemble(k)=resemble(k)+temp(i);
                end
            end
            pd=1-resemble/(M*N*K);
            
            for k=1:K
                pf(k)=(Objective(k)-Objective(K)+eps)/(Objective(1)-Objective(K)+eps);
            end
            p=Rho*pf+(1-Rho)*pd;
            
            for i=1:K-1                   %抗体按照选择概率排序
                for j=i+1:K
                    if(p(i)<p(j))
                        temp=p(i);
                        p(i)=p(j);
                        p(j)=temp;
                        temp=antibody(i);
                        antibody(i)=antibody(j);
                        antibody(j)=temp;
                    end
                end
            end
            
            
            for k=1:K                        %选出K个抗体
                temp=rand*sum(p);
                for i=1:K
                    temp=temp-p(i);
                    if(temp<=0)
                        index(k)=i;             %赌出第k个索引值
                        break;
                    end
                end
            end
            temp=antibody;
            antibody=temp(:,:,index);
            
            
            %两种交叉
            [antibody]=dou_atb_excha(N,K,Pc,antibody);               %调用交叉互换函数i现i叉互换
            %两种突变
            [antibody]=dou_atb_mutat(K,N,M,Pm,antibody);            %调用突变函数实现抗体突变
            
        end
        obj(qq,:)=ratio_gen1;
        obj11(qq,:)=2*rate_gen1;
    end
    hold on;
    oobj=mean(obj);
    oobj11=mean(obj11);
    plot(oobj11);
    xlabel('代数');ylabel('亲和力');title('收敛性能');
    legend('Ith=0.001','Ith=0.005','Ith=0.01','Location','NorthEast');
    
 
end
 
相关文章
|
1天前
|
机器学习/深度学习 算法
基于心电信号时空特征的QRS波检测算法matlab仿真
本课题旨在通过提取ECG信号的时空特征并应用QRS波检测算法识别心电信号中的峰值。使用MATLAB 2022a版本实现系统仿真,涵盖信号预处理、特征提取、特征选择、阈值设定及QRS波检测等关键步骤,以提高心脏疾病诊断准确性。预处理阶段采用滤波技术去除噪声,检测算法则结合了一阶导数和二阶导数计算确定QRS波峰值。
|
1天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
本项目展示了一种结合粒子群优化(PSO)与分组卷积神经网络(GroupCNN)的时间序列预测算法。该算法通过PSO寻找最优网络结构和超参数,提高预测准确性与效率。软件基于MATLAB 2022a,提供完整代码及详细中文注释,并附带操作步骤视频。分组卷积有效降低了计算成本,而PSO则智能调整网络参数。此方法特别适用于金融市场预测和天气预报等场景。
|
5天前
|
算法
基于极大似然算法的系统参数辨识matlab仿真
本程序基于极大似然算法实现系统参数辨识,对参数a1、b1、a2、b2进行估计,并计算估计误差及收敛曲线,对比不同信噪比下的误差表现。在MATLAB2022a版本中运行,展示了参数估计值及其误差曲线。极大似然估计方法通过最大化观测数据的似然函数来估计未知参数,适用于多种系统模型。
|
7天前
|
机器学习/深度学习 算法
基于小波神经网络的数据分类算法matlab仿真
该程序基于小波神经网络实现数据分类,输入为5个特征值,输出为“是”或“否”。使用MATLAB 2022a版本,50组数据训练,30组数据验证。通过小波函数捕捉数据局部特征,提高分类性能。训练误差和识别结果通过图表展示。
|
7天前
|
机器学习/深度学习 算法 数据挖掘
基于GWO灰狼优化的CNN-LSTM的时间序列回归预测matlab仿真
本项目展示了一种结合灰狼优化(GWO)与深度学习模型(CNN和LSTM)的时间序列预测方法。GWO算法高效优化模型超参数,提升预测精度。CNN提取局部特征,LSTM处理长序列依赖,共同实现准确的未来数值预测。项目包括MATLAB 2022a环境下运行的完整代码及视频教程,代码内含详细中文注释,便于理解和操作。
|
1月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
106 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
|
1月前
|
存储 算法 搜索推荐
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
79 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
|
1月前
|
数据采集 存储 移动开发
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
62 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
|
4月前
|
数据安全/隐私保护
耐震时程曲线,matlab代码,自定义反应谱与地震波,优化源代码,地震波耐震时程曲线
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
基于混合整数规划的微网储能电池容量规划(matlab代码)
基于混合整数规划的微网储能电池容量规划(matlab代码)