Leach协议的实现

本片博客的目的是实现leach协议,体现其中的随机选取簇头,50轮次后的能量变化。
1、leach协议的要求;

  1. 随机生成一圆形无线传感器网络,其中汇聚节点Sink位于圆心位置,半径为R,节点个数为N,节点发射和感知半径为r。
    要求:
    (1)网络中节点位置参数保存,可多次使用;
    (2)根据参数,绘出网络拓扑结构图;
    (3)根据实验1中的网络拓扑及其参数,实现LEACH分簇协议。
    要求:在一轮数据收集中标绘出网络拓扑中的簇头节点;标绘出每个簇头的簇成员。

主函数

clear;
global N;%100个节点
N=50;
global R %大圆的半径
R=50;
global r;%小圆的
r=15;
global NUM;%在圆内的点
NUM=1;
global x;%记录所有的节点信息,第1,2维度是位置,%第三维表明该轮是不是簇头,第4维表示跟随他的节点有多少,第5维表示他的当前能量
x=zeros(N,5);
x(1:5,4)=0;
x(1:N,5)=5;%让所有能量出初始化为5
global y;
circle=3;  %进行50轮的随机循环
global TT;%令随机数的阈值为0.8,这样只有20%的节点是簇头
TT=0.8;
global min;  %表示距离当前节点最近的簇头
min=9999;
number=0;  %表示距离当前节点最近的簇头的编号
global p;
p=0.2;%---画出范围------%
alpha=0:pi/50:2*pi;%角度zhuan[0,2*pi]
%R=2;%半径
x_range=R*cos(alpha);
y_range=R*sin(alpha);
plot(x_range,y_range,'-')
hold on
%---画出sink------%
alpha=0:pi/50:2*pi;%角度zhuan[0,2*pi]R1=1.5;                %半径 x_sink=R1*cos(alpha); y_sink=R1*sin(alpha); plot(x_sink,y_sink,'-') text(0,3,'sink')fill(x_sink,y_sink,'r');axis equalhold on%-----这个循环决定随机的N个点-----%for i=1:Nx(NUM,1)=(rand(1)-0.5)*100;x(NUM,2)=(rand(1)-0.5)*100;if (x(NUM,1)^2+x(NUM,2)^2)>2500continue;endalpha=0:pi/50:2*pi;%角度zhuan[0,2*pi]R2=0.5;                %半径 x2=x(NUM,1)+R2*cos(alpha); y2=x(NUM,2)+R2*sin(alpha); plot(x2,y2,'k-') fill(x2,y2,'k');x3=x(NUM,1)+r*cos(alpha); y3=x(NUM,2)+r*sin(alpha); plot(x3,y3,'color',[0.8 0.8 0.8],'LineWidth',0.1) %画出每个节点的范围NUM=NUM+1;axis equalendfor i=1:NUMfor j=i+1:NUMif dis(x(i,1),x(i,2),x(j,1),x(j,2))<r  %使用自己写的dis函数求距离line([x(i,1),x(j,1)],[x(i,2),x(j,2)]);endend
endfor i=1:NUMy(i).en=5;%初始能量y(i).num=0;%附属节点
endpause(2);
%--------- 实验二------%%------然后一下为实现选取簇头节点------%
hold on
for k=1:circleif(k~=1)figure('Name',"第"+k+"轮");init();endTT=p/(1-p*mod(k,1/p));t=zeros(NUM,1);for i=1:NUMt(i,1)=rand(1);if(t(i,1)<TT)    %该节点是簇头x(i,3)=1;alpha=0:pi/50:2*pi;%角度zhuan[0,2*pi]R2=1;                %半径 x4=x(i,1)+R2*cos(alpha); y4=x(i,2)+R2*sin(alpha); hold onplot(x4,y4,'y-') fill(x4,y4,'y');endendfor i=1:NUMmin=9999;if (x(i,3)==0)%如果这个不是簇头for j=1:NUM  %遍历最近的节点if(x(j,3)==1)distance=dis(x(i,1),x(i,2),x(j,1),x(j,2));if(distance<min)min=distance;number=j;endend   endy(number).num=y(number).num+1;pause(0.1);line([x(i,1),x(number,1)],[x(i,2),x(number,2)],'Color','red','LineWidth',0.5);endendpause(1);%---复原---%
end

