# 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ệ:
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;
NON_CH
TENTATIVE_CH
FINAL_CH
= 0;%
= 1; %
// non cluster head
// tentative cluster head
= 2;%
sym ClusterHeadNum ;
ClusterHeadNum=0;
TOS_LOCAL_ADDRESS = -1;
% TOS_LOCAL_ADDRESS must <=0
// final cluster head
for 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);
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);
Node.l=zeros(1,NodeNums)+Kbit;
% Have Been Covered by a cluster head 1:yes 0:No
% the distance between cluster head and node
% 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);
belong to this cluster
% if node is a cluster head,Listothernode save the id of node
Node.csize=linspace(0,0,NodeNums);
Node.Nbr=zeros(NodeNums);
% cluser size ,each cluster node num
% 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);
Node.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
Node.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);
Node.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.IsClusterHeads(i)=TENTATIVE_CH;
Node.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;
Node.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;
Node.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);
%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;
%
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
%
%
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
% change tent CH
%
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
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;
Node.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
if 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
end
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
end
fprintf(fid,'\r\n');
fclose(fid);
end