您的位置:首页 > 编程语言 > MATLAB

Matlab蚁群算法解决TSP问题代码超详细注释

2017-07-31 22:48 381 查看
直接把建模作业贴上来了,代码是参考一个学长写的,图解的话百度文库里有好多不错的资料,配合这个代码应该可以很好的理解
毕竟我也是小白 如果有错误欢迎指正:

clc;clear all;
t1=clock;%用于记录运行时间
X=[114 50 99 30 60 26 29 7 53 40 102 3 32 12 100 38 5 2 91 5 46 105 95 94 34 116 92 38 33 20 4 89 58 73 86];
Y=[228 70 146 171 150 262 220 29 246 275  175 48 52 227 99 254 186 161 49 68 245 90 64 94 190 53 235 136 43 185 131 163 229 104 9];
city=[X',Y'];%坐标是随机生成的
numberofcities = length(city);% number of cities
% distance matrix: dis(i,j) is the distance between city i and j.
dis=zeros(numberofcities);
for   n=1:numberofcities%dis表示根据测试数据中的城市坐标生成的邻接矩阵(就是每个点自己的距离的矩阵)
    for m=1:numberofcities
         dis(n,m)=[(city(n,1)-city(m,1))^2+(city(n,2)-city(m,2))^2]^1/2;
    end
end
alpha =1;%启发因子,信息素的重要程度
beta = 3;%期望因子,城市间距离的重要程度
rou = 0.7;%信息素残留参数
Q = 2000    %%信息素增强系数
m = 40;  %m 蚂蚁数量
Eta = 1./dis;%表示每条边的能见度
Tau = ones(numberofcities,numberofcities);%为信息素矩阵,可以理解为在蚂蚁还没有被放入城市前,每条道路上就已经存在了一定含量的信息素(只是为了方便计算)
Tauroute = zeros(m,numberofcities);%存储并记录每次迭代时每只蚂蚁经历的路径生成;
NC_max = 50; %迭代计数器,记录迭代次数
R_best=zeros(NC_max,numberofcities); %各代最佳路线
L_best=inf.*ones(NC_max,1);%各代最佳路线的长度
NC = 1;
while NC <=NC_max%表示循环终止条件,迭代终止器
    %第二步:将m只蚂蚁放到n个城市上
    Randpos = [];%随即存取
    for i = 1:(ceil(m/numberofcities))%将m只蚂蚁随机放到n个城市上
        Randpos = [Randpos,randperm(numberofcities)];
    end
    Tauroute(:,1) = (Randpos(1,1:m))';%初始化每只蚂蚁的路径 1列为每只蚂蚁的起始点
    %第三步:所有蚂蚁按概率函数选择下一座城市,完成各自的周游
    for j = 2:numberofcities
        for i = 1:m
            visited = Tauroute(i,1:(j-1));%已经找过的城市
            prob = zeros(1,(numberofcities-j+1));%待访问城市的选择概率分布,
            citys=1:numberofcities;
            visting=citys(ismember(citys,visited)==0);%待访问的城市
            %visting=setdiff([1:numberofcities],visited);
            %下面计算待选城市的概率分布
            for k = 1:length(visting)%对每只蚂蚁还没有访问的城市依次计算概率
                %Eta表示每条边的能见度
                %Tau为信息素矩阵,每条边已经存在的信息素
                prob(k) = (Tau(visited(end),visting(k))^alpha)*(Eta(visited(end),visting(k))^beta);
            end
           
            prob = prob/(sum(prob));%转换为概率
            pcum = cumsum(prob);%生成轮盘
            Select = find(pcum>=rand);%按概率随机选取下一个要选的城市
            tovisit = visting(Select(1));%从已经选择的城市们中再选一个城市
            Tauroute(i,j) = tovisit;%在路径中记录选择的城市
           
        end
    end
   
    if NC > 2
        Tauroute(1,:) = R_best(NC-1,:);%如果迭代次数大于2,则将上一代最好路径覆盖第一只蚂蚁的路径
    end
    %第四步:记录本次迭代最佳路线
    L = zeros(m,1);%开始距离为0,m*1的列向量
   
    for i = 1:m%计算每一种蚂蚁的路径
        R = Tauroute(i,:);
        d = dis(R(end),R(1)); % closed path
        for k = 1:length(R)-1%计算路径
            d = d + dis(R(k),R(k+1));
        end
        L(i)=
4000
d;
    end
   
    L_best(NC) = min(L);%记录本次迭代最短的路径的长度(L_best是一个列向量)
    pos = find(L==L_best(NC));%找到该列向量对应的下标
    R_best(NC,:) = Tauroute(pos(1),:);%通过最短路径的下标找到它的路径并记录
    Rbest =  Tauroute(pos(1),:);%嗯。。。这个定义纯粹就是为了画图
    %plotroute(city, Rbest, L_best(NC), NC);%画出这一代的最短路径
    x=city(Rbest,1);
    y=city(Rbest,2);
    plot(X,Y,'.k','LineWidth',5);%标明城市
    hold on
    plot(X(1),Y(1),'p','markersize',5, ...
                              'MarkerEdgeColor','r','MarkerFaceColor','g');%标明起始点
   
    plot([x;x(1)],[y;y(1)],'b');%补上缺口
    L_best(NC)
    xlabel(sprintf('generation = %5i           Total Distance = %6.1f',NC,L_best(NC)));%代数和每代最短距离
    hold off
    drawnow;
    NC = NC + 1;%代数自增长
    %第五步:更新信息素
    Delta_Tau = zeros(numberofcities,numberofcities);%默认信息素矩阵为全零
    for i = 1:m%对每只蚂蚁的路径更新信息素
        for j = 1:(numberofcities-1)
            Delta_Tau(Tauroute(i,j),Tauroute(i,j+1)) = Delta_Tau(Tauroute(i,j),Tauroute(i,j+1))+Q/L(i);
        end
        %最后一个城市回到起始城市
        Delta_Tau(Tauroute(i,numberofcities),Tauroute(i,1))=Delta_Tau(Tauroute(i,numberofcities),Tauroute(i,1))+Q/L(i);
    end
    Tau = (1-rou).*Tau + Delta_Tau;%蒸发量加上新加的信息素
    Tauroute = zeros(m,numberofcities);%Tauroute清零用于下一轮路径的记录
end
t2=clock;
etime(t2,t1)%返回运行时间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: