资源简介

旅行者问题的优化实现,三种算法通过一个图形化界面,可以进行动态演示比较。随机生成节点然后规划路径,注释充分!

资源截图

代码片段和文件信息

function[R_bestL_bestL_aveShortest_RouteShortest_Length]=ASTSP(CNC_maxmAlphaBetap0Q)
%C n个城市的坐标,n*2矩阵(xy)
%NC_max最大迭代次数
%m 蚂蚁个数
%Alpha 表征信息素重要程度的参数
%Beta 表征启发式因子重要程度的参数
%p0 信息素蒸发系数
%Q 信息素增加强度系数
%R_best 各代最佳路线
%L_best 各代最佳路线的长度


%初始化1
n=size(C1);%size(C1)返回C的行数,也就是城市个数,n表示城市个数
D=zeros(nn);%D表示图的邻接矩阵,各点的值为每个点到每个点的权值
% 把坐标转换为邻接矩阵
for i=1:n
    for j=1:n
        if i~=j
            D(ij)=((C(i1)-C(j1))^2+(C(i2)-C(j2))^2)^0.5;%简单地求两点之间的距离
        else
            D(ij)=eps;%应该赋值为0,但因为后面启发因子需要取倒数,所以用eps表示,eps为当发现某个值小于eps时,就把这个数当做0来处理
        end
        D(ji)=D(ij);%对称矩阵
    end
end

%初始化2
%D直接传入邻接矩阵
% n=size(D1);

QF=1./D;%Eta为启发因子矩阵,这里设为距离的倒数
XXS=ones(nn);%XXS为信息素矩阵
JJtable=zeros(mn);%存储并记录路径的生成,禁忌表,m为蚂蚁个数
NC=1;%迭代计数器,记录迭代次数
R_best=zeros(NC_maxn);%迭代之后的每一代最佳路线
L_best=inf.*ones(NC_max1);%各代最佳路线长度,初始化为无穷大
L_ave=zeros(NC_max1);%各代路线的平均长度

while NC<=NC_max %迭代次数到最大停止
    %将m只蚂蚁放到n个城市上
    Randpos=[];%随机位置
    for i=1:(ceil(m/n))%ceil向正方向取整,求得最多安排几次
        Randpos=[Randposrandperm(n)];%randperm把1到n这些数随机打乱得到的一个数字序列,然后不断添加到Randpos中去
    end
    JJtable(:1)=(Randpos(11:m))‘;%Tabu(:1)表示Tabu第一行就是初始m只蚂蚁被随机分到所n城市中的一个
    
    %m只蚂蚁按概率函数选择下一座城市,完成各自的周游
    for j=2:n%从所在城市的下一个城市开始
        for i=1:m
            visited=JJtable(i1:(j-1));%记录已访问的城市,可避免重复访问
            ToVisitCity=zeros(1(n-j+1));%待访问的城市待访问城市的数量为(n-j+1)
            P=ToVisitCity;%待访问的城市的选择概率分布
            count=1;%访问的城市个数
            for k=1:n
                if length(find(visited==k))==0%开始设置为0find()语句找到visited中等于k的元素在数组visited中的位置,length如果为零就是visited中没有k元素,即没有访问过k城市。
                    ToVisitCity(count)=k;
                    count=count+1;
                end
            end
            
            %下面进行城市的概率分布
            for k=1:length(ToVisitCity)
                %visited(end)表示蚂蚁现在所在城市编号,ToVisitCity(k)表示下一个要访问的城市编号
                P(k)=(XXS(visited(end)ToVisitCity(k))^Alpha)*(QF(visited(end)ToVisitCity(k))^Beta);
            end
            P=P/(sum(P));%把各个路径概率统一到和为1
            
            %按概率原则选取下一个城市
            
            %蚂蚁要选择的下一个城市不是按最大概率,就是要用到轮盘法则,不然影响全局收缩能力,所以用到累积函数,Pcum=cumsum(P)
            Pcum=cumsum(P);%cumsum,元素累加即求和,比如P=[0.1 0.5 0.4],cumsum(P)=  [0.1000    0.6000    1.0000]
            Select=find(Pcum>=rand);%若计算的概率大于原来的就选择这条路线
            %要选择其中总概率大于等于某一个随机数,找到大于等于这个随机数的城市的在J中的位置
            
            %轮盘法则,Select(1),1保证可以选到最大概率的城市,比如:p=[0.1 0.6 0.3]中间那个城市概率最大此时Pcum=[0.1  0.7  1]   Select =[2   3];  Select(1)=2中间那个城市概率最大
            to_visit=ToVisitCity(Select(1));%提取这些城市的编号到to_visit中
            JJtable(ij)=to_visit;
        end
    end
    if NC>=2
        JJtable(1:)=R_best(NC-1:);
    end
    
    %记录本次迭代最佳路线
    L=zeros(m1);%记录本次迭代最佳路线的长度,每个蚂蚁都有自己走过的长度记录在向量L中开始距离为0,m*1的列向量
    for i=1:m
        R=JJtable(i:);
        for j=1:(n-1)
            L(i)=L(i)+D(R(j)R(j+1));%原距离加上第j个城市到第j+1个城市的距离
        end
        L(i)=L(i)+D(R

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       9215  2018-05-23 10:24  GUI.m

     文件       3531  2018-05-23 11:05  SATSP.m

     文件       5965  2018-05-23 10:53  ASTSP.m

     文件       6631  2018-05-23 16:08  GATSP.m

     文件      26687  2018-05-18 15:06  GUI.fig

----------- ---------  ---------- -----  ----

                52029                    5


评论

共有 条评论