蚁群算法+LEACH 点滴(五) WSN簇头的路径规划(蚁群算法)

需要将:蚁群算法+LEACH 点滴(四) 蚁群算法(TSP问题)先学习在看本文,因为注释不是很好,没怎么修改。

链接:http://blog.csdn.net/hu1583141033/article/details/8871725

1.随机产生测试用簇头:

clc
clear all;
p = rand(15,2)*100;
d =  zeros(15,1);
m = d;
for i = 1:15
        d(i) = ((p(i,1)-50)^2+(p(i,2)-50)^2)^0.5;
    if(d(i)>=0&&d(i)<=25)
        m(i) = 3;
    elseif(d(i)>25&&d(i)<=40)
         m(i) = 2;
    else
        m(i) = 1;
    end
end
r = zeros(15,3);
for i = 1:15
    r(i,1:2) = d(i);
    r(i,3) = fix(m(i));
end

save(‘random.txt’,’r’, ‘-ASCII’);

(需要多运行一下,观察第三列生成的数据,需要1,2,3产生的数目都要有,数目最好是均匀的,后面给出参考数据(random.txt))

2.运行命令(LEACH.m):

C= load(‘random.txt’)

 ANTLEACH(C,50,50)


3.参考程序(查找在random第三列标记为3的节点到基站的路径):

function ANTLEACH(C,mx,my)%mx,my基站坐标

%%
%%第一步:变量初始化
% 参考设置初始参数如下:
Alpha=1;Beta=5;Rho=0.1;NC_max=50;Q=100;
n=size(C,1);%n表示问题的规模(城市个数),由于为坐标表示,所以两个城市之间均可达
D=zeros(n,n+1);%D表示完全图的赋权邻接矩阵,n+1存储改点到基站的距离
m = fix(n/2);
cityS = 0;
cityNum = 0;
Eta = zeros(n,n+1);
%存放可访问城市
J=zeros(1,cityNum);       %待访问的城市
Jc = 0;
digits(5);

for i=1:n
    for j=1:n
        if i~=j
            if((C(i,3) == 3&&C(j,3) == 2)|| (C(i,3) == 2&&C(j,3) == 1))
                D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;
            else
                D(i,j)=50;
            end
        else
            D(i,j)=50;      %i=j时不计算,应该为0,但后面的启发因子要取倒数,用eps(浮点相对精度)表示
            
        end
    end
    if(C(i,3) == 3)

        cityS = cityS+1;
        JS(cityS)=i;%存储起始点
    else

        cityNum = cityNum+1;
        Jc = Jc + 1;
        J(Jc)=i;%对可收索城市编号,也是在D中的编号
        
    end
    D(i,n+1) = ((C(i,1)-mx)^2+(C(i,2)-my)^2)^0.5;

end
Eta  = 1./D;
D = vpa(D);
Eta = vpa(Eta);

%%
layers = 3;%路径长度
Shortest_Route=zeros(cityS,layers);   %存储并记录该节点最后的最佳路径
% Tabu = zeros(cityS,layers+1);
for i = 1:cityS
    Shortest_Route(i,1) = JS(i);%城市标号
end
for i = 1:m
    JCA(i,:) = J;%可以访问的城市标号
end
str = sprintf(‘共%d个节点需要查找路径.’,cityS);
disp(str);

for st = 1:cityS%先寻找一个节点的路径
    NC=1;               %迭代计数器,记录迭代次数
    Tau=ones(n,n);     %Tau为信息素矩阵
    L_best=inf.*ones(NC_max,1);   %各代最佳路线的长度
    R_best=zeros(NC_max,layers);       %各迭代最佳路线
    str = sprintf(‘第%d个节点路径查找中…’,st);
    disp(str);
    disp(‘Busy…’);
  
    while NC<=NC_max        %停止条件之一:达到最大迭代次数,停止
        
        TabuTemp=zeros(m,layers);   %存储并记录每只蚂蚁的所有路径上的城市编号
        JJ = cell(m,1);
        for i = 1:m
            JJ{i} = JCA(i,:);%城市标号
        end

        %m只蚂蚁从第一个城市出发,发现最优路线,得到第一个城市最优路线
        for j=2:layers     %j表示当前收索到的最佳城市存储位置
            for i=1:m%从第一个城市开始放m只蚂蚁
                Jtemp = JJ{i};
                
                TabuTemp(:,1) =Shortest_Route(st,1);
                visited=TabuTemp(i,1:(j-1)); %记录已访问的城市,避免重复访问
                P=Jtemp;
                
                %下面计算待选城市的概率分布
                for k=1:length(Jtemp)
                    P(k)=(Tau(visited(end),Jtemp(k))^Alpha)*(Eta(visited(end),Jtemp(k))^Beta);%end为矩阵末位索引
                end
                P=P/(sum(P));
                PMax = max(P);
                R = vpa(PMax);
                
                rd = rand(1)*(0.001-R)+R;%0.001~1随机数
                select_index_list = find(P >=rd);%赌轮法 
                to_visit_city_index = Jtemp(select_index_list(1));
               
                JJ{i}(select_index_list(1)) = [];
                TabuTemp(i,j)=to_visit_city_index;%更新第i只蚂蚁的第j个城市
            end
        end

        %%
        %%记录本只蚂蚁迭代最佳路线
        L=zeros(m,1);     %开始距离为0,m*1的列向量
        for i=1:m%所有蚂蚁的路径长度对应于L中
            R=TabuTemp(i,:);
            for j=1:(layers-1)
                L(i)=L(i)+D(R(j),R(j+1));    %原距离加上第j个城市到第j+1个城市的距离
            end
            L(i)=L(i)+D(R(end),n+1);      %路径上最后一个城市直接返回(这样合理??)
        end
        L_best(NC)=min(L);           %保存当前最佳距离
        pos=find(L==L_best(NC));
        R_best(NC,:)=TabuTemp(pos(1),:); %此轮迭代后的最佳路线
        
        %%
        %%第五步:更新信息素
        Delta_Tau=zeros(n,n);        %开始时信息素为n*n的0矩阵
        for i=1:m
            for j=1:(layers-1)
                Delta_Tau(TabuTemp(i,j),TabuTemp(i,j+1))=Delta_Tau(TabuTemp(i,j),TabuTemp(i,j+1))+Q/L(i);
                %此次循环在路径(i,j)上的信息素增量
            end
            Delta_Tau(TabuTemp(i,layers),TabuTemp(i,1))=Delta_Tau(TabuTemp(i,layers),TabuTemp(i,1))+Q/L(i);
            %最后一次返回留下信息素,此次循环在整个路径上的信息素增量
        end
        Tau=(1-Rho).*Tau+Delta_Tau; %考虑信息素挥发,更新后的信息素
        %%
        %%第六步:禁忌表清零
        TabuTemp=zeros(m,layers);
        NC=NC+1;           %迭代继续
        
    end
    %%
    %m只蚂蚁路径最佳
    Pos=find(L_best==min(L_best)); %找到最佳路径(非0为真)
    Shortest_Route(st,:)=R_best(Pos(1),:); %最大迭代次数后最佳路径

end

str = sprintf(‘全部%d个节点路径查找完成.’,cityS);
disp(str);
disp(‘所有节点最佳路径为:’);
Shortest_Route

4.运行结果:

共7个节点需要查找路径.
第1个节点路径查找中…
Busy…
第2个节点路径查找中…
Busy…
第3个节点路径查找中…
Busy…
第4个节点路径查找中…
Busy…
第5个节点路径查找中…
Busy…
第6个节点路径查找中…
Busy…
第7个节点路径查找中…
Busy…
全部7个节点路径查找完成.
所有节点最佳路径为:

Shortest_Route =

     4     3     6
     5     3     1
     7     3     6
     8     3     1
     9     2     1
    13     3     1
    15     3     6


5.random.txt文件内容:

   46.1417   46.1417    1
   31.2176   31.2176    2
   26.1758   26.1758    2
   14.1808   14.1808    3
   20.5196   20.5196    3
   44.8713   44.8713    1
    1.5379    1.5379    3
   21.7827   21.7827    3
    3.0645    3.0645    3
   47.1439   47.1439    1
   36.9474   36.9474    2
   41.1459   41.1459    1
   22.1153   22.1153    3
   46.9263   46.9263    1
   14.3464   14.3464    3

    原文作者:蚁群算法
    原文地址: https://blog.csdn.net/hu1583141033/article/details/8871753
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