【老生谈算法】matlab实现OFDM自适应资源分配算法源码——OFDM

基于遗传算法的OFDM自适应资源分配算法MATLAB源码

OFDM自适应资源分配问题(载波、功率等),是一个既含有离散决策变量,又含有连续决策变量的非线性优化模型,且含有较为复杂的非线性约束,因此适合采用智能优化算法进行求解。

function [BESTX1,BESTX2,BESTY,ALLX1,ALLX2,ALLY]=GA2(K,N,Pm,H,BBB,P,N0)
%% 本源码实现遗传算法,用于RA准则下的多用户OFDM自适应资源分配
%% 输入参数列表
%  K         迭代次数
%  N         种群规模,要求是偶数
%  Pm        变异概率
%  H         信道增益矩阵,K*N的矩阵,表示用户k在子信道n上的信道增益,无单位,取值范围0~1
%  BBB       总带宽(Hz)
%  P         总功率(W)
%  N0        加性高斯白噪声功率谱密度(W/Hz)
%% 输出参数列表
%  BESTX1    K×1细胞结构,每一个元素是M×1向量,记录每一代的最优个体的第一分量
%  BESTX2    K×1细胞结构,每一个元素是M×1向量,记录每一代的最优个体的第二分量
%  BESTY     K×1矩阵,记录每一代的最优个体的评价函数值
%  ALLX1     K×1细胞结构,每一个元素是M×N矩阵,记录全部个体的第一分量
%  ALLX2     K×1细胞结构,每一个元素是M×N矩阵,记录全部个体的第二分量
%  ALLY      K×N矩阵,记录全部个体的评价函数值
 
%% 第一步
[KK,NN]=size(H);
M=NN;%决策变量个数,子载波个数
farm1=zeros(M,N);%每一列是一个样本
for i=1:N
    farm1(:,i)=unidrnd(KK,M,1);
end
farm2=zeros(M,N);%每一列是一个样本
for i=1:N
    farm2(:,i)=RandSeq(M);
end
%输出变量初始化
ALLX1=cell(K,1);
ALLX2=cell(K,1);
ALLY=zeros(K,N);
BESTX1=cell(K,1);
BESTX2=cell(K,1);
BESTY=zeros(K,1);
k=1;%迭代计数器初始化
 
%% 第二步:迭代过程
while k<=K
%% 以下是交叉过程
    newfarm1=zeros(M,2*N);
    Ser=randperm(N);%两两随机配对的配对表
    A=farm1(:,Ser(1));
    B=farm1(:,Ser(2));
    P0=unidrnd(M-1);
    a=[A(1:P0,:);B((P0+1):end,:)];%产生子代a
    b=[B(1:P0,:);A((P0+1):end,:)];%产生子代b
    newfarm1(:,2*N-1)=a;%加入子代种群
    newfarm1(:,2*N)=b;    
    for i=1:(N-1)
        A=farm1(:,Ser(i));
        B=farm1(:,Ser(i+1));
        P0=unidrnd(M-1);
        a=[A(1:P0,:);B((P0+1):end,:)];
        b=[B(1:P0,:);A((P0+1):end,:)];
        newfarm1(:,2*i-1)=a;
        newfarm1(:,2*i)=b;
    end    
    FARM1=[farm1,newfarm1];
    
    newfarm2=zeros(M,2*N);
    Ser=randperm(N);%两两随机配对的配对表
    A=farm2(:,Ser(1));
    B=farm2(:,Ser(2));
    P0=unidrnd(M-1);
    a=[A(1:P0,:);B((P0+1):end,:)];%产生子代a
    b=[B(1:P0,:);A((P0+1):end,:)];%产生子代b
    newfarm2(:,2*N-1)=a;%加入子代种群
    newfarm2(:,2*N)=b;    
    for i=1:(N-1)
        A=farm2(:,Ser(i));
        B=farm2(:,Ser(i+1));
        P0=unidrnd(M-1);
        a=[A(1:P0,:);B((P0+1):end,:)];
        b=[B(1:P0,:);A((P0+1):end,:)];
        newfarm2(:,2*i-1)=a;
        newfarm2(:,2*i)=b;
    end    
    FARM2=[farm2,newfarm2];
    
    %% 选择复制
    SER=randperm(3*N);
    FITNESS=zeros(1,3*N);
    fitness=zeros(1,N);
    for i=1:(3*N)
        X1=FARM1(:,i);
        X2=FARM2(:,i);
        FITNESS(i)=-ObjFun(X1',X2',H,BBB,P,N0);
    end
    
    for i=1:N
        f1=FITNESS(SER(3*i-2));
        f2=FITNESS(SER(3*i-1));
        f3=FITNESS(SER(3*i));
        if f1<=f2&&f1<=f3
            farm1(:,i)=FARM1(:,SER(3*i-2));
            farm2(:,i)=FARM2(:,SER(3*i-2));
            fitness(:,i)=FITNESS(:,SER(3*i-2));
        elseif f2<=f1&&f2<=f3
            farm1(:,i)=FARM1(:,SER(3*i-1));
            farm2(:,i)=FARM2(:,SER(3*i-1));
            fitness(:,i)=FITNESS(:,SER(3*i-1));
        else
            farm1(:,i)=FARM1(:,SER(3*i));
            farm2(:,i)=FARM2(:,SER(3*i));
            fitness(:,i)=FITNESS(:,SER(3*i));
        end
    end
    
%% 记录最佳个体和收敛曲线
    ALLX1{
    
    k}=farm1;
    ALLX2{
    
    k}=farm2;
    ALLY(k,:)=fitness;
    minY=min(fitness);
    pos=find(fitness==minY);
    BESTX1{
    
    k}=farm1(:,pos(1));
    BESTX2{
    
    k}=farm2(:,pos(1));
    BESTY(k)=minY;
    
%% 变异
    for i=1:N
        if Pm>rand&&pos(1)~=i
            farm1(:,i)=unidrnd(KK,M,1);
            farm2(:,i)=RandSeq(M);
        end
    end
    %disp(k);
    k=k+1;
end

猜你喜欢

转载自blog.csdn.net/m0_53407570/article/details/125434803