1. Trang chủ
  2. » Công Nghệ Thông Tin

HEED protocol WSN giao thức định tuyến tối ưu năng lượng

16 113 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 16
Dung lượng 337,62 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 2

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); % 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 3

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

Trang 4

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);

Trang 5

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.CHprob(i)

Node.IsClusterHeads(i)=TENTATIVE_CH;

Trang 6

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;

Trang 7

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;

Trang 8

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);

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 13

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

Trang 14

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

Trang 15

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

Ngày đăng: 05/07/2018, 07:59

🧩 Sản phẩm bạn có thể quan tâm

w