QoS组播路由问题的蚁群算法通用Matlab源码
粒子群算法和蚁群算法优化路径问题MATLAB程序源代码

c1=round(rand*(n-2))+1;
c2=round(rand*(n-2))+1;
end
chb1=min(c1,c2);
chb2=max(c1,c2);
ylabel('km','fontsize',12)
%ylim([min(cityCoor(:,2))-1 max(cityCoor(:,2))+1])
grid on
%% 计算城市间距离
n=size(cityCoor,1); %城市数目
cityDist=zeros(n,n); %城市距离矩阵
%^初始化粒子位置
for i=1:indiNumber
individual(i,:)=randperm(n);
end
%% 计算种群适应度
indiFit=fitness(individual,cityCoor,cityDist);
[value,index]=min(indiFit);
粒子群算法和蚁群算法优化路径问题程序源代码---以旅行商问题(TSP)为例
代码用MATLAB编写,两种算法分开编写,读者可以混合编写!
一、
%% 该文件演示基于TSP-PSO(粒子群)算法
clc;clear
%% 下载数据
data=load('pr76.txt');
cityCoor=[data(:,2) data(:,3)];%城市坐标矩阵
grid on
figure
hold on
plot([cityCoor(tourGbest(1),1),cityCoor(tourGbest(n),1)],[cityCoor(tourGbest(1),2),...
蚁群算法代码

//Basic Ant Colony Algorithm for TSP#include <iostream.h>#include <fstream.h>#include <math.h>#include <time.h>#include <conio.h>#include <stdlib.h>#include <iomanip.h>#define N 31 //city size#define M 31 //ant numberdouble inittao=1;double tao[N][N];double detatao[N][N];double distance[N][N];double yita[N][N];int tabu[M][N];int route[M][N];double solution[M];int BestRoute[N];double BestSolution=10000000000;double alfa,beta,rou,Q;int NcMax;void initparameter(void); // initialize the parameters of basic ACAdouble EvalueSolution(int *a); // evaluate the solution of TSP, and calculate the length of path void InCityXY( double x[], double y[], char *infile ); // input the nodes' coordinates of TSPvoid initparameter(void){alfa=1; beta=5; rou=0.9; Q=100;NcMax=200;}void main(void){int NC=0;initparameter();double x[N];double y[N];InCityXY( x, y, "city31.tsp" );for(int i=0;i<N;i++)for(int j=i+1;j<N;j++){distance[j][i]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); distance[i][j]=distance[j][i];}// calculate the heuristic parametersfor(i=0;i<N;i++)for(int j=0;j<N;j++){tao[i][j]=inittao;if(j!=i)yita[i][j]=100/distance[i][j];}for(int k=0;k<M;k++)for(i=0;i<N;i++)route[k][i]=-1;srand(time(NULL));for(k=0;k<M;k++){route[k][0]=k%N;tabu[k][route[k][0]]=1;}//each ant try to find the optiamal pathdo {int s=1;double partsum;double pper;double drand;//ant choose one whole pathwhile(s<N){for(k=0;k<M;k++){int jrand=rand()%3000;drand=jrand/3001.;partsum=0;pper=0;for(int j=0;j<N;j++){if(tabu[k][j]==0)partsum+=pow(tao[route[k][s-1]][j],alfa)*pow(yita[route[k][s-1]][j],beta); }for(j=0;j<N;j++){if(tabu[k][j]==0)pper+=pow(tao[route[k][s-1]][j],alfa)*pow(yita[route[k][s-1]][j],beta)/partsum; if(pper>drand)break;}tabu[k][j]=1;route[k][s]=j;}s++;}// the pheromone is updatedfor(i=0;i<N;i++)for(int j=0;j<N;j++)detatao[i][j]=0;for(k=0;k<M;k++){solution[k]=EvalueSolution(route[k]);if(solution[k]<BestSolution){BestSolution=solution[k];for(s=0;s<N;s++)BestRoute[s]=route[k][s];}}for(k=0;k<M;k++){for(s=0;s<N-1;s++)detatao[route[k][s]][route[k][s+1]]+=Q/solution[k];detatao[route[k][N-1]][route[k][0]]+=Q/solution[k];}for(i=0;i<N;i++)for(int j=0;j<N;j++){tao[i][j]=rou*tao[i][j]+detatao[i][j];if(tao[i][j]<0.00001)tao[i][j]=0.00001;if(tao[i][j]>20)tao[i][j]=20;}for(k=0;k<M;k++)for(int j=1;j<N;j++){tabu[k][route[k][j]]=0;route[k][j]=-1;}NC++;} while(NC<NcMax);//output the calculating resultsfstream result;result.open("optimal_results.log", ios::app);if(!result){cout<<"can't open the <optimal_results.log> file!\n";exit(0);}result<<"*-------------------------------------------------------------------------*"<<endl; result<<"the initialized parameters of ACA are as follows:"<<endl;result<<"alfa="<<alfa<<", beta="<<beta<<", rou="<<rou<<", Q="<<Q<<endl;result<<"the maximum iteration number of ACA is:"<<NcMax<<endl;result<<"the shortest length of the path is:"<<BestSolution<<endl;result<<"the best route is:"<<endl;for(i=0;i<N;i++)result<<BestRoute[i]<<" ";result<<endl;result<<"*-------------------------------------------------------------------------*"<<endl<<endl; result.close();cout<<"the shortest length of the path is:"<<BestSolution<<endl;}double EvalueSolution(int *a){double dist=0;for(int i=0;i<N-1;i++)dist+=distance[a[i]][a[i+1]];dist+=distance[a[i]][a[0]];return dist;}void InCityXY( double x[], double y[], char *infile ){fstream inxyfile( infile, ios::in | ios::nocreate );if( !inxyfile ){cout<<"can't open the <"<<infile<<"> file!\n";exit(0);}int i=0;while( !inxyfile.eof() ){inxyfile>>x[i]>>y[i];if( ++i >= N ) break;}}31个城市坐标:1304 23123639 13154177 22443712 13993488 15353326 15563238 12294196 10044312 7904386 5703007 19702562 17562788 14912381 16761332 6953715 16783918 21794061 23703780 22123676 25784029 28384263 29313429 19083507 23673394 26433439 32012935 32403140 35502545 23572778 28262370 2975运行后可得到15602的巡游路径改正了n个错误。
蚁群算法代码

蚁群算法代码在⽹上看了⼀些蚁群算法原理,其中最为⼴泛的应⽤还是那个旅⾏家问题(TSP)。
诸如粒⼦群优化算法,蚁群算法都可以求⼀个⽬标函数的最⼩值问题的。
下⾯代码记录下跑的代码。
蚁群算法中最为重要的就是⽬标函数和信息素矩阵的设计。
其他的参数则为信息素重要程度,信息素挥发速度,适应度的重要程度。
import numpy as npfrom scipy import spatialimport pandas as pdimport matplotlib.pyplot as plt'''test Ant Aolony Algorithm'''num_points = 25points_coordinate = np.random.rand(num_points, 2) # generate coordinate of pointsdistance_matrix = spatial.distance.cdist(points_coordinate, points_coordinate, metric='euclidean')# routine 中应该为⼀个列表,其中存放的是遍历过程中的位置编号def cal_total_distance(routine):num_points, = routine.shapereturn sum([distance_matrix[routine[i % num_points], routine[(i + 1) % num_points]] for i in range(num_points)])# %% Do ACAfrom sko.ACA import ACA_TSP'''需要设置的参数包含以下部分:(1): ⽬标函数: ⽤于衡量之前⾛过的的路径的⽬标值(累计路程值), 需要有⼀个参数routine, ⽤于记录遍历的路径位置索引(2): 维度数⽬: 此数字将被⽤于程序进⾏构建遍历路径位置索引(3): 蚁群数⽬: size_pop(4): 最⼤迭代次数: 作为⼀项中值条件(5): 距离(⾪属度/信息素)矩阵: 蚁群算法中⼀般称其为信息素矩阵,需要预先进⾏计算,旨在记录两个路径点之间的距离长度[注意]: 距离矩阵在输⼊之前需要进⾏计算缺点: 速度太慢'''aca = ACA_TSP(func=cal_total_distance, n_dim=num_points,size_pop=500, max_iter=200,distance_matrix=distance_matrix)best_x, best_y = aca.run()# %% Plotfig, ax = plt.subplots(1, 2)best_points_ = np.concatenate([best_x, [best_x[0]]])best_points_coordinate = points_coordinate[best_points_, :]ax[0].plot(best_points_coordinate[:, 0], best_points_coordinate[:, 1], 'o-r')pd.DataFrame(aca.y_best_history).cummin().plot(ax=ax[1])plt.show()。
Matlab蚁群算法

实现蚂蚁移动和信息素挥发机制
蚂蚁移动
根据蚂蚁的移动规则和信息素值,让蚂 蚁在解空间中移动,并记录其路径。
VS
信息素挥发
模拟信息素的挥发过程,降低信息素值, 以反映信息的衰减。
迭代优化和结果
迭代优化
通过多次迭代,让蚂蚁不断寻找更好的解, 并逐渐逼近最优解。
结果输出
输出最终找到的最优解,以及算法的性能指 标,如收敛速度、最优解质量等。
05 Matlab蚁群算法的优缺点分析
优点分析
并行性
鲁棒性
全局搜索能力
易于实现
蚁群算法是一种自然启发的优 化算法,具有高度的并行性。 在Matlab中实现时,可以利用 多核处理器或GPU加速技术进 一步提高并行计算能力,从而
加快算法的收敛速度。
蚁群算法对初始参数设置不 敏感,具有较强的鲁棒性。 这意味着在Matlab实现时, 即使初始参数设置不当,算
法仍能找到较优解。
蚁群算法采用正反馈机制, 能够发现多条优质路径,具 有较强的全局搜索能力。这 有助于在Matlab中解决多峰、 离散、非线性等复杂优化问
题。
蚁群算法原理相对简单,实 现起来较为容易。在Matlab 中,可以利用现有的工具箱 或自行编写代码来实现该算
法。
缺点分析
01
计算量大
蚁群算法在解决大规模优化问题时,计算量较大,可能 导致算法运行时间较长。在Matlab实现中,可以通过优 化代码、采用并行计算等技术来降低计算量。
Matlab蚁群算法目录来自• 蚁群算法简介 • Matlab实现蚁群算法的步骤 • 蚁群算法的参数调整与优化 • Matlab蚁群算法的案例分析 • Matlab蚁群算法的优缺点分析
01 蚁群算法简介
双蚁群算法的matlab实现

双蚁群算法的matlab实现
双蚁群算法是一种基于蚁群优化算法的改进版本,它引入了两
种不同类型的蚂蚁来模拟现实世界中的竞争和合作关系。
在Matlab
中实现双蚁群算法可以分为以下几个步骤:
1. 定义问题,首先需要明确定义需要解决的优化问题,包括目
标函数、约束条件等。
2. 初始化参数,设置算法的参数,如蚂蚁数量、迭代次数、信
息素挥发系数、信息素更新系数等。
3. 初始化蚂蚁群,随机放置两种类型的蚂蚁在问题的解空间中,每只蚂蚁都有一个位置和一个解。
4. 更新信息素,根据蚂蚁搜索的路径更新信息素的浓度。
5. 蚂蚁搜索,根据信息素浓度和启发式规则,蚂蚁在解空间中
搜索最优解。
6. 评估解的质量,计算每个蚂蚁找到的解的质量,并更新最优
解。
7. 更新信息素,根据找到的最优解更新信息素的浓度。
8. 终止条件,根据预设的迭代次数或者其他终止条件判断算法是否结束。
在Matlab中实现双蚁群算法时,可以使用向量化操作和矩阵运算来提高计算效率。
同时,可以利用Matlab的绘图功能对算法的收敛过程和最优解的搜索路径进行可视化展示,以便更直观地理解算法的运行过程。
需要注意的是,双蚁群算法的实现涉及到许多细节和参数的调节,需要经过反复实验和调优才能得到较好的效果。
同时,也可以借助Matlab中丰富的工具箱和函数来加速算法的实现和调试过程。
总之,通过以上步骤和注意事项,可以在Matlab中实现双蚁群算法,并应用于解决各种优化问题。
蚁群算法matlab源代码

function [Shortest_Route,Shortest_Length]=ACATSP(D,NC_max,m,Alpha,Beta,Rho,Q)%%========================================================================= %% ACATSP.m%% Ant Colony Algorithm for Traveling Salesman Problem%% ChengAihua,PLA Information Engineering University,ZhengZhou,China%% Email:aihuacheng@%% All rights reserved%%-------------------------------------------------------------------------%% 主要符号说明%% C n个城市的坐标,n×2的矩阵%% NC_max 最大迭代次数%% m 蚂蚁个数%% Alpha 表征信息素重要程度的参数%% Beta 表征启发式因子重要程度的参数%% Rho 信息素蒸发系数%% Q 信息素增加强度系数%% R_best 各代最佳路线%% L_best 各代最佳路线的长度%% L_ave 各代路线的平均长度%%=========================================================================%%第一步:变量初始化n=size(D,1);for i=1:nD(i,i)=eps;endEta=1./D;%Eta为启发因子,这里设为距离的倒数Tau=ones(n,n);%Tau为信息素矩阵Tabu=zeros(m,n);%存储并记录路径的生成NC=1;%迭代计数器R_best=zeros(NC_max,n);%各代最佳路线L_best=inf.*ones(NC_max,1);%各代最佳路线的长度L_ave=zeros(NC_max,1);%各代路线的平均长度while NC<=NC_max%停止条件之一:达到最大迭代次数%%第二步:将m只蚂蚁放到n个城市上Randpos=[];for i=1:(ceil(m/n))Randpos=[Randpos,randperm(n)];endTabu(:,1)=(Randpos(1,1:m))';%%第三步:m只蚂蚁按概率函数选择下一座城市,完成各自的周游for j=2:nfor i=1:mvisited=Tabu(i,1:(j-1));%已访问的城市J=zeros(1,(n-j+1));%待访问的城市P=J;%待访问城市的选择概率分布Jc=1;for k=1:nif length(find(visited==k))==0J(Jc)=k;Jc=Jc+1;endend%下面计算待选城市的概率分布for k=1:length(J)P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);%(信息素^信息素系数)*(启发因子^启发因子系数)endP=P/(sum(P));%按概率原则选取下一个城市Pcum=cumsum(P);Select=find(Pcum>=rand);to_visit=J(Select(1));Tabu(i,j)=to_visit;endendif NC>=2Tabu(1,:)=R_best(NC-1,:);end%%第四步:记录本次迭代最佳路线L=zeros(m,1);for i=1:mR=Tabu(i,:);for j=1:(n-1)L(i)=L(i)+D(R(j),R(j+1));endL(i)=L(i)+D(R(1),R(n));endL_best(NC)=min(L);pos=find(L==L_best(NC));R_best(NC,:)=Tabu(pos(1),:);L_ave(NC)=mean(L);NC=NC+1%%第五步:更新信息素Delta_Tau=zeros(n,n);for i=1:mfor j=1:(n-1)Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);endDelta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);endTau=(1-Rho).*Tau+Delta_Tau;%%第六步:禁忌表清零Tabu=zeros(m,n);end%%第七步:输出结果Pos=find(L_best==min(L_best));Shortest_Route=R_best(Pos(1),:)Shortest_Length=L_best(Pos(1))。
matlab的蚂蚁算法的实现

matlab的蚂蚁算法的实现
在上述代码中,我们首先设置了一些参数,如蚂蚁数量、迭代次数、信息素和启发式信息 的重要程度等。然后,根据参数初始化了信息素矩阵,并进行了迭代优化过程。
在每次迭代中,我们先初始化蚂蚁的位置,然后根据信息素和启发式信息的重要程度,以 及当前城市和已访问城市的距离,计算每个城市被选择的概率。根据概率选择下一个城市, 直到完成整个路径的选择。然后,根据蚂蚁的路径更新信息素矩阵。重复迭代过程,直到达 到指定的迭代次数。
最后,输出最优路径和最优距离。
matlab的蚂蚁算法的实现
需要注意的是,上述代码只是一个简单的示例,实际应用中可能需要根据具体问题进行适 当的调整和扩展。蚂蚁算法的实现也可能因问题的复杂性和特点而有所不同。
Байду номын сангаас
matlab的蚂蚁算法的实现
以下是一个使用 MATLAB 实现蚂蚁算法的简单示例:
```matlab % 参数设置 numAnts = 10; % 蚂蚁数量 numIterations = 100; % 迭代次数 alpha = 1; % 信息素重要程度 beta = 5; % 启发式信息重要程度 rho = 0.5; % 信息素挥发率 Q = 1; % 信息素增量 numCities = 10; % 城市数量 distances = rand(numCities); % 城市之间的距离矩阵
19基于蚁群算法的QoS组播路由问题MATLAB源代码

基于蚁群算法的QoS组播路由问题MATLAB源代码QoS组播路由是网络路由优化和计算智能领域研究的热点,这里的QoS约束包含常见的时延、时延抖动、带宽、丢包率,优化目标是组播树的费用最小化,该问题已被证明是NP完全问题,常规算法通常难以达到理想效果。
蚁群算法凭借其独特的启发式规则和分布式特性,在QoS组播路由问题上取得成功应用。
%% ---------------------------------------------------------------clcclearclose all%% ---------------------产生网络拓扑结构----------------------------% GreenSim团队——专业级算法设计&代写程序% 欢迎访问GreenSim团队主页→/greensimBorderLength=1000; %正方形区域的边长,单位:kmNodeAmount=25; %网络节点的个数Alpha=100000000; %网络特征参数,Alpha越大,短边相对长边的比例越大Beta=200000000000; %网络特征参数,Beta越大,边的密度越大PlotIf=1; %是否画网络拓扑图,如果为1则画图,否则不画图EdgeCostDUB=[5,5]; %链路费用的下界和上界EdgeBandWideDUB=[30,1000]; %链路带宽的下界和上界VertexCostDUB=[3,3]; %节点费用的下界和上界VertexDelayDUB=1e-4*[5,20]; %节点时延的下界和上界VertexDelayJitterDUB=1e-4*[3,8]; %节点时延抖动的下界和上界VertexPacketLossDUB=1e-4*[0,500]; %节点丢包率的下界和上界figure[Sxy,AM,EdgeCost,EdgeDelay,EdgeBandWide,VertexCost,VertexDelay,VertexDelayJitter,VertexP acketLoss]=...NetCreate(BorderLength,NodeAmount,Alpha,Beta,PlotIf,EdgeCostDUB,EdgeBandWideDUB,Ver texCostDUB,VertexDelayDUB,VertexDelayJitterDUB,V ertexPacketLossDUB);BFEdgeCost=EdgeCost;title('随机生成的网络拓扑');EBW=min(min(EdgeBandWide));[x,y]=find(EdgeBandWide<EBW);Lxy=length(x);for i=1:LxyEdgeCost(x(i),y(i))=inf;EdgeDelay(x(i),y(i))=inf;EdgeBandWide(x(i),y(i))=inf;endS=13; %起始节点的编号E=[1,3,5,7,9,17,19,21,23,25]; %终止节点的编号K=100; %迭代次数(指蚂蚁出动多少波)M=200; %蚂蚁个数(每一波蚂蚁有多少个)Tau=ones(NodeAmount,NodeAmount); %初始信息素矩阵,N×NAlpha=2; %表征信息素重要程度的参数Rho=0.05; %信息素蒸发系数Q=5; %信息素增加强度系数EC=EdgeCost; %链路费用矩阵,N×NED=EdgeDelay; %链路时延矩阵,N×NVC=VertexCost; %节点费用向量,1×NVD=VertexDelay; %节点时延向量,1×NVDJ=VertexDelayJitter; %节点时延抖动向量,1×NVPL=VertexPacketLoss; %节点丢包率向量,1×NCD=1e-3*20; %时延约束CDJ=1e-2*10; %时延抖动约束CPL=0.1; %丢包率约束KD=1000; %延时约束惩罚系数KDJ=10000; %时延抖动惩罚系数KPL=200; %丢包率约束惩罚系数N=length(E); %目的节点的个数ROUTES=cell(1,N); %备选路径集,细胞结构,1×Num个子单元,每个子单元对应一个目的节点Num=zeros(1,N); %每个目的节点的备选路径的个数for i=1:Ndisp(i);[AllRoutes,RC,RD,RDJ,RPL]=ACR(S,E(i),K,M,Tau,Alpha,Rho,Q,EC,ED,VC,VD,VDJ,VPL,CD, CDJ,CPL,KD,KDJ,KPL);ROUTES{i}=AllRoutes;Num(i)=length(AllRoutes);end[MBR,LC1,LC2]=MCRGSA(M,N,Pm,K,t0,alpha,ROUTES,Num,EdgeCost,VertexCost,E); ElapsedTime1=toc;figureNet_plot(BorderLength,NodeAmount,Sxy,BFEdgeCost,1);hold onTree=inf*ones(size(BFEdgeCost));Code=MBR(M,:);for i=1:length(Code)R=ROUTES{i}{Code(i)};J=length(R)-1;for j=1:Ja=R(j);b=R(j+1);Tree(a,b)=BFEdgeCost(a,b);Tree(b,a)=BFEdgeCost(b,a);endendNet_plot2(BorderLength,NodeAmount,Sxy,Tree,1); hold on。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
QoS组播路由问题的蚁群算法通用Matlab源码
function [MRT,EDGES,cost]=ACA_QoS_MR(C,D,S,E,Dmax,K,M,Alpha,Beta,Gamma,Tau,Rho,Q) %% Ant Colony Algorithm for QoS Multicast Routing
% QoS组播路由蚁群算法
%% 输入参数列表
% C 费用邻接矩阵(N×N)
% D 延时邻接矩阵(N×N)
% S 源节点
% E 组播目的节点(行向量)
% Dmax 延时约束
% K 迭代次数(指蚂蚁出动多少波)
% M 蚂蚁个数(每一波蚂蚁有多少个)
% Alpha 表征信息素重要程度的参数
% Beta 表征启发式因子(费用)重要程度的参数
% Gamma 表征启发式因子(延时)重要程度的参数
% Tau 初始信息素矩阵
% Rho 信息素蒸发系数
% Q 信息素增加强度系数
%% 输出参数列表
% MRT 最优组播树(01邻接矩阵表示)
% EDGES 最优组播树所有的边
% cost 最优组播树的费用
%%
%% 第一步:变量初始化
N=size(C,1);%网络节点个数为N
P=length(E);%目的节点个数为M
MRT=zeros(N,N);
cost=inf;
ROUTES=cell(P,K,M);%用细胞结构存储到每一个目的节点的每一代的每一只蚂蚁的爬行路线DELAYS=inf*ones(P,K,M);%用三维数组存储每代每个蚂蚁爬行到各个目的节点的延时
COSTS=inf*ones(P,K,M);%用三维数组存储每代每个蚂蚁爬行到各个目的节点的费用
%% 第二步:启动到P个目的节点的K轮蚂蚁觅食活动,每轮派出M只蚂蚁
for p=1:P
Tau=ones(N,N);
for k=1:K
for m=1:M
%% 第三步:状态初始化
W=S;%当前节点初始化为起始点
Path=S;%爬行路线初始化
PD=0;%爬行路线延时初始化
PC=0;%爬行路线费用初始化
TABU=ones(1,N);%禁忌表初始化
TABU(S)=0;%S已经在初始点了,因此要排除
CC=C;%费用邻接矩阵备份
DD=D;%延时邻接矩阵备份
%% 第四步:下一步可以前往的节点
DW=DD(W,:);
DW1=find(DW<inf);
for j=1:length(DW1)
if TABU(DW1(j))==0
DW(j)=inf;
end
end
LJD=find(DW<inf);%可选节点集
Len_LJD=length(LJD);%可选节点的个数
%% 觅食停止条件:蚂蚁未遇到食物或者陷入死胡同
while (W~=E(p))&&(Len_LJD>=1)
%% 第五步:转轮赌法选择下一步怎么走
PP=zeros(1,Len_LJD);
for i=1:Len_LJD
PP(i)=(Tau(W,LJD(i))^Alpha)*(C(W,LJD(i))^Beta)*(D(W,LJD(i) )^Gamma);
end
PP=PP/(sum(PP));%建立概率分布
Pcum=cumsum(PP);
Select=find(Pcum>=rand);
to_visit=LJD(Select(1));%下一步将要前往的节点
%% 第六步:状态更新和记录
Path=[Path,to_visit];%路径增加
PD=PD+DD(W,to_visit);%路径延时累计
PC=PC+CC(W,to_visit);%路径费用累计
W=to_visit;%蚂蚁移到下一个节点
for kk=1:N
if TABU(kk)==0
CC(W,kk)=inf;
CC(kk,W)=inf;
DD(W,kk)=inf;
DD(kk,W)=inf;
end
end
TABU(W)=0;%已访问过的节点从禁忌表中删除
DW=DD(W,:);
DW1=find(DW<inf);
for j=1:length(DW1)
if TABU(DW1(j))==0
DW(j)=inf;
end
end
LJD=find(DW<inf);%可选节点集
Len_LJD=length(LJD);%可选节点的个数
%%
end
%% 第七步:记下每一代每一只蚂蚁的觅食路线和路线长度
ROUTES{p,k,m}=Path;
if Path(end)==E(p)&&PD<=Dmax
DELAYS(p,k,m)=PD;
COSTS(p,k,m)=PC;
else
DELAYS(p,k,m)=inf;
COSTS(p,k,m)=inf;
end
end
%% 第八步:更新信息素
Delta_Tau=zeros(N,N);%更新量初始化
for m=1:M
if COSTS(p,k,m)<inf&&DELAYS(p,k,m)<Dmax
ROUT=ROUTES{p,k,m};
TS=length(ROUT)-1;%跳数
Cpkm=COSTS(p,k,m);
for s=1:TS
x=ROUT(s);
y=ROUT(s+1);
Delta_Tau(x,y)=Delta_Tau(x,y)+Q/Cpkm;
Delta_Tau(y,x)=Delta_Tau(y,x)+Q/Cpkm;
end
end
end
Tau=(1-Rho).*Tau+Delta_Tau;%信息素挥发一部分,新增加一部分 end
end
%% 第九步:整理输出结果
MINCOSTS=NaN*ones(1,K);
allcost=zeros(1,0);
for k=1:K
for m=1:M
COSTkm=COSTS(:,k,m);
DELAYkm=DELAYS(:,k,m);
if sum(COSTkm)<inf&&sum(DELAYkm)<inf
Tree=zeros(N,N);
for p=1:P
path=ROUTES{p,k,m};
RLen=length(path);
for i=1:(RLen-1)
Tree(path(i),path(i+1))=1;
Tree(path(i+1),path(i))=1;
end
end
TC=Tree.*C;
for ii=1:N
for jj=1:N
if isnan(TC(ii,jj))
TC(ii,jj)=0;
end
end
end
mincost=0.5*sum(sum(TC));
if mincost<cost
MINCOSTS(1,k)=mincost;
MRT=Tree;
cost=mincost;
end
allcost=[allcost,cost];
end
end
end
MM=triu(MRT);
T1=find(MM==1);
T2=ceil(T1/N);
T3=mod(T1,N);
EDGES=[T3,T2];
%% 绘收敛曲线
figure(1)
COSTS2=zeros(M,K,P);
DELAYS2=zeros(M,K,P);
for p=1:P
for k=1:K
for m=1:M
if COSTS(p,k,m)<inf
COSTS2(m,k,p)=COSTS(p,k,m);
DELAYS2(m,k,p)=DELAYS(p,k,m);
end
end
end
end
LC1=zeros(1,K);
LC2=zeros(1,K);
for k=1:K
costs=COSTS2(:,k,1);
delays=DELAYS2(:,k,1);
pos1=find(costs>0);
pos2=find(delays>0);
len1=length(pos1);
len2=length(pos2);
LC1(k)=sum(costs)/len1;
LC2(k)=sum(delays)/len2;
end
plot(LC1,'ko-');
hold on
plot(LC2,'bs-');
legend('费用','延时')
title('路径的费用延时变化情况')
figure(2)
plot(allcost,'b-')
title('组播树费用收敛曲线')。