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

上传人:b****5 文档编号:7402317 上传时间:2023-01-23 格式:DOCX 页数:13 大小:158.56KB
下载 相关 举报
LEACH分簇算法实现和能量控制算法实现.docx_第1页
第1页 / 共13页
LEACH分簇算法实现和能量控制算法实现.docx_第2页
第2页 / 共13页
LEACH分簇算法实现和能量控制算法实现.docx_第3页
第3页 / 共13页
LEACH分簇算法实现和能量控制算法实现.docx_第4页
第4页 / 共13页
LEACH分簇算法实现和能量控制算法实现.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

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

《LEACH分簇算法实现和能量控制算法实现.docx》由会员分享,可在线阅读,更多相关《LEACH分簇算法实现和能量控制算法实现.docx(13页珍藏版)》请在冰豆网上搜索。

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

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轮的分簇试验中选取5张分簇网络图,具体分簇情况分别如下:

图1第一轮分簇网络拓扑图

第一轮分簇的簇头和簇成员的分类表如下:

簇头

簇成员

71

3,27,22

28

72,82,40,57,20,28,87,15,48,38,48,25

6

97,55,75,33,78,5,18,99

11

49,83,12,36,89,9,61,52,62

00

98,24,84,17,11,66,69,45,81,96,35,46,84,54,64,54,21

14

13,73,44,47,01

43

16,10,60,74,29,51,19,59,92,56

93

02,58,08,88,67,79,96,33,50,32,53,77,34,39,65,35,37,42,31,70,76,91,30,26

图2第二,三,四,五轮分簇网络拓扑图

(2)节点能量消耗

试验中通过对能量消耗规律的分析可以得出:

假设某轮分簇中第i个簇头的簇成员有a个,所以在这一轮中的通信过程中簇头消耗的能量为2+11*a,簇成员消耗的能量为22。

所以增加节点的一个属性为S(i).power,从而到达能量消耗监测的目的。

设置标志位,当发现第一个节点能量耗尽情况出现时,则结束程序,并用黑色标记。

而已做过簇头的节点用红色标记。

在一次实验中,第一次能量耗尽出现在第5轮。

前5轮的图像如下:

图3前四轮节点能量均剩余情况

图4第五轮25节点能量耗尽

四:

实验结论

在本次实验中首先通过对LEACH算法的分析研究,学习了其进行传感器节点网络分簇的步骤,同时在P=0.08和节点数目为100的前提下通过MATLAB仿真在节点数目不变的情况下10轮的分簇结果。

在能量的消耗试验中,首先通过对簇头以及簇成员在一轮分簇通信过程中的能量消耗规律统计,简化了实验步骤。

通过仿真,第一个节点能量耗尽的情况出现在第5轮。

通过这次实验,对传感器网络的通信协议以及能量消耗控制有了更加深入的研究和探讨,收获很多。

1、Leach分簇:

closeall

clearall;

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;

fori=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;

holdon;

end

num11=0;

num12=0;

flag=1;

while(flag)

forr=1:

1:

10

figure(r);

fori=1:

1:

n%随机产生100个点

S(i).temp_rand=rand;

end

fori=1:

1:

n

ifS(i).selected=='N'

%ifS(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;

elseS(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

 

ifS(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

holdon;

end

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

yy=zeros(n);

fora=1:

1:

n

ifS(a).type=='N'

forb=1:

1:

n

ifS(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;

holdon

else

length(a,:

)=10000;

end

end

fori=1:

1:

n

ifS(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

fori=1:

1:

n

S(i).type='N';

end

end

fori=1:

1:

n

if(S(i).power)<0

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

flag=0;

end

end

ifflag==0

break

end

end

2、能量

clear

clc

closeall

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;

fori=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';

holdon;

end

r=1;

flag=1;

while(flag)

fori=1:

n

ifS(i).selected=='N'&(S(i).temp_rand<=(p/(1-p*mod(r,round(1/p)))))&S(i).signal=='L'

flag=1;

break;

end

ifi==n

ifS(i).selected=='Y'|(S(i).temp_rand>=(p/(1-p*mod(r,round(1/p)))))|S(i).signal=='D'

flag=0;

end

end

end

ifflag==0

break;

end

figure(r);

fori=1:

n

ifS(i).signal=='L'

ifS(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

holdon;

end

end

distance=zeros(1,100);

num_cluster=zeros(1,100);

fori=1:

100

distance(1,i)=100000;

end

fora=1:

1:

n

ifS(a).signal=='L'&S(a).type=='N'

forb=1:

1:

n

ifS(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;

fori=1:

n

ifdistance(1,i)

min=distance(1,i);

nearest_cluster=i;

end

end

ifmin~=100000;

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

holdon;

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);

fori=1:

n

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

end

energy1=sort(energy);

fori=1:

n

ifS(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));

holdon;

end

end

fori=1:

n

S(i).type='N';

ifS(i).selected=='N'

S(i).temp_rand=rand;

end

end

r=r+1;

end

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1