找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1151|回复: 0
打印 上一主题 下一主题
收起左侧

leach仿真改进代码

[复制链接]
跳转到指定楼层
楼主
ID:752513 发表于 2020-5-16 10:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
%只考虑簇首能量和簇首多跳
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])


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表