一、前言

1、在给定WSN的节点数目(100)前提下,节点随机分布,按照LEACH算法,实现每一轮对WSN的分簇。记录前K轮(k=10)时,网络的分簇情况,即每个节点的角色(簇头或簇成员)。标记节点之间的关系,标记其所属的簇头。

2、在1的基础上,增加能量有效性控制:给定的所有节点具有相同的能量,考察第一个节点能量耗尽出现在第几轮。节点的能量消耗仅考虑关键的几次通信过程,其他能量消耗不计。通信过程能量消耗规则如下:

Setup:簇成元:每次收到候选簇头信息-1,每个候选簇头仅被收集一次;通知簇头成为其成员,发送信息-2。候选簇头:被簇成元接收信息,即发送信息,能量-2;被通知成为簇头,接收信息能量-1。

Steady:每个簇成员每轮向簇头发送10次数据,每次成员能量-2,簇头能量-1。

二、目的

(1)在固定节点个数的前提下,仿真LEACH算法的分簇过程。

(2)在上述节点个数和分簇算法的前提下,计算节点的能量消耗,判断能量消耗到0的节点出现在第几轮。

三、方法描述

(1)LEACH分簇

簇头选举初始阶段,每个节点根据所建议网络簇头的百分比(事先确定)和节点已经成为簇头的次数来确定自己是否当选为簇头。每个节点产生一个0-1的随机数字,如果该数字小于阈值,节点成为当前轮的簇头。阈值

其中,P为预期的簇头百分比,r为当前轮数,G是最近1/p轮里没有成为簇头的节点的集合。

首先确定传感器网络中的节点个数为100个,并对所有节点初始化其三个属性,分别有type(节点类型),selected(是否当选过簇头)和temp_rand(随机数)。设定簇头产生概率p=0.08。

算法步骤如下:

Step1:随机生成100个节点位置,并赋值随机数temp_rand,设置type和selected为’N’。

Step2:将所有selected为’N’的节点随机值与做比较,若temp_rand小于等于则转向Step3,否则转向Step4。

Step3:表明节点当选为簇头节点,将type赋值’C’, selected赋值’O’。

Step4:表明节点为普通节点,将type扔赋值’N’, selected不改变赋值。

Step5:遍历所有节点,若节点type为’C’,将节点在图上标记’*’,并标上节点数目。否则将节点在图上标记为’o’,同时标记上节点数目。

Step6:如果节点为普通节点,则计算其与所有簇头的欧式距离,形成距离矩阵。

Step7:利用min函数,找到与普通节点相距最近的簇头,并将其相连接。

Step8:一轮分簇结束,返回Step1开始下一轮分簇过程。

所以在试验中通过计算每个普通节点到所有簇头的距离,并将该普通节点与相距最近的簇头节点相连,并将簇头节点的selected属性标记,保证当过簇头的节点在之后的分簇过程中不会再当选为簇头节点。在10轮的分簇试验中选取4张分簇网络图,具体分簇情况分别如下:

(2)节点能量消耗

试验中通过对能量消耗规律的分析可以得出:假设某轮分簇中第i个簇头的簇成员有a个,所以在这一轮中的通信过程中簇头消耗的能量为2+11*a,簇成员消耗的能量为22。所以增加节点的一个属性为S(i).power,从而到达能量消耗监测的目的。设置标志位,当发现第一个节点能量耗尽情况出现时,则结束程序,并用黑色标记。而已做过簇头的节点用红色标记。

在一次实验中,第一次能量耗尽出现在第5轮。前5轮的图像如下:

三、结论

在本次实验中首先通过对LEACH算法的分析研究,学习了其进行传感器节点网络分簇的步骤,同时在P=0.08和节点数目为100的前提下通过MATLAB仿真在节点数目不变的情况下10轮的分簇结果。在能量的消耗试验中,首先通过对簇头以及簇成员在一轮分簇通信过程中的能量消耗规律统计,简化了实验步骤。通过仿真,第一个节点能量耗尽的情况出现在第5轮。

