选播路由问题的粒子群优化算法MATLAB源码

%% QoS选播路由的粒子群算法仿真主函数
%% 第一步:产生网络拓扑结构
BorderLength=10;    %正方形区域的边长,单位:km
NodeAmount=30;      %网络节点的个数
Alpha=10;           %网络特征参数,Alpha越大,短边相对长边的比例越大
Beta=5;            %网络特征参数,Beta越大,边的密度越大
PlotIf=1;           %是否画网络拓扑图,如果为1则画图,否则不画
FlagIf=0;           %是否标注参数,如果为1则将标注边的参数,否则不标注
[Sxy,AM,Cost,Delay,DelayJitter,PacketLoss]=NetCreate(BorderLength,NodeAmount,Alpha,Beta,PlotIf,FlagIf);
%% 第二步:使用粒子群算法搜索最优路径,存储数据,输出最优结果和收敛曲线
%  GreenSim团队原创作品,转载请注明
%  GreenSim团队长期从事算法设计、代写程序等业务
%  欢迎访问GreenSim——算法仿真团队→[url=http://blog.sina.com.cn/greensim]http://blog.sina.com.cn/greensim[/url]
%%%%%%%%%%%%%%%%%  以  下  是  参  数  设  置  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
S=[2,4];            %源节点的集合,用向量存储
T=[25,27,29];       %目的节点的几何,用向量存储
Alpha=1;            %适应值计算式中费用的系数
Beta=5e5;           %适应值计算式中延时的系数
Gamma=3e6;          %适应值计算式中延时抖动的系数
Delta=1000;         %适应值计算式中丢包率的系数
QoSD=100e-6;        %延时的QoS约束
QoSDJ=100e-6;       %延时抖动的QoS约束
QoSPL=0.02;         %丢包率的QoS约束
r1=0.1;             %单个粒子的历史最优个体对当前粒子的影响系数,0<r1<=1
r2=0.3;             %粒子群的全局最优个体对当前粒子的影响系数,0<r2<=1
r3=0.2;             %粒子随机游动的影响系数,0<=r3<=1,r3可以为0,这时将关闭随机游动功能
P=10;               %粒子的个数
Q=20;               %迭代次数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
m=length(S);
n=length(T);
AllRoutes=cell(m,n);%各粒子经过的全部路径
AllFitness=cell(m,n);
HistoryBestRoutes=cell(m,n);%各粒子的历史最优路径
HistoryBestFitness=cell(m,n);
AllBestRoutes=cell(m,n);%全局最优路径
AllBestFitness=cell(m,n);
for i=1:m
    for j=1:n
        s=S(i);
        t=T(j);
        [ROUTEst,FitFlag,HR,HFF,AR,AFF]=PSOUC(s,t,r1,r2,r3,P,Q,AM,Cost,Delay,DelayJitter,PacketLoss,QoSD,QoSDJ,QoSPL,Alpha,Beta,Gamma,Delta);
        AllRoutes{i,j}=ROUTEst;
        AllFitness{i,j}=FitFlag;
        HistoryBestRoutes{i,j}=HR;
        HistoryBestFitness{i,j}=HFF;
        AllBestRoutes{i,j}=AR;
        AllBestFitness{i,j}=AFF;
    end
end
%下面整理最优结果
SYZ=Inf;
FinalRoute=[];%最终的最优路由
FinalFitness=[];%最终的最优路由对应的参数
LearnCurve1=zeros(1,Q);%收敛曲线
LearnCurve2=zeros(1,Q);%收敛曲线
for q=1:Q
    TT=[];
    for i=1:m
        for j=1:n
            ABR=HistoryBestRoutes{i,j};
            ABF=HistoryBestFitness{i,j};
            for p=1:P
                ABRq=ABR{p,q};
                ABFq=ABF{p,q};
                TT=[TT,ABFq(1,1)];
                if ABFq(1,1)<SYZ
                    FinalRoute=ABRq;
                    FinalFitness=ABFq;
                    SYZ=ABFq(1,1);
                end
            end
        end
    end
    LearnCurve1(q)=mean(TT);
    LearnCurve2(q)=min(TT);
end
figure(2)
plot(LearnCurve1,'bs-')
xlabel('迭代次数')
ylabel('平均适应值')
figure(3)
plot(LearnCurve2,'bs-')
xlabel('迭代次数')
ylabel('最优粒子适应值') 

function [ROUTEst,FitFlag,HR,HFF,AR,AFF]=PSOUC(s,t,r1,r2,r3,P,Q,AM,Cost,Delay,DelayJitter,PacketLoss,QoSD,QoSDJ,QoSPL,Alpha,Beta,Gamma,Delta)
%% 使用粒子群算法求源节点s到目的节点t的满足QoS约束的最小费用路径,将这些路径及其参数记录下来
%  GreenSim团队原创作品,转载请注明
%  GreenSim团队长期从事算法设计、代写程序等业务
%  欢迎访问GreenSim——算法仿真团队→[url=http://blog.sina.com.cn/greensim]http://blog.sina.com.cn/greensim[/url]
%% 输入参数列表
% s            单个的源节点
% t            单个的目的节点
% r1           单个粒子的历史最优个体对当前粒子的影响系数,0<r1<=1
% r2           粒子群的全局最优个体对当前粒子的影响系数,0<r2<=1
% r3           粒子随机游动的影响系数,0<=r3<=1,r3可以为0,这时将关闭随机游动功能
% P            粒子的个数
% Q            迭代次数
% AM           01形式存储的邻接矩阵
% Cost         边的费用邻接矩阵
% Delay        边的时延邻接矩阵
% DelayJitter  边的延时抖动邻接矩阵
% PacketLoss   边的丢包率邻接矩阵
% QoSD         延时的QoS约束
% QoSDJ        延时抖动的QoS约束
% QoSPL        丢包率的QoS约束
% Alpha        适应值计算式中费用的系数
% Beta         适应值计算式中延时的系数
% Gamma        适应值计算式中延时抖动的系数
% Delta        适应值计算式中丢包率的系数
%% 输出参数列表
% ROUTEst      P×Q的细胞结构,存储所有粒子经历过的从s到t的路径
% FitFlag      P×Q的细胞结构,存储与ROUTEst对应的Fitness和Flag数据
% HR           P×Q的细胞结构,存储所有粒子的历史最优路径
% HFF          P×Q的细胞结构,存储所有粒子的历史最优路径对应的参数
% AR           1×Q的细胞结构,存储全局最优路径
% AR           1×Q的细胞结构,存储全局最优路径对应的参数
%% 粒子群初始化
ROUTEst=cell(P,Q);
FitFlag=cell(P,Q);
HR=cell(P,Q);%各粒子的历史最优路径
HFF=cell(P,Q);%各粒子的历史最优路径对应的参数
AR=cell(1,Q);%全局最优路径
AFF=cell(1,Q);%全局最优路径对应的参数
TRACK=Initialize(AM,s,P);
for p=1:P
    Route=TRACK{p};
    pos=find(Route==t);
    Route=Route(1:pos(1));
    Route=Fresh(Route);
    ROUTEst{p,1}=Route;
    HR{p,1}=Route;
    [Fitness,Flag]=Fit(Route,Cost,Delay,DelayJitter,PacketLoss,QoSD,QoSDJ,QoSPL,Alpha,Beta,Gamma,Delta);
    FitFlag{p,1}=[Fitness;Flag];
    HFF{p,1}=[Fitness;Flag];
end
SYZ=Inf;
for p=1:P
    Route=HR{p,1};
    FF=HFF{p,1};
    if FF(1,1)<SYZ
        AR{1}=Route;
        SYZ=FF(1,1);
        AFF{1}=FF;
    end
end
%%
for q=2:Q
    %按照粒子群迭代公式计算各个粒子的下一个位置
    for p=1:P
        Route=ROUTEst{p,q-1};
        OptRoute1=HR{p,q-1};
        OptRoute2=AR{1,q-1};
        Route=SpecialAdd(Route,OptRoute1,r1,Cost);%向自己的历史最优位置靠近
        Route=SpecialAdd(Route,OptRoute2,r2,Cost);%向全局历史最优位置靠近
        Route=RandMove(Route,r3,AM);%随机游动
        [Fitness,Flag]=Fit(Route,Cost,Delay,DelayJitter,PacketLoss,QoSD,QoSDJ,QoSPL,Alpha,Beta,Gamma,Delta);
        ROUTEst{p,q}=Route;
        FitFlag{p,q}=[Fitness;Flag];
    end
    %更新各粒子的历史最优位置
    for p=1:P
        F1=HFF{p,q-1};
        F2=FitFlag{p,q};
        if F2(1,1)<F1(1,1)
            HR{p,q}=ROUTEst{p,q};
            HFF{p,q}=FitFlag{p,q};
        else
            HR{p,q}=HR{p,q-1};
            HFF{p,q}=HFF{p,q-1};
        end
    end
    %更新全局历史最优位置
    for p=1:P
        Route=HR{p,q};
        FF=HFF{p,q};
        if FF(1,1)<SYZ&&FF(2,1)==1
            AR{q}=Route;
            SYZ=FF(1,1);
            AFF{q}=FF;
        else
            AR{q}=AR{q-1};
            AFF{q}=AFF{q-1};
        end
    end
end