Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
|
![]() |
#1 |
普通会员
注册日期: 2008-10-06
年龄: 25
帖子: 53
声望力: 18 ![]() |
![]()
充分考虑时延、时延抖动、带宽、丢包率四种因素,更加符合实际情况,此源码经GreenSim团队仿真测试验证,优化效果非常好(见附图收敛曲线和优化结果),本源码由GreenSim团队原创,转载请注明,有意购买源码或代写相关程序,请与GreenSim团队联系。
function [MBR,MBF]=MCRGSA(M,N,Pm,K,t0,alpha,beta,ROUTES,Num,Cost,Source,End) %% 含多种QoS约束的组播路由问题遗传模拟退火算法通用MATLAB源码 % GreenSim团队原创作品,转载请注明 % 欢迎访问GreenSim——算法仿真团队→http://blog.sina.com.cn/greensim %% 输入参数列表 % M-----------遗传算法进化代数 % N-----------种群规模,取偶数 % Pm----------变异概率调节参数 % K-----------同一温度下状态跳转次数 % t0----------初始温度 % alpha-------降温系数 % beta--------浓度均衡系数 % ROUTES------备选路径集 % Num---------到各节点的备选路径数目 % Cost--------费用邻接矩阵 % Source------源节点标号 % End---------目的节点标号组成的向量 %% 输出参数列表 % MBR---------各代最优路径编码 % MBF---------各代最优路径 %% ------------------------种群初始化------------------------------ Num_end=length(End);%组播目的节点个数 farm=zeros(N,Num_end);%种群 for i=1:Num_end farm(:,i)=unidrnd(Num(i),N,1);%随机生成初始种群 end m=1; t=t0; MBR=zeros(M,Num_end); MBF=zeros(M,1); while m<=M%设置停止条件 %第二步:按照变异概率调节参数进行变异以及退火选择 P=Num./sum(Num); P=Pm.*P; for i=1:N%对每一个个体都执行 Code=farm(i,:);%临时取出 k=1; while k<=K%每一个温度下改变K次 for j=1:Num_end if rand<P(j) Bit=randperm(Num(j)); pos=find(Bit~=Code(j)); Code(j)=Bit(pos(1)); end end fit1=ShiYinZhi(ROUTES,Cost,farm(i,:));%计算适应值 fit2=ShiYinZhi(ROUTES,Cost,Code); if fit2<fit1 farm(i,:)=Code; elseif rand<exp((fit1-fit2)/(fit1*t)); farm(i,:)=Code; else Code=farm(i,:); end k=k+1; end end %第三步:交叉算法 Farm=zeros(size(farm)); for i=1:2:(N-1); a=farm(i,:); b=farm(i+1,:); pos=unidrnd(Num_end-1); A=[a(1,1:pos),b(1,(pos+1):end)]; B=[b(1,1:pos),a(1,(pos+1):end)]; Farm(i,:)=A; Farm(i+1,:)=B; end FARM=[farm;Farm]; %第四步:选择复制操作 fitness=zeros(1,2*N); for i=1:(2*N) fitness(i)=ShiYinZhi(ROUTES,Cost,FARM(i,:)); end maxfitness=max(fitness); minfitness=min(fitness); pos=find(fitness==maxfitness); MBR(m,:)=FARM(pos(1),:); MBF(m)=minfitness; for i=1:(2*N) fitness(i)=((maxfitness-fitness(i))/(maxfitness-minfitness+0.00005))^beta; end fitness=fitness./(sum(fitness)+0.000000005); FITNESS=zeros(size(fitness)); Sgn=FITNESS; for i=1:(2*N) FITNESS(i)=sum(fitness(1:i)); end while sum(Sgn)<N Pos=find(FITNESS>=rand); if length(Pos)>0 Sgn(Pos(1))=1; end end POS=find(Sgn==1); for i=1:N farm(i,:)=FARM(POS(i),:); end farm(unidrnd(N),:)=MBR(m,:); %更新参数 m=m+1 t=t*alpha; end plot(MBF) title('遗传模拟退火算法收敛图') xlabel('进化代数') ylabel('费用') %译码计算适应值的函数 %ROUTES--------备选路径集 %Cost----------费用邻接矩阵 %Code----------组播树的编码 %fit-----------组播树的总代价作为适应值 function fit=ShiYinZhi(ROUTES,Cost,Code) CC=zeros(size(Cost)); for i=1:length(Code) R=ROUTES{i}{Code(i)}; J=length(R)-1; for j=1:J a=R(j); b=R(j+1); CC(a,b)=Cost(a,b); end end fit=sum(sum(CC));
__________________
算法设计、代写程序,欢迎访问GreenSim团队主页→ http://blog.sina.com.cn/greensim |
![]() |
![]() |