一、前言

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

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

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

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

二、目的

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

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

三、方法描述

    (1LEACH分簇

簇头选举初始阶段,每个节点根据所建议网络簇头的百分比(事先确定)和节点已经成为簇头的次数来确定自己是否当选为簇头。每个节点产生一个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轴 50
sink.y=0.5*ym; %基站y轴 50
n=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:10
figure(r);
for i=1:1:n %随机产生100个点
S(i).temp_rand=rand;
end
for i=1:1:n
if 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
end
if S(i).type=='C'
plot(S(i).xd,S(i).yd,'*'); %蔟头节点以*标记
text(S(i).xd,S(i).yd,num2str(i)); else
plot(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:n
if S(a).type=='N'
for b=1:1:n
if S(b).type=='C'
length(a,b)=sqrt((S(a).xd-S(b).xd)^2+(S(a).yd-S(b).yd)^2); %簇头与每个普通节点的距离
else
length(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 on
else
length(a,:)=10000;
end
end
for i=1:1:n
if S(i).type=='C'
number=sum(yy(:,i))
S(i).power=S(i).power-(2+11*number);
else
S(i).power=S(i).power-22;
end
end for i=1:1:n
S(i).type='N';
end
end
for i=1:1:n
if (S(i).power)<0
text(S(i).xd,S(i).yd,num2str(i));
flag=0;
end end
if flag==0
break
end
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:n
if S(i).selected=='N'&(S(i).temp_rand<=(p/(1-p*mod(r,round(1/p)))))&S(i).signal=='L'
flag=1;
break;
end
if i==n
if S(i).selected=='Y'|(S(i).temp_rand>=(p/(1-p*mod(r,round(1/p)))))|S(i).signal=='D'
flag=0;
end
end
end
if flag==0
break;
end
figure(r);
for i=1:n
if 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));
else
S(i).type='N';
plot(S(i).xd,S(i).yd,'bo');
text(S(i).xd,S(i).yd,num2str(i));
end
else
plot(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:100
distance(1,i)=100000;
end
for a=1:1:n
if S(a).signal=='L'&S(a).type=='N'
for b=1:1:n
if 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:n
if distance(1,i)<min;
min=distance(1,i);
nearest_cluster=i;
end
end
if 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:n
if S(i).energy<=0
S(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
end
for i=1:n
S(i).type='N';
if S(i).selected=='N'
S(i).temp_rand=rand;
end
end
r=r+1;
end

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

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

LEACH分簇算法实现和能量控制算法实现的更多相关文章

  1. 分红包算法Java实现

    需要考虑几个点: 红包形成的队列不应该是从小到大或者从大到小,需要有大小的随机性. 红包这种金钱类的需要用Decimal保证精确度. 考虑红包分到每个人手上的最小的最大的情况. 下面是利用线段分割算法 ...

  2. 超强视频超分AI算法,从此只看高清视频

    最近发现一个特别强的视频超分算法----BasicVSR,在真实世界数据集中,实现了前所未有的视觉重建效果,最近它还拿下了超分比赛NTIRE 2021三冠一亚的优异成绩,登上了CVPR 2022. 视 ...

  3. CSDN 分糖果算法的思路和求助

    昨天晚上 在csdn上做了一道分糖果的题目,我自个测的是没有问题,但是提交答案后,老失败,提示 你的程序正常运行并输出了结果,但是答案错误你的程序输出结果与测试数据中的输出结果不符 我先把自个思路说一 ...

  4. Java-二分查找算法

    package com.lym.binarySearch; import java.util.Arrays; /** * 二分查找 * * @author Administrator * */ pub ...

  5. DB Scan算法的分析与实现

    摘自:http://www.cnblogs.com/weixliu/archive/2012/12/08/2808815.html 根据上面第二个数据集的簇的形状比较怪异,分簇结果应该是连起来的属于一 ...

  6. KNN近邻算法

    K近邻(KNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表.kNN算法的核 ...

  7. scala实现kmeans算法

    算法的概念不做过都解释,google一下一大把.直接贴上代码,有比较详细的注释了. 主程序: import scala.io.Source import scala.util.Random /** * ...

  8. 强算KMeans聚类算法演示器

    这些天做C#实验以及这个KMeans算法演示器,学了一下openGL,感觉有待加强. //Point.h /* Point 结构体定义及实现 结构体重载了2个运算符: 1.== //推断两个Point ...

  9. 各类聚类(clustering)算法初探

    1. 聚类简介 0x1:聚类是什么? 聚类是一种运用广泛的探索性数据分析技术,人们对数据产生的第一直觉往往是通过对数据进行有意义的分组.很自然,首先要弄清楚聚类是什么? 直观上讲,聚类是将对象进行分组 ...

随机推荐

  1. 被人DDoS攻击了,分析一下原理和防护

    一.行业现象 1.1 为什么要攻击? 常见的,一个是同行恶意竞争,一个是敲诈勒索. 无论是传统行业的线下门店,还是互联网行业的门户网站.APP产品,都存在着竞争关系,争相获得更多客源,究其目的,无非是 ...

  2. PostgreSQL与PostGIS安装使用时需要注意的坑

    最近些许繁忙,没有时间系统整理PostgreSQL和PostGIS的安装和使用方法.所以就简单记录一下遇到的坑. 1.找不到 libintl-9.dll 我安装的PostgreSQL版本是11.7,P ...

  3. 基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用

    我前面几篇随笔介绍了关于几篇关于SqlSugar的基础封装,已经可以直接应用在Winform项目开发上,并且基础接口也通过了单元测试,同时测试通过了一些Winform功能页面:本篇随笔继续深化应用开发 ...

  4. 用python实现matlib的 生成高斯模糊核

    最近在做一个关于模糊图片恢复的数学建模,遇到了一个大问题,特记录一下. 在matlib中有  PSF = fspecial('motion', LEN, THETA);  来生成模糊核函数,但在pyt ...

  5. 分布式存储之GlusterFS

    公众号关注 「开源Linux」 回复「学习」,有我为您特别筛选的学习资料~ 1.glusterfs概述 GlusterFS系统是一个可扩展的网络文件系统,相比其他分布式文件系统,GlusterFS具有 ...

  6. Kubernetes 从入门到进阶实战教程 (2021 最新万字干货版)

    作者:oonamao 毛江云,腾讯 CSIG 应用开发工程师原文:来源腾讯技术工程,https://tinyurl.com/ya3ennxf 写在前面 笔者今年 9 月从端侧开发转到后台开发,第一个系 ...

  7. RabbitMQ 3.9( 基础 )

    1.认识MQ 1.1.什么是MQ? MQ全称:message queue 即 消息队列 这个队列遵循的原则:FIFO 即 先进先出 队列里面存的就是message 1.2.为什么要用MQ? 1.2.1 ...

  8. CTF中常见密码学

    前言 参考,我们任课老师的WORD和PPT,结合自己的理解,在结合网上文章的理解. 一.BASE64编码 BASE64编码中,特征和所拥有的字符字母:A-Z a-z;数字:0-9;符号:+ / ,然后 ...

  9. 有关状压DP

    [以下内容仅为本人在学习中的所感所想,本人水平有限目前尚处学习阶段,如有错误及不妥之处还请各位大佬指正,请谅解,谢谢!] 引言 动态规划虽然已经是对暴力算法的优化,但在某些比较特别的情况下,可以通过一 ...

  10. Spring Boot 3.0.0 M3、2.7.0发布,2.5.x将停止维护

    昨晚(5月19日),Spring Boot官方发布了一系列Spring Boot的版本更新,其中包括: Spring Boot 3.0.0-M3 Spring Boot 2.7.0 Spring Bo ...