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

基于matlab的蚁群算法理解

2017-05-02 08:00 274 查看
%TSP 的蚁群算法

%%z是2*n的矩阵即为城市的坐标的点

function Itsp=AOC(z)

%保留每次迭代的最优解

% 以max(t^a*b^(-b))为依据找最优路径,与保留的最优路径比较

x=z(:,1);

y=z(:,2);

n=30 ;%城市数目

c=100;

q=10^(+6);

NC=100;

r=0.9;%表示轨迹持久性

a=1.5;%表示轨迹相对重要性

b=2;%能见度相对重要行

m=50;%表示蚂蚁数量

for i=1:n

    for j=1:n

        dij(i,j)=sqrt((x(i)-x(j))^2+(y(i)-y(j))^2);%计算i到j城市的距离

    end

end

for i=1:n

    dij(i,i)=0.01;%另本身城市到本身城市的距离是一个很小的值。

end

min10=10^5;

t=ones(n)*c;%产生n*n全c的矩阵;

for nc=1:NC

    tabu=ones(m,n);%禁忌表,一行表示一蚂蚁,一列表示一个城市

    tabu(:,1)=0; %把第一列赋值为0;一第一行为例说明就是,第一个蚂蚁目前所在的

                 %位置是tabu(0,0)它的下一个城市就不能是当前城市

    path=ones(m,n);%path 记录了每一个蚂蚁没走一步的城市位置。

    for k=1:m

        for step=1:n-1

            %信息素的更新过程。

            ta=t.^a;

            tb=dij.^(-b);

            td=ta.*tb;

            pd=tabu(k,:).*td(path(k,step),:);

            pk=pd/sum(pd); %概率计算可能为0

            rk=rand;%随机生成0-1的数,在没有信息的情况下蚂蚁选择的路线都是随机的。

            spk=0;

            j=1;

            while j<=n

                if rk<spk+pk(j)%满足条件跳出循环执行tabu(k,j)=0。表示蚂蚁已经进到下一个城市。

                    break;

                else

                    spk=spk+pk(j);%因为对于一个蚂蚁来说,rk是固定的这式子能够保证if条件的执行,即能够跳到下一城市。

                    j=j+1;

                end

            end

            tabu(k,j)=0;

            path(k,step+1)=j;%表示第k个蚂蚁的下一个城市为j。

        end

    end

    dt=zeros(n);%生成n*n全0矩阵;

    for i=1:m

        Itsp(i) =ca_tsp(n,path(i,:),dij);%计算第i个蚂蚁选择所有城市后的全部距离。

        for k=1:n-1

           dt(path(i,k),path(i,k+1))= dt(path(i,k),path(i,k+1))+q/Itsp(i);

           dt(path(i,k+1),path(i,k))= dt(path(i,k),path(i,k+1));

        end

         dt(path(i,n),path(i,1))= dt(path(i,n),path(i,1));

          dt(path(i,1),path(i,n))= dt(path(i,n),path(i,k+1));

    end

    [min1,i]=min(Itsp);%计算所有蚂蚁循环后的最短路.min1存的是最小值,i存的第几个蚂蚁。

    if min1<min10

       min10=min1;

       c0=path(i,:);%c0记录的是一次所有蚂蚁循环后最优的路线。

    end

    t=r*t+dt;

end

%%

     k=1;

     while k<=n

         x1(k)=x(c0(k));

         y1(k)=y(c0(k));

         k=k+1;

     end

     x1(n+1)=x1(1);

     y1(n+1)=y1(1);

     %绘制图形·

     figure(1),

     plot(x,y,'o--');

     grid on

     figure(2)

     line(x1,y1,'color','r','linewidth',2);

     hold on

     plot(x,y,'o--');

     hold on

     [x1',y1']

    

     min10 %最优解的路程距离

    

    

    

    

end

function Itsp=ca_tsp(n,c,dij)%dij相当于指针吧,把该dij(i,j)=sqrt((x(i)-x(j))^2+(y(i)-y(j))^2)方法传进。

    i=1;

    Itsp=dij(c(n),c(1));%计算城市n到城市1的距离

    while i<n

       Itsp=Itsp+dij(c(i),c(i+1)); %距离叠加。

       i=i+1;

    end

end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: