Thuật toán mô phỏng giao thức định tuyến tối ưu năng lượng cho mạng cảm biến không dây trong Matlab. HEED protocol, matlab, wireless sensor network. Giao thức phân cụm (clustering) tối ưu năng lượng trong mạng định tuyến là giao thức quan trọng và tối ưu trong bảo toàn năng lượng, kéo dài thời gian sống của mạng. Mô phỏng và so sánh các giao HEED, LEACH là rất quan trọng, trong nghiên cứu về mạng cảm biến không dây.
Trang 1# Tác giả đảm bảo nếu download file này sẽ thực thi thành công trong matlab
# các thông tin cần liên hệ: dungnq06@qq.com
NodeNums = 1000; % the num of node
AreaR = 2000 ; % the area of simulate
NodeTranR=10; % the transit Radius
Elec=50 * 10^(-9); %
Eamp=100*10^(-12);
Bx=0; % The Postion of Baseation
By=AreaR+400;
MaxInteral = 100; % the leach simulate time
Pch=0.05; % the desired percentage of cluster heads
InitEn=4; % the init energy of all node
MaxEn=InitEn;
Tr=100; % the time of round
Kbit=2000; % the bits of a node transmiting a packet every time
Gathingcoefficient=0.8;
BandWitch = 1*10.^(6); % Channel Bandwitch
Threshold=0; % the threshold of node becoming a cluster-head
TDMA=400;
Cprob=0.04;
sym ClusterHeadNum ;
ClusterHeadNum=0;
TOS_LOCAL_ADDRESS = -1; % TOS_LOCAL_ADDRESS must <=0
Trang 2for i=1:(MaxInteral)
AliveNode(i)=NodeNums;
end
% Node.x=AreaR*rand(1,NodeNums); % the position of node
% Node.y=AreaR*rand(1,NodeNums);
sym buchang;
buchang = (AreaR/NodeNums);
% buchang=int(buchang);
Node.x=0:buchang:(buchang.*(NodeNums-1)); % the position of node
Node.y=0:buchang:(buchang.*(NodeNums-1));
Node.IsClusterHeads=linspace(0,0,NodeNums); % NON_CH,TENTATIVE_CH,FINAL_CH
Node.IsCovered=linspace(0,0,NodeNums); % Have Been Covered by a cluster head 1:yes 0:No
Node.c=linspace(0,0,NodeNums); % the Cluster head of node
Node.chcost=linspace(0,0,NodeNums); % the Cluster head of node
Node.d=linspace(0,0,NodeNums); % the distance between cluster head and node
Node.l=zeros(1,NodeNums)+Kbit; % the length of node i transmit packet
Node.EnNode=zeros(1,NodeNums)+InitEn; % the init energy of all node
Node.StateNode=ones(1,NodeNums); % the State of all node 1: alive 0:dead
Node.Listothernode=zeros(NodeNums); % if node is a cluster head,Listothernode save the id of node belong to this cluster
Node.csize=linspace(0,0,NodeNums); % cluser size ,each cluster node num
Node.Nbr=zeros(NodeNums); % neighbor of node
Node.NumNbr=linspace(0,0,NodeNums); % the neighbor's num of node
%Node.DistNbr=linspace(0,0,NodeNums); % the neighbor's dist of node
Node.CHprob=zeros(1,NodeNums)+Cprob;
Node.InitCHprob=zeros(1,NodeNums);
Trang 3Node.tent_CH=zeros(1,NodeNums)+NON_CH;
Node.tent_CH_Cost=ones(1,NodeNums)+9999;
Node.IsaddDummyRound=linspace(0,0,NodeNums);
Node.n_finalCH=linspace(0,0,NodeNums);
Node.ListfinalCH=zeros(NodeNums);
Node.ListfinalCH_Cost=zeros(NodeNums)+9999;
Node.n_tentCH=linspace(0,0,NodeNums);
Node.ListtentCH=zeros(NodeNums);
Node.ListtentCH_Cost=zeros(NodeNums)+9999;
Node.my_finalCH=linspace(0,0,NodeNums);
Node.my_tentCH=linspace(0,0,NodeNums);
Node.my_final_CH_Cost=ones(1,NodeNums)+9999;
Node.Isstop=ones(1,NodeNums); % clustering is end ? 1:no,0:yes
for i=1:NodeNums
count =0 ;
for j=1:NodeNums
if(j~=i)
dist = ((Node.x(i)-Node.x(j)).^2)+((Node.y(i)-Node.y(j)).^2); % the distance.^2
if dist < (Tr.^2+Tr.^2)
count=count+1;
Node.Nbr(i,count)=j;
end
end
if j== NodeNums
Trang 4Node.NumNbr(i) = count ;
end
end
end
syms filen strnumnode tpye strround;
strnumnode = int2str(NodeNums);
filen = date;
type = 'NetWork';
filen=['result\heed\',type,strnumnode,' ',filen,'.txt'];
fid= fopen(filen,'w');
for i=1:NodeNums % The Node ID ,position x,position y,The number of neighbr node,The ID all neighbr node
fprintf(fid,'%6d,%10.4f,%10.4f,%6d',i,Node.x(i),Node.y(i),Node.NumNbr(i));
for j=1:Node.NumNbr(i)
fprintf(fid,',%6d',Node.Nbr(i,j));
end
fprintf(fid,'\r\n');
end
fclose(fid);
sym iteration;
for Rounds = 1:MaxInteral
% the Setup phase of cluster
Node.CHprob=Cprob.*((Node.EnNode)./MaxEn);
Trang 5Node.InitCHprob=Node.CHprob;
Node.IsaddDummyRound=0.*(Node.IsaddDummyRound); %clear
Node.n_finalCH=Node.n_finalCH-Node.n_finalCH;
Node.ListfinalCH=Node.ListfinalCH-Node.ListfinalCH;
Node.ListfinalCH_Cost=Node.ListfinalCH_Cost-Node.ListfinalCH_Cost+9999;
Node.my_finalCH=Node.my_finalCH-Node.my_finalCH;
Node.my_final_CH_Cost=(Node.my_final_CH_Cost-Node.my_final_CH_Cost)+9999; Node.n_tentCH=Node.n_tentCH-Node.n_tentCH;
Node.ListtentCH=Node.ListtentCH-Node.ListtentCH;
Node.ListtentCH_Cost=Node.ListtentCH_Cost-Node.ListtentCH_Cost+9999;
Node.csize=Node.csize-Node.csize;
Node.Isstop = Node.StateNode;
Node.tent_CH=Node.tent_CH-Node.tent_CH+NON_CH;
Node.tent_CH_Cost=Node.tent_CH_Cost-Node.tent_CH_Cost+9999;
Node.c=Node.c-Node.c;
Node.d=Node.d-Node.d;
ClusterHeadNum=0;
Node.IsClusterHeads=Node.IsClusterHeads-Node.IsClusterHeads+NON_CH;
iteration=0;
while sum(Node.Isstop)~= 0
iteration=iteration+1;
for i =1:NodeNums
if Node.Isstop(i)==1
if Node.CHprob(i)<1
if Node.tent_CH(i)==NON_CH
if rand(1,1)<Node.CHprob(i)
Node.IsClusterHeads(i)=TENTATIVE_CH;
Trang 6Node.tent_CH(i)=TOS_LOCAL_ADDRESS;
Node.tent_CH_Cost(i)=Node.NumNbr(i);
end
%elseif Node.tent_CH(i)==TOS_LOCAL_ADDRESS
end
Node.CHprob(i)=Node.CHprob(i).*2;
% if Node.InitCHprob(i)<0.02
% Node.CHprob(i)=Node.CHprob(i).*2;
% else
% Node.CHprob(i)=Node.CHprob(i).*(1+1000.*( Node.InitCHprob(i).^2));
% end
else
if Node.tent_CH(i)~=TOS_LOCAL_ADDRESS && Node.IsaddDummyRound(i)==0 Node.IsaddDummyRound(i)=1;
else
for j=1:NodeNums %Node.n_finalCH(i)
if Node.ListfinalCH(i,j) ~=0
if Node.my_final_CH_Cost(i) > Node.ListfinalCH_Cost(i,j)
Node.my_finalCH(i)= Node.ListfinalCH(i,j);
Node.my_final_CH_Cost(i)=Node.ListfinalCH_Cost(i,j);
end
end
end
% choose cluster head
Node.Isstop(i)=0; % diedai end until CHprob==1
if Node.my_finalCH(i) ~= NON_CH
Node.IsClusterHeads(i)= NON_CH;
Trang 7Node.c(i)=Node.my_finalCH(i);
Node.chcost=Node.my_final_CH_Cost(i);
%join the cluster
dist =Tr.^2+Tr.^2; % ((Node.x(i)-Node.x(curentnbr)).^2)+((Node.y(i)-Node.y(curentnbr)).^2); % the distance.^2
%EntranPCH=EnTran(Elec,Eamp,Kbit,dist) ;
EntranPCH = Elec*Kbit + Eamp*Kbit*dist;
Node.d(i)=((Node.x(i)-Node.x(Node.c(i))).^2)+((Node.y(i)-Node.y(Node.c(i))).^2); % the
distance.^2
Node.EnNode(i)=Node.EnNode(i)-EntranPCH;
if Node.EnNode(i) <= 0
Node.StateNode(i)=0;
Node.Isstop(i)=0;
Node.EnNode(i)=0;
end
EnRecP=EnRec(Elec,Kbit);
Node.EnNode(Node.c(i))=Node.EnNode(Node.c(i))-EnRecP;
if Node.EnNode(Node.c(i)) <= 0
Node.StateNode(Node.c(i))=0;
Node.Isstop(Node.c(i))=0;
Node.EnNode(Node.c(i))=0;
else
Node.csize(Node.c(i))=Node.csize(Node.c(i))+1; % cluster size add one
end
else
Node.IsClusterHeads(i)= FINAL_CH;
Trang 8Node.my_finalCH(i)=TOS_LOCAL_ADDRESS;
Node.c(i)=TOS_LOCAL_ADDRESS;
Node.my_final_CH_Cost(i)= Node.NumNbr(i);%computeDegree(i);
Node.chcost=Node.my_final_CH_Cost(i);
Node.d(i)=((Node.x(i)-Bx).^2)+((Node.y(i)-By).^2); % the distance.^2
ClusterHeadNum=ClusterHeadNum+1;
end
end
end
end
end
% compute consume energy
for i=1:NodeNums
if Node.IsClusterHeads(i) == TENTATIVE_CH % & Node.tent_CH(curentnbr)==TOS_LOCAL_ADDRESS dist =Tr.^2+Tr.^2; % ((Node.x(i)-Node.x(curentnbr)).^2)+((Node.y(i)-Node.y(curentnbr)).^2); % the distance.^2
% EntranPCH=EnTran(Elec,Eamp,Kbit,dist) ;
EntranPCH = Elec*Kbit + Eamp*Kbit*dist;
Node.EnNode(i)=Node.EnNode(i)-EntranPCH;
if Node.EnNode(i) <= 0
Node.StateNode(i)=0;
Node.Isstop(i)=0;
Node.EnNode(i) =0;
end
for j=1:Node.NumNbr(i)
curentnbr = Node.Nbr(i,j);
Trang 9%EnRecP=EnRec(Elec,Kbit);
EnRecP = Elec*Kbit;
Node.EnNode(curentnbr)=Node.EnNode(curentnbr)-EnRecP;
Node.ListtentCH(curentnbr,i) = i;
Node.ListtentCH_Cost(curentnbr,i)=Node.NumNbr(i);%Node.computeDegree(i);
if (Node.ListtentCH(curentnbr,i)==0)
Node.n_tentCH(curentnbr)=Node.n_tentCH(curentnbr)+1;
end
if Node.EnNode(curentnbr) > 0
if (Node.ListtentCH(curentnbr,i)==0)
Node.n_tentCH(curentnbr)=Node.n_tentCH(curentnbr)+1;
end
Node.ListtentCH(curentnbr,i) = i;
Node.ListtentCH_Cost(curentnbr,i)=Node.NumNbr(i);%Node.computeDegree(i);
% if Node.tent_CH(curentnbr)~=TOS_LOCAL_ADDRESS &(Node.tent_CH(curentnbr)==NON_CH
| Node.tent_CH_Cost(i)< Node.tent_CH_Cost(curentnbr) | ((Node.tent_CH_Cost(i)==
Node.tent_CH_Cost(curentnbr) ) & i < Node.tent_CH(curentnbr)))
if(Node.tent_CH(curentnbr)==NON_CH | Node.tent_CH_Cost(i)<
Node.tent_CH_Cost(curentnbr) | ((Node.tent_CH_Cost(i)== Node.tent_CH_Cost(curentnbr) ) & i <
Node.tent_CH(curentnbr)))
Node.tent_CH_Cost(curentnbr)=Node.tent_CH_Cost(i);
% if Node.tent_CH(curentnbr)==TOS_LOCAL_ADDRESS
% if Node.IsClusterHeads(curentnbr) ==TENTATIVE_CH
% Node.IsClusterHeads(curentnbr) = NON_CH;
Trang 10% end
% dist =Tr.^2+Tr.^2; % ((Node.x(i)-Node.x(curentnbr)).^2)+((Node.y(i)-Node.y(curentnbr)).^2); % the distance.^2
% EntranPCH=EnTran(Elec,Eamp,Kbit,dist) ;
% Node.EnNode(curentnbr)=Node.EnNode(curentnbr)-EntranPCH;
% if Node.EnNode(curentnbr) <= 0
% Node.StateNode(curentnbr)=0;
% Node.Isstop(curentnbr)=0;
% Node.EnNode(curentnbr) =0;
% else
% for k=1:Node.NumNbr(curentnbr)
% tempcurentnbr = Node.Nbr(curentnbr,k);
% EnRecP=EnRec(Elec,Kbit);
% Node.EnNode(tempcurentnbr)=Node.EnNode(tempcurentnbr)-EnRecP;
% if Node.ListtentCH(tempcurentnbr,curentnbr)~=0
% Node.n_tentCH(tempcurentnbr)=Node.n_tentCH(tempcurentnbr)-1;
% Node.ListtentCH(tempcurentnbr,curentnbr)=0;
% end
% if Node.tent_CH(tempcurentnbr)==curentnbr % change tent CH
%
% if Node.n_tentCH(tempcurentnbr) <=0
% Node.tent_CH(tempcurentnbr)=NON_CH;
% Node.tent_CH_Cost(tempcurentnbr)=9999;
% else
% Node.tent_CH_Cost(tempcurentnbr)=9999;
% for ll=1:NodeNums
% if Node.ListtentCH(tempcurentnbr,ll) ~=0
Trang 11% if Node.my_tent_CH_Cost(tempcurentnbr) >
Node.ListtentCH_Cost(tempcurentnbr,ll)
% Node.my_tentCH(tempcurentnbr)= Node.ListtentCH(tempcurentnbr,ll);
%
Node.my_tent_CH_Cost(tempcurentnbr)=Node.ListtentCH_Cost(tempcurentnbr,ll);
% end
% end
% end
% end
% end
% if Node.EnNode(tempcurentnbr) <= 0
% Node.StateNode(tempcurentnbr)=0;
% Node.Isstop(tempcurentnbr)=0;
% Node.EnNode(tempcurentnbr) =0;
% end
% end
% end
%
% end
%
Node.tent_CH(curentnbr)=i;
end % if(Node.tent_CH(curentnbr)==NON_CH | Node.tent_CH_Cost(i)<
Node.tent_CH_Cost(curentnbr)
else
Node.StateNode(curentnbr)=0;
Node.Isstop(curentnbr)=0;
Node.EnNode(curentnbr)=0;
end
Trang 12
end
elseif Node.IsClusterHeads(i) == FINAL_CH
dist = Tr.^2+Tr.^2; %((Node.x(i)-Node.x(curentnbr)).^2)+((Node.y(i)-Node.y(curentnbr)).^2); % the distance.^2
% EntranPCH=EnTran(Elec,Eamp,Kbit,dist) ;
EntranPCH = Elec*Kbit + Eamp*Kbit*dist;
Node.EnNode(i)=Node.EnNode(i)-EntranPCH;
if Node.EnNode(i) <= 0
Node.StateNode(i)=0;
Node.Isstop(i)=0;
Node.EnNode(i)=0;
end
for j=1:Node.NumNbr(i)
curentnbr = Node.Nbr(i,j);
%EnRecP=EnRec(Elec,Kbit);
EnRecP = Elec*Kbit;
Node.EnNode(curentnbr)=Node.EnNode(curentnbr)-EnRecP;
if Node.EnNode(curentnbr) > 0
if (Node.ListfinalCH(curentnbr,i)==0)
Node.n_finalCH(curentnbr)=Node.n_finalCH(curentnbr)+1;
end
Node.ListfinalCH(curentnbr,i)=i;
Node.ListfinalCH_Cost(curentnbr,i)=Node.NumNbr(i);%Node.computeDegree(i);
else
Node.EnNode(curentnbr)=0;
Trang 13Node.StateNode(curentnbr)=0;
Node.Isstop(curentnbr)=0;
end
end
end
end
end
% recorder
fid = fopen('result\heed\iterations.txt','a');
fprintf(fid,'%6d,',iteration);
fclose(fid);
strnumnode = int2str(NodeNums);
filen = date;
type = 'ClustringEn';
strround=int2str(Rounds);
filen=['result\heed\',strround,type,strnumnode,' ',filen,'.txt'];
fid= fopen(filen,'w');
for i=1:NodeNums % the Node Id,his Cluster Head and His remain energy before TDMA The energy after TDMA - The energy before TDMA = the consume energy TDMA
fprintf(fid,'%6d,%6d,%8.4f\r\n',i,Node.c(i),Node.EnNode(i));
end
fclose(fid);
%% TDMA
for i=1:NodeNums
Trang 14if Node.StateNode(i) ~=0
if Node.IsClusterHeads(i) == NON_CH
% EntranPCH=EnTran(Elec,Eamp,Kbit,Node.d(i)) ;
EntranPCH = Elec*Kbit + Eamp*Kbit;
Node.EnNode(i)=Node.EnNode(i)-(TDMA.*EntranPCH);
if Node.EnNode(i) <= 0
Node.StateNode(i)=0;
Node.EnNode(i)=0;
end
% EnRecP=EnRec(Elec,Kbit);
EnRecP = Elec*Kbit;
Node.EnNode(Node.c(i))=Node.EnNode(Node.c(i))-EnRecP;
if Node.EnNode(Node.c(i)) <= 0
Node.StateNode(Node.c(i))=0;
Node.EnNode(Node.c(i))=0;
end
else
EntranPCH=EnTran(Elec,Eamp,Kbit.*Node.csize(i).*Gathingcoefficient,Node.d(i)) ; Node.EnNode(i)=Node.EnNode(i)-(TDMA.*EntranPCH);
if Node.EnNode(i) <= 0
Node.StateNode(i)=0;
Node.EnNode(i)=0;
end
end
Trang 15end
end
%%
strnumnode = int2str(NodeNums);
filen = date;
type = 'EachRoundAllEn';
strround=int2str(Rounds);
filen=['result\heed\',strround,type,strnumnode,' ',filen,'.txt'];
fid= fopen(filen,'w');
for i=1:NodeNums % the Node Id,his Cluster Head and His remain energy after TDMA
fprintf(fid,'%6d,%6d,%8.4f\r\n',i,Node.c(i),Node.EnNode(i));
end
fclose(fid);
strnumnode = int2str(NodeNums);
filen = date;
type = 'ClusterHead';
strround=int2str(Rounds);
filen=['result\heed\',strround,type,strnumnode,' ',filen,'.txt'];
fid= fopen(filen,'w');
fprintf(fid,'%6d, ',ClusterHeadNum); % write the Num of Cluster Head,then write Id of Cluster Head for i=1:NodeNums
if Node.IsClusterHeads(i) ~= NON_CH
fprintf(fid,'%6d, ',i);
end