init()函数

function []=init()
clear;
global N;%100个节点
global R %大圆的半径
global r;%小圆的
global NUM;%在圆内的
global x;%记录所有的节点信息
global min;  %表示距离当前节点最近的簇头
global p;%---画出范围------%
alpha=0:pi/50:2*pi;%角度zhuan[0,2*pi]
%R=2;%半径
x_range=R*cos(alpha);
y_range=R*sin(alpha);
plot(x_range,y_range,'-')
hold on%---画出sink------%alpha=0:pi/50:2*pi;%角度zhuan[0,2*pi]R1=1.5;                %半径 x_sink=R1*cos(alpha); y_sink=R1*sin(alpha); plot(x_sink,y_sink,'-') text(0,3,'sink')fill(x_sink,y_sink,'r');axis equalhold on%-----这个循环决定随机的N个点-----%for i=1:NUMalpha=0:pi/50:2*pi;%角度zhuan[0,2*pi]R2=0.5;                %半径 x2=x(i,1)+R2*cos(alpha); y2=x(i,2)+R2*sin(alpha); plot(x2,y2,'k-') fill(x2,y2,'k');x3=x(i,1)+r*cos(alpha); y3=x(i,2)+r*sin(alpha); plot(x3,y3,'color',[0.8 0.8 0.8],'LineWidth',0.1) %画出每个节点的范围axis equalendfor i=1:NUMfor j=i+1:NUMif dis(x(i,1),x(i,2),x(j,1),x(j,2))<r  %使用自己写的dis函数求距离line([x(i,1),x(j,1)],[x(i,2),x(j,2)]);endend
endpause(2);end

dis()函数

function d=dis(x1,y1,x2,y2)d=sqrt((x2-x1)^2+(y2-y1)^2);
end

**2. Leach中的能力情况 **
根据实验2中的分簇,统计LEACH协议允许的结果,假设数据包的大小为L,能量消耗模型为:

要求:在一轮数据收集中,每个节点都产生一个数据包,并汇聚到Sink节点
(1)统计每个节点发送和接收的数据包个数,并直观显示出来;
(2)统计每个节点能量消耗,并给出三维能量消耗图

