aiwa 发表于 2009-7-26 16:24:11

【原创】基于遗传算法的CDMA多用户检测Matlab源码

基于遗传算法的CDMA多用户检测Matlab源码
function =GSAMD(KK,N,Pm,MM,t0,Alpha,Y,A,R)
%% 此函数实现遗传模拟退火算法,用于CDMA多用户检测问题的优化求解
% GreenSim团队原创作品,转载请注明
% Email:greensim@163.com
% GreenSim团队主页:http://blog.sina.com.cn/greensim
% 欢迎访问GreenSim——算法仿真团队→http://blog.sina.com.cn/greensim
%% 输入参数列表
% KK       迭代次数
% N      种群规模,要求是偶数
% Pm       变异概率
% MM       状态转移次数
% t0       初始温度
% Alpha    降温系数
% Y      匹配滤波器组的输出,在函数外部由仿真算法给出
% A      K×K对角阵,对角线元素是第k个用户信号的幅度
% R      扩频码互相关矩阵,K×K矩阵
%% 输出参数列表
% BESTX    K×1细胞结构,每一个元素是M×1向量,记录每一代的最优个体
% BESTY    K×1矩阵,记录每一代的最优个体的评价函数值
% ALLX   K×1细胞结构,每一个元素是M×N矩阵,记录全部个体
% ALLY   K×N矩阵,记录全部个体的评价函数值
%% 第一步:
M=size(A,1);%决策变量的个数
%种群初始化,每一列是一个样本
farm=zeros(M,N);
for i=1:N
    x=sign(rand(M,1)-0.5);
    farm(:,i)=x;
end
%输出变量初始化
ALLX=cell(KK,1);%细胞结构,每一个元素是M×N矩阵,记录每一代的个体
ALLY=zeros(KK,N);%K×N矩阵,记录每一代评价函数值
BESTX=cell(KK,1);%细胞结构,每一个元素是M×1向量,记录每一代的最优个体
BESTY=zeros(KK,1);%K×1矩阵,记录每一代的最优个体的评价函数值
k=1;%迭代计数器初始化
t=t0;%温度初始化
%% 第二步:迭代过程
while k<=KK
%% 以下是交叉过程
    newfarm=zeros(M,2*N);
    Ser=randperm(N);%两两随机配对的配对表
    AA=farm(:,Ser(1));
    BB=farm(:,Ser(2));
    P0=unidrnd(M-1);
    aa=;%产生子代a
    bb=;%产生子代b
    newfarm(:,2*N)=bb;
   
    for i=1:(N-1)
      AA=farm(:,Ser(i));
      BB=farm(:,Ser(i+1));
      P0=unidrnd(M-1);
      aa=;
      bb=;
      newfarm(:,2*i-1)=aa;
      newfarm(:,2*i)=bb;
    end
   
    FARM=;
% GreenSim团队原创作品,转载请注明
% Email:greensim@163.com
% GreenSim团队主页:http://blog.sina.com.cn/greensim
%% 选择复制
    SER=randperm(3*N);
    FITNESS=zeros(1,3*N);
    fitness=zeros(1,N);
    for i=1:(3*N)
      Beta=FARM(:,i);
      FITNESS(i)=OBJFUN(Beta,Y,A,R);
    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
            fitness(:,i)=FITNESS(:,SER(3*i-2));
      elseif f2>=f1&&f2>=f3
            farm(:,i)=FARM(:,SER(3*i-1));
            fitness(:,i)=FITNESS(:,SER(3*i-1));
      else
            farm(:,i)=FARM(:,SER(3*i));
            fitness(:,i)=FITNESS(:,SER(3*i));
      end
    end
   
    %% 记录最佳个体和收敛曲线
    XX=farm;
    YY=fitness;
    ALLX{k}=XX;
    ALLY(k,:)=YY;
    maxY=max(YY);
    pos=find(YY==maxY);
    BESTX{k}=XX(:,pos(1));
    BESTY(k)=maxY;
    % GreenSim团队原创作品,转载请注明
    % Email:greensim@163.com
    % GreenSim团队主页:http://blog.sina.com.cn/greensim
    %% 变异
    for i=1:N
      if Pm>rand&&pos(1)~=i
            AA=farm(:,i);
            kk=1;
            while kk<=MM
                BB=AA.*sign(rand(M,1)-0.5);
                FB=OBJFUN(BB,Y,A,R);
                if FB>=FA
                  AA=BB;
                elseif rand<exp((FB-FA)/(FA*t));
                  AA=BB;
                else
                  
                end
                kk=kk+1;
            end
            farm(:,i)=AA;
      end
    end
    disp(k);
    k=k+1;
    t=t*Alpha;
end
%% 绘图
BESTY2=BESTY;
BESTX2=BESTX;
for k=1:KK
    TempY=BESTY(1:k);
    maxTempY=max(TempY);
    BESTY2(k)=maxTempY;
    BESTX2{k}=BESTX{posY(1)};
end
BESTY=BESTY2;
BESTX=BESTX2;
plot(BESTY,'-ko','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',2)
ylabel('目标函数')
xlabel('迭代次数')
grid on
页: [1]
查看完整版本: 【原创】基于遗传算法的CDMA多用户检测Matlab源码