四、程序代码

(1)Leach分簇:

close all

clear all;

clc;

pm=100; %概率范围

xm=100; %x轴范围

ym=100; %y轴范围

line=10; %连线距离初始值

sink.x=0.5*xm; %基站x轴 50sink.y=0.5*ym; %基站y轴 50n=100;

p=0.08;for i=1:1:n %随机产生100个点

S(i).xd=rand(1,1)*xm;

S(i).yd=rand(1,1)*ym;

S(i).temp_rand=rand;

S(i).type='N'; %进行选举簇头前先将所有节点设为普通节点

S(i).selected='N';

S(i).power=300;

hold on;

end

num11=0;

num12=0;

flag=1;while(flag)for r=1:1:10figure(r);for i=1:1:n %随机产生100个点

S(i).temp_rand=rand;

endfor i=1:1:nif S(i).selected=='N'

%if S(i).type=='N' %只对普通节点进行选举,即已经当选簇头的节点不进行再选举if ( S(i).temp_rand<=(p/(1-p*mod(r,round(1/p)))))

S(i).type='C'; %节点类型为蔟头

S(i).selected='O';

plot(S(i).xd,S(i).yd,'*');

text(S(i).xd,S(i).yd,num2str(i));

num11=num11+1;else S(i).type='N'; %节点类型为普通

plot(S(i).xd,S(i).yd,'o');

text(S(i).xd,S(i).yd,num2str(i));

num12=num12+1;

end

endif S(i).type=='C'plot(S(i).xd,S(i).yd,'*'); %蔟头节点以*标记

text(S(i).xd,S(i).yd,num2str(i));elseplot(S(i).xd,S(i).yd,'o'); %普通节点以o标记

text(S(i).xd,S(i).yd,num2str(i));

end

hold on;

end%判断最近的簇头结点,如何去判断,采用距离矩阵

yy=zeros(n);for a=1:1:nif S(a).type=='N'

for b=1:1:nif S(b).type=='C'length(a,b)=sqrt((S(a).xd-S(b).xd)^2+(S(a).yd-S(b).yd)^2); %簇头与每个普通节点的距离elselength(a,b)=10000;

end

end

[val,b]=min(length(a,:));

plot([S(b).xd;S(a).xd],[S(b).yd;S(a).yd])%将节点与簇头连起来,即加入簇头集合

yy(a,b)=1;

hold onelselength(a,:)=10000;

end

endfor i=1:1:nif S(i).type=='C'number=sum(yy(:,i))

S(i).power=S(i).power-(2+11*number);elseS(i).power=S(i).power-22;

end

endfor i=1:1:n

S(i).type='N';

end

endfor i=1:1:nif (S(i).power)<0text(S(i).xd,S(i).yd,num2str(i));

flag=0;

end

endif flag==0

breakend

end

(2)能量

clear

clc

close all

xm=100;

ym=100;

line=10;

sink.x=0.5*xm;

sink.y=0.5*ym;

n=100;

p=0.05;

send_dissipation=2;

receive_dissipation=1;for i=1:1:n

S(i).xd=rand(1,1)*xm;

S(i).yd=rand(1,1)*ym;

S(i).temp_rand=rand;

S(i).energy=500;

S(i).signal='L';

S(i).type='N';

S(i).selected='N';

hold on;

end

r=1;

flag=1;while(flag)for i=1:nif S(i).selected=='N'&(S(i).temp_rand<=(p/(1-p*mod(r,round(1/p)))))&S(i).signal=='L'flag=1;break;

endif i==nif S(i).selected=='Y'|(S(i).temp_rand>=(p/(1-p*mod(r,round(1/p)))))|S(i).signal=='D'flag=0;

end

end

endif flag==0

break;

end

