查看单个帖子
旧 2010-03-06, 17:34   #1
greensim
普通会员
 
注册日期: 2008-10-06
年龄: 25
帖子: 53
声望力: 18
greensim 正向着好的方向发展
默认 【原创】基于遗传算法的CDMA多用户检测Matlab源码

多用户检测技术是基于CDMA的第三代移动通信系统中的一项关键技术,也是一个比较复杂的优化问题,目前使用智能算法解决该问题的文献比较多,本文给出基于遗传算法的一种实现方法。本源码由GreenSim团队原创,转载请注明,有意购买源码或代写相关程序,请与GreenSim团队联系。

function [BESTX,BESTY,ALLX,ALLY]=GSAMD(KK,N,Pm,MM,t0,Alpha,Y,A,R)
%% 此函数实现遗传模拟退火算法,用于CDMA多用户检测问题的优化求解
% 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=[AA(1:P0,:);BB((P0+1):end,:)];%产生子代a
bb=[BB(1:P0,:);AA((P0+1):end,:)];%产生子代b
newfarm(:,2*N)=bb;

for i=1:(N-1)
AA=farm(:,Ser(i));
BB=farm(:,Ser(i+1));
P0=unidrnd(M-1);
aa=[AA(1:P0,:);BB((P0+1):end,:)];
bb=[BB(1:P0,:);AA((P0+1):end,:)];
newfarm(:,2*i-1)=aa;
newfarm(:,2*i)=bb;
end

FARM=[farm,newfarm];
% GreenSim团队原创作品,转载请注明
% Email:[email protected]
% 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:[email protected]
% 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
上传的图像
文件类型: jpg 032附图1.JPG (30.1 KB, 1 次查看)
文件类型: jpg 032附图2.JPG (26.6 KB, 1 次查看)
__________________
算法设计、代写程序,欢迎访问GreenSim团队主页→
http://blog.sina.com.cn/greensim
greensim 当前离线   回复时引用此帖