?? 帶qos約束的組播路由問題遺傳模擬退火算法.m
字號:
帶有QoS約束的組播路由問題是一個NP完全問題,遺傳模擬退火算法是遺傳算法和模擬退火算法的一種融合,可以為這類問題提供一個解決方案,下面的程序是GreenSim團隊核心成員在本科期間所做的
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MCRGSA------組播路由問題遺傳模擬退火算法 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%M-----------遺傳算法進化代數
%N-----------種群規模,取偶數
%Pm----------變異概率調節參數
%K-----------同一溫度下狀態跳轉次數
%t0----------初始溫度
%alpha-------降溫系數
%beta--------濃度均衡系數
%ROUTES------備選路徑集
%Num---------到各節點的備選路徑數目
%Cost--------費用鄰接矩陣
%Source------源節點標號
%End---------目的節點標號組成的向量
%MBR---------各代最優路徑編碼
%MBF---------各代最優路徑
function [MBR,MBF]=MCRGSA(M,N,Pm,K,t0,alpha,beta,ROUTES,Num,Cost,Source,End)
%第一步:常用變量聲明,以及種群初始化
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));
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -