需要将:蚁群算法+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