NodeNums = 1000; % the num of node
AreaR = 90000 ; % the area of simulate
layR=29;
d0=87; %能耗模型参数
d1=104;
Elec=50 * 10^(-9); % 能耗参数
Eamp=10*10^(-12); %
Eda=5*10^(-9); %能量聚合能耗
Bx=AreaR^(1/2)/2; % The Postion of Baseation
By=AreaR^(1/2)/2;
MaxInteral =150; % the leach simulate time
InitEn=1; % the init energy of all node
Kbit=200; % 发送广播信息量
KB=4000; %节点发送到簇头节点的单轮的数据量
dx=0; %选择具体比较点的坐标
dy=0;
a=0.5;
b=0.99;
c=0.5;
Ers=EnRec(Elec,KB);
Gathingcoefficient=0.8; %簇头节点对蔟内数据的数据融合系数
perdegree=pi/180*30;
MostE=0; %能量选择
maxR=0; %路由系数
Route=0;
tenNext=0;
RR=50;
NON_CH=0;% // non cluster head
TENTATIVE_CH=1; % // tentative cluster head
FINAL_CH=2;
avcount=0;
index=0;
t=0;
%求取当前分区的层数layNum以及坐标分区数sectorNum
if (mod(Bx*2^(1/2),layR)==0)
layNum=Bx*2^(1/2)/layR;
else
layNum=fix(Bx*2^(1/2)/layR)+1;
end
sectorNum=2*pi/perdegree;
% 初始化节点位置
Node.x=rand(1,NodeNums)*AreaR^(1/2); % the position of node
Node.y=rand(1,NodeNums)*AreaR^(1/2);
Node.IsClusterHead=linspace(0,0,NodeNums); % NON_CH,TENTATIVE_CH,FINAL_CH
Node.CH=linspace(0,0,NodeNums); % the Cluster head of node
Node.dis=((Node.x-Bx).^2+(Node.y-By).^2).^(1/2); % the distance between cluster head and node
Node.len=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
csize=zeros(layNum,sectorNum); % cluser size ,each cluster node num 这个需要修改
AvEn=zeros(1,MaxInteral);
Node.layplace=linspace(0,0,NodeNums);
Node.sectorplace=linspace(0,0,NodeNums);
Node.dis_head=linspace(0,0,NodeNums);
Node.data=linspace(0,0,NodeNums)+KB;
clusterhead=zeros(layNum,sectorNum);
Node.next=linspace(0,0,NodeNums);
Avcost=linspace(0,0,MaxInteral);
MinE=linspace(0,0,MaxInteral);
Node.enNode=linspace(0,0,NodeNums);
AliveNode=zeros(1,MaxInteral);
%将每个节点根据地理位置信息进行分区
for i=1:NodeNums
if mod((((Node.x(i)-Bx)^2+(Node.y(i)-By)^2)^(1/2)),layR)==0
Node.layplace(i)=((Node.x(i)-Bx)^2+(Node.y(i)-By)^2)^(1/2)/layR;
else
Node.layplace(i)=fix(((Node.x(i)-Bx)^2+(Node.y(i)-By)^2)^(1/2)/layR)+1;
end
angle=atan2((Node.y(i)-By),(Node.x(i)-Bx))+pi;
if mod(angle,perdegree)==0
Node.sectorplace(i)=angle/perdegree;
else
Node.sectorplace(i)=fix(angle/perdegree)+1;
end
end
%i=1:NodeNums;
%plot(Node.x,Node.y,'*');
[p,Conv]=sort(Node.layplace,'descend');
%%
%首先是进行选簇头
for r=1:MaxInteral
Node.IsClusterHead=linspace(0,0,NodeNums); % NON_CH,TENTATIVE_CH,FINAL_CH
Node.CH=linspace(0,0,NodeNums); % the Cluster head of node
csize=zeros(layNum,sectorNum); % cluser size ,each cluster node num 这个需要修改
AvEn=zeros(1,MaxInteral);
clusterhead=zeros(layNum,sectorNum);
Node.next=linspace(0,0,NodeNums);
sum1=sum(Node.EnNode);
Node.enNode=Node.EnNode;
for i=1:layNum
for j=1:sectorNum
MostE=0;
tenCH=0;
for m=1:NodeNums
if (Node.layplace(m)==i)&&(Node.sectorplace(m)==j)&&(MostE<Node.EnNode(m))
MostE=Node.EnNode(m);
tenCH=m;
end
end
if tenCH~=0
Node.IsClusterHead(tenCH)=1;
Node.CH(tenCH)=-1;
clusterhead(i,j)=tenCH;
end
for n=1:NodeNums
if Node.layplace(n)==i&&Node.sectorplace(n)==j&&Node.StateNode(n)==1&&n~=tenCH
csize(i,j)=csize(i,j)+1;
Node.CH(n)=tenCH;
Node.dis_head(n)=((Node.x(n)-Node.x(tenCH))^2+(Node.y(n)-Node.y(tenCH))^2)^(1/2);
end
end
end
end
% 对每个节点的要发送数据进行初始化
for i=1:NodeNums
if Node.StateNode(i)==1
if Node.IsClusterHead(i)==1
Node.data(i)=csize(Node.layplace(i),Node.sectorplace(i))*Gathingcoefficient*KB;
else
Node.data(i)=KB;
end
end
end
%路由过程及能耗过程
for j=1:NodeNums
i=Conv(j);
maxR=0;
tenNext=0;
if Node.StateNode(i)==1
if Node.IsClusterHead(i)==0
EntranPCH=Entr(KB,Node.dis_head(i))+EnRe(Kbit);
Node.EnNode(i)=Node.EnNode(i)-EntranPCH;
if Node.EnNode(i) <= 0
Node.StateNode(i)=0;
Node.EnNode(i)=0;
end
EnRecP=EnRe(KB)+Entr(Kbit,Node.dis(Node.CH(i)));
Node.EnNode(Node.CH(i))=Node.EnNode(Node.CH(i))-EnRecP;
if Node.EnNode(Node.CH(i)) <= 0
Node.StateNode(Node.CH(i))=0;
Node.EnNode(Node.CH(i))=0;
end
else
%若距离够近 直接传送至sink节点
if Node.dis(i)<=d1
EntranPCH=Entr(Node.data(i),Node.dis(i));
Node.EnNode(i)=Node.EnNode(i)-EntranPCH-Eda*csize(Node.layplace(i),Node.sectorplace(i))*Eda;
if Node.EnNode(i) <= 0
Node.StateNode(i)=0;
Node.EnNode(i)=0;
end
else
%若较远求节点的下一跳
for m=max(1,Node.layplace(i)-4):(Node.layplace(i)-2)
for q=(Node.sectorplace(i)-1):(Node.sectorplace(i)+1)
if q<=0
n=q+sectorNum;
elseif q>12
n=q-sectorNum;
else
n=q;
end
dx=disx(Node.x(i),Node.y(i),Bx,By,d0); %这点要求一下先
dy=disy(Node.x(i),Node.y(i),Bx,By,d0);
if clusterhead(m,n)~=0&&(Node.x(i)-Node.x(clusterhead(m,n)))^2+(Node.y(i)-Node.y(clusterhead(m,n))^2)<d0^2
if Node.StateNode(clusterhead(m,n))==1
Route=a*Node.EnNode(clusterhead(m,n))/InitEn+(1-a)*(1-((Node.x(clusterhead(m,n))-dx)^2+(Node.y(clusterhead(m,n))-dy)^2)^(1/2)/d0);
if maxR<Route
maxR=Route;
tenNext=clusterhead(m,n); %注意此值需要进行初始化
end
end
end
end
end
%若所选下一跳为空 则直接进行数据传输
if tenNext==0
EntranPCH=Entr(Node.data(i),Node.dis(i));
Node.EnNode(i)=Node.EnNode(i)-EntranPCH-Eda*csize(Node.layplace(i),Node.sectorplace(i))*Eda;
if Node.EnNode(i)<=0
Node.StateNode(i)=0;
Node.EnNode(i)=0;
end
%否则将数据发送至下一跳
else
Node.next(i)=tenNext;
Node.data(tenNext)=Node.data(tenNext)+Node.data(i);
EntranPCH=Entr(Node.data(i),((Node.x(i)-Node.x(tenNext))^2+(Node.y(i)-Node.y(tenNext))^2)^(1/2));
Node.EnNode(i)= Node.EnNode(i)-EntranPCH-Eda*csize(Node.layplace(i),Node.sectorplace(i))*Eda;
- 1
- 2
前往页