leach分簇功能实现matlab,LEACH分簇算法实现和能量控制算法实现
一、前言
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
君子有三畏:畏天命,畏大人,畏圣人之言。小人不知天命而不畏也,狎大人,侮圣人之言。
转载需说明出处,笔者总结之前的知识,与大家分享,有问题的可以留给我哦~
原文:https://www.cnblogs.com/lemonzhang/p/9254435.html
leach分簇功能实现matlab,LEACH分簇算法实现和能量控制算法实现相关推荐
- android6 miui9分屏,miui9分屏功能怎么用 miui9分屏怎么开启
miui9已经正式推出了,这次miui9分屏功能也是大家比较关注的地方,很多用户可能还不知道miui9分屏功能怎么用,分屏功能只支持基于Android N(即Android版本为7.x)的MIUI,一 ...
- android6 miui9分屏,miui9分屏功能怎么用 miui9分屏开启教程【详解】
miui9已经正式推出了,这次miui9分屏功能也是大家比较关注的地方,很多用户可能还不知道miui9分屏功能怎么用,分屏功能只支持基于Android N(即Android版本为7.x)的MIUI,一 ...
- leach分簇功能实现matlab,一种改进的LEACH分簇层次路由算法的制作方法
本发明涉及无线传感器网络领域,属于leach路由通信 技术领域: . 背景技术: :物联网技术飞速发展,无线传感器网络(wirelesssensornetworks,wsn)也逐渐成为互联网研究领域的 ...
- LEACH分簇算法实现和能量控制算法实现
一.前言 1.在给定WSN的节点数目(100)前提下,节点随机分布,按照LEACH算法,实现每一轮对WSN的分簇.记录前K轮(k=10)时,网络的分簇情况,即每个节点的角色(簇头或簇成员).标记节点之 ...
- ipad分屏功能怎么开启_mac分屏怎么开启?Mac上的分屏小功能
很多小伙伴在使用Mac电脑办公或学习的过程中忙起来可能觉得要好几个屏幕才够用,其实Mac是自带的分屏功能的,本次我为您带来了mac分屏开启教程,想知道怎么操作的朋友快来看看吧! 分屏功能 借助分屏浏览 ...
- matlab画虫口模型分岔图,[转载]Matlab——混沌分岔图
经过近期的研究发现,目前对于系统单参数分岔图的计算共有以下的几种方法: 1)最大值法 即对系统微分方程(组)进行求解,对求解的结果用getmax函数进行取点,并绘图. 2)Poincare截面法 对系 ...
- 小米android n 分屏,小米分屏功能是什么 小米Max2分屏模式怎么开启?
小米在今天下午召开了新品发布会,这次的发布会中主要是发布新手机小米Max 2,其最大的亮点就是分屏模式,很多小伙伴对这个不大了解,小米分屏功能是什么,小米Max2分屏模式怎么开启,下面小编就来为大家介 ...
- 【LEACH协议】基于matlab最佳簇半径的无线传感器网络分簇路由算法【含Matlab源码 2087期】
⛄一. 数据融合的LEACH协议简介 1 基于自适应数据融合的LEACH协议 1.1 基本定义和概念 无线传感器网络中的一个簇可以用一个无向加权全连通图G=(V,E)来表示,V是簇中所有传感器节点的集 ...
- 【WSN通信】基于最佳簇半径的无线传感器网络分簇路由算法附matlab代码
1 内容介绍 无线传感器网络(WirelessSensorNetwork,WSN)是由若干个分布在被监控范围内的传感器节点构成的网络,这些节点以随机或者确定位置分布的形式布置在被监测范围内,可以收集温 ...
- WSN无线传感网络-节点分簇功能python实现
实现语言:python 使用库:numpy matplotlib 实验要求描述: 1.给定场景,给定WSN的节点数目,节点随机分布,能按照LEACH的介绍,实现(每一轮)对WSN的分簇.请记录前k轮 ...
最新文章
- Spark的基础应用
- 嵌入式开发有年龄限制吗_2021年考监理工程师有年龄限制吗?女生可以考监理工程师吗?...
- struts(三)——struts框架实现登录示例
- php: xampp安装对应的phalcon版本(3.2.2-php5.6):比如redis-php5.6, php_igbinary-5.6
- pt1000温度对照表_温度传感器的常用检测方法
- 优先级队列 c语言,使用最小堆使用优先级队列(c语言版本)
- 考研数学(180°为什么等于π)
- 网站移动端500错误_PC网站和移动端网站有什么差异?
- LeetCode 103. Binary Tree Zigzag Level Order Traversal
- ionic—alert弹出框
- 哲学家就餐问题及其实现
- vue-router仿天猫底部导航栏
- 前后端分离 Spring Boot + Vue 开发网易云、QQ音乐(附源码)!
- [200127] Java类初始化与实例初始化 - Thinking in Java学习日志
- 苹果电脑MACbook Air快捷键大全
- 单元测试之 Xunit
- plc-st编程语言学习_这就是您可以学习所有编程语言的方式,是的-“全部”
- U盘被识别为其他设备(显示U盘图标但是不显示盘符)的解决办法
- SEO优化推广的特点
- 如何评价python知乎_如何看待当下许多人盲目追风Python