figure(r);for i=1:nif S(i).signal=='L'

if S(i).selected=='N'

if ( S(i).temp_rand<=(p/(1-p*mod(r,round(1/p)))))

S(i).type='C';

S(i).selected='Y';

S(i).energy=S(i).energy-send_dissipation;

plot(S(i).xd,S(i).yd,'r*');

text(S(i).xd,S(i).yd,num2str(i));elseS(i).type='N';

plot(S(i).xd,S(i).yd,'bo');

text(S(i).xd,S(i).yd,num2str(i));

endelseplot(S(i).xd,S(i).yd,'r.','markersize',20);

text(S(i).xd,S(i).yd,num2str(i));

end

hold on;

end

end

distance=zeros(1,100);

num_cluster=zeros(1,100);for i=1:100distance(1,i)=100000;

endfor a=1:1:nif S(a).signal=='L'&S(a).type=='N'

for b=1:1:nif S(b).signal=='L'&S(b).type=='C'distance(1,b)=sqrt((S(a).xd-S(b).xd)^2+(S(a).yd-S(b).yd)^2);

S(a).energy=S(a).energy-receive_dissipation;

end

end

min=100000;for i=1:nif distance(1,i)

min=distance(1,i);

nearest_cluster=i;

end

endif min~=100000;

plot([S(nearest_cluster).xd;S(a).xd],[S(nearest_cluster).yd;S(a).yd],'b');

hold on;

S(a).energy=S(a).energy-send_dissipation;

S(nearest_cluster).energy=S(nearest_cluster).energy-receive_dissipation;

S(a).energy=S(a).energy-10*send_dissipation;

S(nearest_cluster).energy=S(nearest_cluster).energy-10*receive_dissipation;

end

end

end

energy=zeros(1,100);

energy1=zeros(1,100);for i=1:n

energy(1,i)=S(i).energy;

end

energy1=sort(energy);for i=1:nif S(i).energy<=0S(i).signal='D';

plot(S(i).xd,S(i).yd,'k.','markersize',20);

text(S(i).xd,S(i).yd,num2str(i));

hold on;

end

endfor i=1:n

S(i).type='N';if S(i).selected=='N'S(i).temp_rand=rand;

end

end

r=r+1;

end

君子有三畏:畏天命,畏大人,畏圣人之言。小人不知天命而不畏也,狎大人,侮圣人之言。

转载需说明出处,笔者总结之前的知识,与大家分享,有问题的可以留给我哦~