clear;
global N;%100个节点
N=50;
global R %大圆的半径
R=50;
global r;%小圆的
r=15;
global NUM;%在圆内的点
NUM=1;
global x;%记录所有的节点信息,第1,2维度是位置,第三维表明该轮是不是簇头,第4维表示跟随他的节点有多少,第5维表示他的当前能量
x=zeros(N,5);
x(1:5,4)=0;
x(1:N,5)=5;%让所有能量出初始化为5
global y;
circle=50;  %进行50轮的随机循环
global TT;%令随机数的阈值为0.8,这样只有20%的节点是簇头
TT=0.8;
global min;  %表示距离当前节点最近的簇头
min=9999;
number=0;  %表示距离当前节点最近的簇头的编号
global p;
p=0.2;
d0=5;%通信耗能范围%-----这个循环决定随机的N个点-----%for i=1:Nx(NUM,1)=(rand(1)-0.5)*100;x(NUM,2)=(rand(1)-0.5)*100;if (x(NUM,1)^2+x(NUM,2)^2)>2500continue;endalpha=0:pi/50:2*pi;%角度zhuan[0,2*pi]R2=0.5;                %半径 x2=x(NUM,1)+R2*cos(alpha); y2=x(NUM,2)+R2*sin(alpha); x3=x(NUM,1)+r*cos(alpha); y3=x(NUM,2)+r*sin(alpha); NUM=NUM+1;endfor i=1:NUMy(i).en=zeros(circle,2);%初始能量y(i).num=0;%附属节点y(i).e=5;for j=1:circley(i).en(j,1)=j;y(i).en(1,2)=5;end
end                %y表示能量,其en变量决定了第几轮的能量send_number=zeros(NUM,1);
receive_number=zeros(NUM,1);
%--------- 实验二------%%------然后一下为实现选取簇头节点------%
for k=1:circleTT=p/(1-p*mod(k,1/p));t=zeros(NUM,1);for i=1:NUMt(i,1)=rand(1);if(t(i,1)<TT)    %该节点是簇头x(i,3)=1;endendfor i=1:NUMmin=9999;if (x(i,3)==0)%如果这个不是簇头for j=1:NUM  %遍历最近的节点if(x(j,3)==1)distance=dis(x(i,1),x(i,2),x(j,1),x(j,2));if(distance<min)min=distance;number=j;endend   endy(number).num=y(number).num+1;%---不同距离的能量消耗%if(distance<d0)y(i).e= y(i).e-(distance/1000)^2;%能量减y(i).en(k,2)= y(i).e;y(number).e= y(number).e-(distance/1000)^2;y(number).en(k,2)= y(number).e;send_number(i,1)=send_number(i,1)+1;send_number(number,1)=send_number(number,1)+1;receive_number(number,1)=receive_number(number,1)+1;endif(distance>=d0)y(i).e= y(i).e-(distance/1000);y(i).en(k,2)= y(i).e;y(number).e= y(number).e-(distance/1000);y(number).en(k,2)= y(number).e;send_number(i,1)=send_number(i,1)+1;send_number(number,1)=send_number(number,1)+1;receive_number(number,1)=receive_number(number,1)+1;endendif (x(i,3)==1)%如果这个是簇头distance=dis(x(i,1),x(i,2),0,0);%---不同距离的能量消耗%if(distance<d0)y(i).e= y(i).e-(distance/1000)^2;y(i).en(k,2)= y(i).e;send_number(i,1)=send_number(i,1)+1;endif(distance>=d0)y(i).e= y(i).e-(distance/1000);y(i).en(k,2)= y(i).e;send_number(i,1)=send_number(i,1)+1;endendend%--------------下面开始讨论能量的影响---------%
%     for i=1:NUM
%         if (x(i,3)==1)%如果这个是簇头
%             y(i).en(circle,2)= y(i).en(circle-1,2)-0.1*y(number).num;
%         end
%     end
%     y(number).num=0;
%     %---复原---%
endfor i=1:NUMin(i,1)=i;
end
for i=1:circleout(i,1)=i;
end
for i=1:NUMout1(i,1)=i;sss(i)=y(i).en(circle,2)
endplot(in,send_number,'ko-')
axis([0 NUM+2 0 80])
xlabel('节点的序号')
ylabel('节点发送的数据包数量')figure("NAME","接受的图")
plot(in,receive_number,'ko-')
axis([0 NUM+2 0 30])
xlabel('节点的序号')
ylabel('节点接受的数据包数量')figure("NAME","能量变化图")
plot(out1,sss,'ko-')
axis([0 NUM+2 0 5])
xlabel('节点的序号')
ylabel('节点接受的数据包数量')figure("NAME","能量随轮数变化图")
plot(out,y(1).en(1:circle,2),'ko-',out,y(2).en(1:circle,2),'ro-',out,y(3).en(1:circle,2),'ko-',out,y(1).en(1:circle,2),'bo-')
axis([0 NUM+2 0 5])
xlabel('轮次')
ylabel('节点接受的数据包数量')

