%只考虑簇首能量和簇首多跳
clear;
r=75;
w1=0.3,w2=0.1,w3=0.6
xm = 100;
ym = 100;
sink.x=50;
sink.y=175;
n=100
T=zeros(1,n);
p=0.05;
packetLength =4000;%数据包长度
ctrPacketLength = 100;%控制包长度
Eo = 1;
ETX=50*0.000000001;
ERX=50*0.000000001;
Efs=10*0.000000000001;
Emp=0.0013*0.000000000001;
EDA=5*0.000000001;
INFINITY = 999999999999999;
rmax=6000
do=sqrt(Efs/Emp);
S(n+1).xd=sink.x;
S(n+1).yd=sink.y;
for i=1:1:n
S(i).xd=rand(1,1)*xm;%坐标
XR(i)=S(i).xd;
S(i).yd=rand(1,1)*ym;
YR(i)=S(i).yd;
S(i).G=0;
S(i).type='N';%普通节点
S(i).E=Eo;
S(i).ENERGY=0;
S(i).d=sqrt((S(i).xd-(S(n+1).xd))^2 + (S(i).yd-(S(n+1).yd))^2);
for j=1:1:10
if (j-1)*r<S(i).d<j*r
S(i).TABLEID=j;
end
end
end
countCHs=0;
rcountCHs=0;
cluster=1;
countCHs;
rcountCHs=rcountCHs+countCHs;
flag_first_dead=0;
for r=0:1:rmax %主循环,每次1轮
r
if(mod(r, round(1/p))==0)
for i=1:1:n
S(i).G=0;
S(i).cl=0;
end
end
dead=0;
packets_TO_BS=0;
packets_TO_CH=0;
PACKETS_TO_CH(r+1)=0;
PACKETS_TO_BS(r+1)=0;
for i=1:1:n
if (S(i).E<=0)
dead=dead+1;
end
if (S(i).E>0)
S(i).type='N';
end
end
if (dead == n)%节点全部死亡退出循环
break;
end
STATISTICS(r+1).DEAD=dead;
DEAD(r+1)=dead;
if (dead==1)
if(flag_first_dead==0)
first_dead=r
flag_first_dead=1;
end
end
for g=1:1:5
xiao(g)=INFINITY;
for i=1:1:n
if(S(i).E>0)
distance=sqrt((S(i).xd-(S(n+1).xd))^2 + (S(i).yd-(S(n+1).yd))^2);%到sink的距离
W(i)=w1*(Eo-S(i).E)+w2*T(i)+w3*distance;
if ((S(i).G)<=0) %如果该节点在候选集合中
if W(i)<xiao(g)
xiao(g)=W(i);
C(g).id = i;
W(i)=INFINITY;
S(i).type = 'C';
S(i).G=1;
C(g).xd = S(i).xd;
C(g).yd = S(i).yd;
C(g).distance = distance;
C(g).id = i;
X(g)=S(i).xd;
Y(g)=S(i).yd;
distanceBroad = sqrt(xm*xm+ym*ym);
if (distanceBroad >=do)
S(i).E = S(i).E-(ETX*ctrPacketLength + Emp*ctrPacketLength*(distanceBroad*distanceBroad*distanceBroad*distanceBroad));%广播自成为簇头
else
S(i).E = S(i).E-(ETX*ctrPacketLength + Efs*ctrPacketLength*(distanceBroad*distanceBroad));
end
packets_TO_BS = packets_TO_BS+1;
PACKETS_TO_BS(r+1) = packets_TO_BS;
end
end
end
i=i+1;
end
T(C(g).id)=T(C(g).id)+1;
end
for g = 1:1:cluster-1
if S(C(g).id).TABLEID~=1
for k=S(C(g).id).TABLEID:(-1):1
for j=1:1:cluster-1
if S(C(g).id).TABLEID==k-1
S(C(g).id).E=S(C(g).id).E-(ERX + EDA)*packetLength;
end
end
end
else
S(i).E = S(i).E-((ETX+EDA)*packetLength+ Efs*packetLength*(distance*distance));
end
end
for i=1:1:n
if (S(i).type=='N' &S(i).E>0) %普通节点
min_dis=INFINITY;
min_dis_cluster = 1;
for g = 1:1:5 %簇头数量一共是cluster-1
temp = sqrt((S(i).xd - C(g).xd)^2 + (S(i).yd - C(g).yd)^2);
if (temp<min_dis)
min_dis = temp;
min_dis_cluster = g;
end
S(i).E = S(i).E - ETX * ctrPacketLength;
end
if (min_dis > do)
S(i).E = S(i).E - (ETX*(ctrPacketLength) + Emp * ctrPacketLength*( min_dis * min_dis * min_dis * min_dis)); %向簇头发送加入控制消息
S(i).E = S(i).E - (ETX*(packetLength) + Emp*packetLength*( min_dis * min_dis * min_dis * min_dis)); %向簇头数据包
else
S(i).E = S(i).E -(ETX*(ctrPacketLength) + Efs*ctrPacketLength*( min_dis * min_dis)); %向簇头发送加入控制消息
S(i).E = S(i).E -(ETX*(packetLength) + Efs*packetLength*( min_dis * min_dis)); %向簇头数据包
end
S(i).E = S(i).E - ETX*(ctrPacketLength); %接收簇头确认加入控制消息
if(min_dis>0)
S(C(min_dis_cluster).id).E = S(C(min_dis_cluster).id).E - ((ERX + EDA)*packetLength ); %接受簇成员发来的数据包
S(C(min_dis_cluster).id).E = S(C(min_dis_cluster).id).E - ERX *ctrPacketLength ; %接收加入消息
if (min_dis > do)%簇头向簇成员发送确认加入的消息
S(C(min_dis_cluster).id).E = S(C(min_dis_cluster).id).E - ( ETX*(ctrPacketLength) + Emp * ctrPacketLength*( min_dis * min_dis * min_dis * min_dis));
else
S(C(min_dis_cluster).id).E = S(C(min_dis_cluster).id).E - ( ETX*(ctrPacketLength) + Efs * ctrPacketLength*( min_dis * min_dis));
end
PACKETS_TO_CH(r+1) = n - dead - 5 + 1; %所有的非死亡的普通节点都发送数据包
end
S(i).min_dis = min_dis;
S(i).min_dis_cluster = min_dis_cluster;
end
end
countCHs;
rcountCHs = rcountCHs + countCHs;
end
x=1:1:r;
y=1:1:r;
%z=1:1:r;
for i=1:1:r;
x(i)=i;
y(i) = n - STATISTICS(i).DEAD;
%z(i)=CLUSTERHS(i);
end
%plot(x,y,'r',x,z,'b');
plot(x,y);
hold on;
axis([0,6000,0,100])
|