leach算法的实现过程_LEACH分簇算法实现和能量控制算法实现相关推荐

  1. LEACH分簇算法实现和能量控制算法实现

    一.前言 1.在给定WSN的节点数目(100)前提下,节点随机分布,按照LEACH算法,实现每一轮对WSN的分簇.记录前K轮(k=10)时,网络的分簇情况,即每个节点的角色(簇头或簇成员).标记节点之 ...

  2. 几种无线传感器分簇算法

    现在跟着导师做无线传感器网络方向,由于刚开始接触这一方面,打算记录一下自己的学习过程,看书过程中做了一些笔记,如果哪里有错误或者描述不准确的地方欢迎大家在评论区批评指正,大家一起学习进步~~~ 1.l ...

  3. 讨论帖:比特币中的SHA256算法的实现与标准的SHA256算法实现是否相同?

    近日阅读了比特币源码中与哈希相关的部分,对于其中一些细节还是有不清晰的地方. 于是我写了一个小的测试demo:sha256_test,代码下载 分别测试了三个版本对于SHA-256算法的实现: Bit ...

  4. 商用密码算法的实现(常见的密码算法库)

    1.OpenSSL OpenSSL 是一个开源的密码库,支持许多密码算法和协议的实现,包括 AES.DES.RSA.Diffie-Hellman 等.它还提供了 SSL 和 TLS 协议的实现,用于保 ...

  5. OpenCV中图像旋转(warpAffine)算法的实现过程

    在OpenCV中,目前并没有现成的函数直接用来实现图像旋转,它是用仿射变换函数cv::warpAffine来实现的,此函数目前支持4种插值算法,最近邻.双线性.双三次.兰索斯插值,如果传进去的参数为基 ...

  6. WSN连通性模拟、WSN覆盖率模拟、WSN分簇模拟、WSN能量损耗模拟

    资源下载地址:https://download.csdn.net/download/sheziqiong/86778465 资源下载地址:https://download.csdn.net/downl ...

  7. 倒排索引:ES倒排索引底层原理及FST算法的实现过程

    文章目录 引言 1.倒排索引核心原理 2.倒排索引的存储结构 2.1 倒排表(Posting List) 2.2 词项字典(Term Dictionary) 2.3 ​词项索引(Term Index) ...

  8. FDK算法的实现过程

    FDK算法实现起来,相对简单(只需要对扇束重建算法稍微做修改就可以),但是由于一些疏忽出现了一个难以发现的错误,导致我卡在这个地方很久.这个错误就是滤波的方向问题,当时我看书上说对其进行按列进行滤波, ...

  9. leach分簇功能实现matlab,一种改进的LEACH分簇层次路由算法的制作方法

    本发明涉及无线传感器网络领域,属于leach路由通信 技术领域: . 背景技术: :物联网技术飞速发展,无线传感器网络(wirelesssensornetworks,wsn)也逐渐成为互联网研究领域的 ...

  10. 基于最佳簇半径的无线传感器网络分簇路由算法

    文章目录 一.理论基础 1.能耗模型 2.基于最佳簇半径的分簇路由算法 (1)分簇优化 (2)簇间通信 二.仿真实验 三.参考文献 一.理论基础 1.能耗模型 本文采用一阶无线电模型作为能量消耗模型. ...

最新文章

  1. 转:初探 jQuery 的 Sizzle 选择器
  2. android编译系统学习 .
  3. C++笔记——指向常量的指针/指针常量
  4. 写得好的html网页,优化网站排名-使用Markdown编写更好的内容和HTML
  5. python中的scale_Python Matplotlib.pyplot.yscale()用法及代码示例
  6. 正向代理、反向代理和透明代理的详解
  7. redis php 性能测试工具,Php-Redis安装测试笔记
  8. java security provide_Java SecurityManager類代碼示例
  9. 蓝桥杯:奇妙的数字(C++)
  10. 《数值分析》-- 数值计算中的误差与有效数字
  11. 平板电脑安装软件_手机象棋软件手机、平板、电脑三平台同时安装!学棋涨棋必备...
  12. android webview 设置下载文件,如何使用Android webview下载文本文件
  13. ICP许可证的作用是什么?ICP许可证可以转让吗?
  14. 疏忽了给该内页做外链
  15. java 主机字节序_java字节序、主机字节序和网络字节序扫盲贴
  16. python模拟器ipad_Appium+python自动化19-iOS模拟器(iOS Simulator)安装自家APP【转载】
  17. 基于WebSocket实现网页聊天室
  18. 设置页眉页脚--分节符
  19. linux中ret2libc入门与实践
  20. 进阶面试的必看的ORM架构之 ORM简介

热门文章

  1. 95社区(对接第三方社区)
  2. FPGA 入门 (一)
  3. mysql查询bom清单_按BOM清单展开物料及需求(SQL)
  4. Java线程执行native方法时程序计数器为空,如何确保native执行完后的程序执行的位置
  5. 腾讯会议瞩目会议开启共享屏幕时候出现卡顿时候,是显卡问题。
  6. 少儿编程scratch(源码)
  7. tx关于机器人的律师函_史陶比尔TX40机器人说明书.pdf
  8. 【eNSP】入门介绍(很详细)
  9. ETL工具——Taskctl Web应用篇
  10. VS2019+DCMTK3.6.6环境配置