zoukankan      html  css  js  c++  java
  • leach-matlab

    http://www.oschina.net/code/snippet_860036_21044
    clear;%清除变量
    xm=100;%设置区域为100*100
    ym=100;
    sink.x=0.5*xm;%sink(汇聚)节点坐标
    sink.y=0.5*ym;
    n=100 %区域内的节点数目
    p=0.1;% 节点成为簇头的概率
    Eo=0.5;%节点初始能量
    ETX=50*0.000000001;%发射单位报文损耗能量
    ERX=50*0.000000001;%接收单位报文损耗能量
    Efs=10*0.000000000001;%自由空间能量
    Emp=0.0013*0.000000000001;%衰减空间能量
    EDA=5*0.000000001;%多路径衰减能量
    m=0.1;%成为高级节点比率
    a=1;%参数
    rmax=1500%最大的轮数
    do=sqrt(Efs/Emp); %计算do 通信半径
    figure(1);%输出图形
    for i=1:1:n %i为矩阵1到n,间距为1
    S(i).xd=rand(1,1)*xm;%1行1列矩阵
    XR(i)=S(i).xd;%随机生成的X轴
    S(i).yd=rand(1,1)*ym;
    YR(i)=S(i).yd;%随机生成的Y轴
    S(i).G=0;%
    S(i).type='N';%节点类型为普通
    temp_rnd0=i;%随机数值
    if (temp_rnd0>=m*n+1) %普通节点的随机选举
    S(i).E=Eo;%设置初始能量为E0
    S(i).ENERGY=0;%普通节点
    plot(S(i).xd,S(i).yd,'o');%输出节点,用o表示
    hold on;
    end
    if (temp_rnd0<m*n+1) %高级节点的随机选举
    S(i).E=Eo*(1+a)%设置初始能量为Eo*(1+a)
    S(i).ENERGY=1;%高级节点
    plot(S(i).xd,S(i).yd,'r:+');%输出节点,用+表示
    hold on;
    end
    end
     
    S(n+1).xd=sink.x;%汇聚节点X轴坐标
    S(n+1).yd=sink.y;%汇聚节点Y轴坐标
    plot(S(n+1).xd,S(n+1).yd,'x'); %输出汇聚节点,用x表示
     
    figure(1);
    countCHs=0;
    rcountCHs=0;
    cluster=1;
    countCHs;
    rcountCHs=rcountCHs+countCHs;
    flag_first_dead=0;%第一个节点死亡的标志变量
     
    for r=0:1:rmax%r为矩阵0到最大,间距为1
    r
    pnrm=( p/ (1+a*m) );%普通节点的选举概率
    padv= ( p*(1+a)/(1+a*m) ); %高级节点的选举概率
    if(mod(r, round(1/pnrm) )==0)%余数为0
    for i=1:1:n%i为矩阵1到n,间距为1
    S(i).G=0;%簇头数目
    S(i).cl=0;
    end
    end
     
    if(mod(r, round(1/padv) )==0)
    for i=1:1:n%i为矩阵1到n,间距为1
    if(S(i).ENERGY==1)
    S(i).G=0;%簇头数目
    S(i).cl=0;
    end
    end
    end
     
     
    hold off;
     
    dead=0;%节点死亡数
    dead_a=0;%高级节点死亡数
    dead_n=0;%普通节点死亡数
     
    packets_TO_BS=0;%传输sink节点报文数
    packets_TO_CH=0;%传输簇头的报文数
    PACKETS_TO_CH(r+1)=0;%每轮传送到簇头的报文数
    PACKETS_TO_BS(r+1)=0;%每轮传送到基站的报文数
     
    figure(4);
     
     
    for i=1:1:n %i为矩阵1到n,间距为1
    if (S(i).E<=0)%检查是否有节点死亡
    plot(S(i).xd,S(i).yd,'red .')%输出节点,用红.表示
    dead=dead+1;%节点死亡数+1
    if(S(i).ENERGY==1)%高级节点
    dead_a=dead_a+1;%高级节点死亡数+1
    end
    if(S(i).ENERGY==0)%普通节点
    dead_n=dead_n+1;%普通节点死亡数+1
    end
    hold on;
    end
    if S(i).E>0%节点能量大于0
    S(i).type='N';%节点类型为普通
    if (S(i).ENERGY==0)
    plot(S(i).xd,S(i).yd,'o');
    end
    if (S(i).ENERGY==1) %节点类型为高级
    plot(S(i).xd,S(i).yd,'+');
    end
    hold on;
    end
    end
    plot(S(n+1).xd,S(n+1).yd,'x');
     
     
    STATISTICS(r+1).DEAD=dead;%r轮后死亡节点数
    DEAD(r+1)=dead;%r轮后死亡节点数
    DEAD_N(r+1)=dead_n;%r轮后普通节点死亡数
    DEAD_A(r+1)=dead_a;%r轮后高级节点死亡数
     
    if (dead==1)%第一个节点死亡
    if(flag_first_dead==0)%第一个节点死亡周期
    first_dead=r%第一个节点死亡轮数
    flag_first_dead=1;%第一个死亡节点标志
    end
    end
     
     
     
     
     
     
    countCHs=0;%簇头的个数
    cluster=1;%簇头的数目
    for i=1:1:n%i为矩阵1到n,间距为1
    if(S(i).E>0)%节点剩余能量大于0
    temp_rand=rand;
    if ( (S(i).G)<=0)%没有簇头
     
    if( ( S(i).ENERGY==0 && ( temp_rand <= ( pnrm / ( 1 - pnrm * mod(r,round(1/pnrm)) )) ) ) )%普通节点的簇头选举
     
    countCHs=countCHs+1;%簇头数+1
    packets_TO_BS=packets_TO_BS+1;%传送到基站的计数器+1
    PACKETS_TO_BS(r+1)=packets_TO_BS;%每轮传送到基站的计数器=传送到基站的计数器
     
    S(i).type='C';%节点类型为簇头
    S(i).G=100;
    C(cluster).xd=S(i).xd;%簇头X轴坐标
    C(cluster).yd=S(i).yd;%簇头Y轴坐标
    plot(S(i).xd,S(i).yd,'k*');%输出节点,用黑*表示
     
    distance=sqrt( (S(i).xd-(S(n+1).xd) )^2 + (S(i).yd-(S(n+1).yd) )^2 );%计算距离
    C(cluster).distance=distance;%距离
    C(cluster).id=i;%簇头的节点编号
    X(cluster)=S(i).xd;%X轴坐标
    Y(cluster)=S(i).yd;%Y轴坐标
    cluster=cluster+1;%簇头总数+1
     
     
    distance;
    if (distance>do)%距离大于通信半径
    S(i).E=S(i).E- ( (ETX+EDA)*(4000) + Emp*4000*( distance*distance*distance*distance )); %能量消耗
    end
    if (distance<=do)%距离小于通信半径
    S(i).E=S(i).E- ( (ETX+EDA)*(4000) + Efs*4000*( distance * distance )); %能量消耗
    end
    end
     
     
    if( ( S(i).ENERGY==1 && ( temp_rand <= ( padv / ( 1 - padv * mod(r,round(1/padv)) )) ) ) )%高级节点簇头选举
     
    countCHs=countCHs+1;%簇头数+1
    packets_TO_BS=packets_TO_BS+1;%传送到基站的计数器+1
    PACKETS_TO_BS(r+1)=packets_TO_BS;%每轮传送到基站的计数器=传送到基站的计数器
     
    S(i).type='C';%节点类型为簇头
    S(i).G=100;
    C(cluster).xd=S(i).xd;%簇头X轴坐标
    C(cluster).yd=S(i).yd;%簇头Y轴坐标
    plot(S(i).xd,S(i).yd,'k*');%输出节点,用黑*表示
     
    distance=sqrt( (S(i).xd-(S(n+1).xd) )^2 + (S(i).yd-(S(n+1).yd) )^2 );%计算距离
    C(cluster).distance=distance;%距离
    C(cluster).id=i;%簇头的节点编号
    X(cluster)=S(i).xd;%X轴坐标
    Y(cluster)=S(i).yd;%Y轴坐标
    cluster=cluster+1;%簇头总数+1
     
     
    distance;
    if (distance>do)%距离大于通信半径
    S(i).E=S(i).E- ( (ETX+EDA)*(4000) + Emp*4000*( distance*distance*distance*distance )); %能量消耗
    end
    if (distance<=do)%距离小于通信半径
    S(i).E=S(i).E- ( (ETX+EDA)*(4000) + Efs*4000*( distance * distance )); %能量消耗
    end
    end
     
    end
    end
    end
     
     
     
    STATISTICS(r+1).CLUSTERHEADS=cluster-1;%r轮后簇头数
    CLUSTERHS(r+1)=cluster-1;%r轮后簇头数
     
     
    for i=1:1:n
    if ( S(i).type=='N' && S(i).E>0 )%选举正常节点的相关簇头
    if(cluster-1>=1)%簇头总数大于2个
    min_dis=sqrt( (S(i).xd-S(n+1).xd)^2 + (S(i).yd-S(n+1).yd)^2 );%两节点间最短距离
    min_dis_cluster=1;%距离最小的簇头数
    for c=1:1:cluster-1
    temp=min(min_dis,sqrt( (S(i).xd-C(c).xd)^2 + (S(i).yd-C(c).yd)^2 ) );
    if ( temp<min_dis )
    min_dis=temp;
    min_dis_cluster=c;
    end
    end
    min_dis;
    if (min_dis>do)
    S(i).E=S(i).E- ( ETX*(4000) + Emp*4000*( min_dis * min_dis * min_dis * min_dis));
    end
    if (min_dis<=do)
    S(i).E=S(i).E- ( ETX*(4000) + Efs*4000*( min_dis * min_dis));
    end
     
    if(min_dis>0)%能量消散
    S(C(min_dis_cluster).id).E = S(C(min_dis_cluster).id).E- ( (ERX + EDA)*4000 );
    PACKETS_TO_CH(r+1)=n-dead-cluster+1;
    end
    S(i).min_dis=min_dis;
    S(i).min_dis_cluster=min_dis_cluster;
    end
    end
    end
    hold on;
    countCHs;
    rcountCHs=rcountCHs+countCHs;
    STATISTICS(r+1).ENERGY=0;
    for i=1:1:n%当前节点数
    if S(i).E > 0%如果节点i剩余能量大于0
    STATISTICS(r+1).ENERGY = STATISTICS(r+1).ENERGY +S(i).E;%r轮后节点剩余能量加上节点i的剩余能量
    end
    end
     
     
    %[vx,vy]=voronoi(X,Y);
    %plot(X,Y,'r*',vx,vy,'b-');
    %hold on;
    % voronoi(X,Y);
    %axis([0 xm 0 ym]);
    hold off;
    end
    for i=2:rmax%当前节点数
    mylive(i) = n - STATISTICS(i).DEAD;
    myenergy(i) = STATISTICS(i).ENERGY;%剩余能量
    end
    mylive(1)=100;
    myenergy(1)=S(1).E+(n-1)*Eo;
    figure(2);%输出图形2
    hold on;%保持曲线
    plot(mylive,'color','r');%用红色输出存活节点数
    xlabel('周期数');
    ylabel('存活节点');
    title('存活节点图');
    figure(3);%输出图形3
    hold on;%保持曲线
    plot(myenergy,'color','r');%用红色输出剩余能量
    xlabel('周期数');
    ylabel('剩余能量节点');
    title('剩余能量图');
  • 相关阅读:
    机器学习系列(4) 线性回归
    MYSQL系列(5) 电商常用指标查询
    MYSQL系列(4) 关于时间函数的一些写法
    快速排序
    选择排序
    希尔排序
    直接插入排序
    冒泡排序
    Java修饰符大汇总
    字符串实现大数的相加
  • 原文地址:https://www.cnblogs.com/zkwarrior/p/5281811.html
Copyright © 2011-2022 走看看