Leach协议的实现相关推荐

  1. Ubuntu10.04中间Leach协议一键安装

    半天后,尝试,引用网络上的零散资源,成品博客Leach协议ubuntu10.04在安装(12.04也可以在右侧安装,然而,实施效果的不,求解决~~),并制作了补丁. 一个关键的安装步骤如下面: 1.在 ...

  2. 【LEACH协议】粒子群算法改进LEACH协议【含Matlab源码 2052期】

    ⛄一. 简介 1 引言 WSN 由能感知外部环境的传感器节点以自组网的形式构成,是一种分布式无线传感器网络.随着科技的进步和现代生活的需求,由于 WSN 的远程控制.信息即时传播以及低功耗等众多优点, ...

  3. 【LEACH协议】基于matlab无线传感器网络LEACH与DEEC协议【含Matlab源码 2187期】

    ⛄一. 简介 1 引言 WSN 由能感知外部环境的传感器节点以自组网的形式构成,是一种分布式无线传感器网络.随着科技的进步和现代生活的需求,由于 WSN 的远程控制.信息即时传播以及低功耗等众多优点, ...

  4. 【Leach协议】基于matlab leach+leach-c+TSI-Leach三种协议对比【含Matlab源码 2512期】

    ⛄一. 简介 1 引言 WSN 由能感知外部环境的传感器节点以自组网的形式构成,是一种分布式无线传感器网络.随着科技的进步和现代生活的需求,由于 WSN 的远程控制.信息即时传播以及低功耗等众多优点, ...

  5. Leach协议学习(4)——Leach协议改进

    转]Leach协议学习(4)--Leach协议改进 收藏 转自:http://hi.baidu.com/jerry_916/blog/item/cce9012b6d206e92033bf680.htm ...

  6. 【LEACH协议】基于matlab最佳簇半径的无线传感器网络分簇路由算法【含Matlab源码 2087期】

    ⛄一. 数据融合的LEACH协议简介 1 基于自适应数据融合的LEACH协议 1.1 基本定义和概念 无线传感器网络中的一个簇可以用一个无向加权全连通图G=(V,E)来表示,V是簇中所有传感器节点的集 ...

  7. LEACH协议python仿真及分析改进

    LEACH协议python仿真及分析改进 wf 1.修改及测试代码 1.1 LEACH路由场景文件的生成 绿色小圆圈代表站点,随机生成100个 1.2 SINK结点 蓝色代表SINK结点,中间位置 1 ...

  8. 基于MATLAB的leach协议能量检测算法仿真

    目录 1.算法概述 2.仿真效果 3.MATLAB仿真源码 1.算法概述 LEACH协议,全称是"低功耗自适应集簇分层型协议" (Low Energy Adaptive Clust ...

  9. leach协议matlab仿真代码

    http://www.ilovematlab.cn/thread-177006-1-1.html LEACH協議 clear;%清除內存變量 xm=100;%x軸範圍 ym=100;%y軸範圍 sin ...

  10. leach协议c++代码_入门教程4:教你STM32F407标准库移植机智云代码(控制LED灯)

    我们知道,使用机智云自助开发平台会根据产品定义的数据点生成对应产品的设备端代码即MCU代码包.自动生成的代码实现了机智云通信协议的解析与封包.传感器数据与通信数据的转换逻辑,并封装成了简单的API,且 ...

最新文章

  1. dojo/dom源码学习
  2. creator cc.Class跨脚本访问(小白笔记)
  3. 在.NET2.0中如何更简单的使用委托将方法加载到事件中去
  4. unity3d读取android文本文件,职场小白求助Unity项目Android端读取CSV文本问题
  5. python自动化接口测试中的cookies怎么实现_python接口自动化测试--requests cookies处理...
  6. php连接mssql数据库的几种方式
  7. B 站崩了,受害程序员聊聊
  8. 新手入门HTML5开发,你必须先搞懂这6个问题
  9. TCP协议-socket通信
  10. 深入解析WINDOWS操作系统
  11. 伊丽莎白 里昂妮丝资源_伊丽莎白·布朗(Elizabeth Brown)–湾区最具影响力的女性之一
  12. 【你好,windows】Windows 10 20H2 19042.630专业工作站纯净版2020.12.1
  13. 一级域名怎么申请二级域名
  14. 程序员必备的 11 大Intellij插件
  15. 4核8G云服务器4c8g或4h8g指的是什么?
  16. 二段式提交协议和三段式提交协议(2PC和3PC)
  17. linux安装了wine不显示中文,[转]wine设置中文字体(解决中文字体丢失或白方块)
  18. VMware Workstation 快照与克隆的使用
  19. 视频会议常用术语——转自华为TE40帮助文档
  20. 如何判断页面是通过PC端还是移动端访问?

热门文章

  1. gromacs 安装_Gromacs 4.0.3、4.5.5版安装方法
  2. qt水波进度控件设计
  3. 疫情之后,各地智慧灯杆政策与项目发布情况汇总
  4. 【什么是IaaS,PaaS,SaaS? DaaS又是什么?】
  5. Uploadifive上传
  6. Java中占位符的实战运用
  7. pmp项目管理师证书有用么?
  8. 解锁图案-九宫格有多少种组合?安全吗?用程序来解答
  9. cocos2d-iPhone 点滴
  10. cannot access memory