LEACH算法源代码

合集下载

LEACH算法仿真结果

LEACH算法仿真结果

仿真一:在100*100的区域内随机生成100个节点(matlab仿真代码: clear;xm=100;%x轴范围ym=100;%y轴范围sink.x=0.5*xm;%基站x轴 50sink.y=0.5*ym;%基站y轴 50n=100;E0=0.02;for i=1:1:nS(i).xd=rand(1,1)*xm;S(i).yd=rand(1,1)*ym;S(i).G=0;%每一周期结束此变量为0S(i).E=E0;%设置初始能量为E0S(i).type='N';%节点类型为普通plot(S(i).xd,S(i).yd,'o');hold on;end%设置SINK节点的坐标S(n+1).xd=sink.x;S(n+1).yd=sink.y;plot(S(n+1).xd,S(n+1).yd,'*');%绘制基站节点仿真结果图片:(‘O’代表随机散布的节点,‘*’代表SINK节点)仿真二:LEACH 分簇效果图(matlab 代码见附件)仿真结果:(p=0.1) 1、簇头个数14.01020304050607080901002、簇头个数:113、簇头个数:1201020304050607080901004、簇头个数:10102030405060708090100(p=0.05) 1、簇头=61020304050607080901002、簇头=73、簇头=124、簇头=81020304050607080901005、0102030405060708090100102030405060708090100xyLEACH 分簇算法成簇效果图仿真三:LEACH 分簇算法第一个节点死亡的轮数10203040506070809010001020304050607080901001020304050607080901000102030405060708090100第一死亡节点出现的分布及轮数xy0102030405060708090100xy经过matlab 仿真,LEACH 分簇算法在第一个节点死亡时,已经运行的轮数分别为: 122、143、125、149、122、72.仿真四:20%的节点死亡时分布及轮数1、yx 2、yxy0102030405060708090100x轮数:196、207、205、181.。

leach低功耗自适应分簇算法

leach低功耗自适应分簇算法

改进结果
随着时间的变化,节点存活的个数图。采用LEACH 算法,节点从第420 s 开始死亡,570 s 后所有节点死亡。采用改进的算法,第一个死亡节点出现 的时间推迟到了第 550s,到595 s 所有节点死亡全部死亡,改进的算法将第一 个节点死亡的时间向后推迟,因此延长了网络生存时间。这是因为簇头的 均匀分布可以避免各节点与簇头之间距离差异而引起的耗能的差距,并且 选取簇头时,依据节点的剩余能量水平,这样可以避免能量少的节点当选 为簇头。
E 34 26 22 16
显然,采用LEACH算法时,整个网络的生命周期将小于4轮。从 上面的分析不难看出,LEACH算法进行第四轮簇头选取时,没有 考虑到节点的剩余能量及其工作能耗,导致剩余能量小于工作能 耗的节点D当选为簇头,使节点D的能量过早衰竭,网络的生命周 期也随之结束。若结合考虑节点的位置信息,使靠近簇结构中心 位置且剩余能量较多的节点有更多机会成为簇头,无疑将有效延 长网络的生命周期。在改进方面我们考虑到能量的问题并作出了改进。
2 .未考虑节点分布密度时存在的问题
基站
应尽可能使密集分布区域中的节点比稀疏分布区域中的 节点具有更大当选为簇头的概率,使得密集分布区域比 稀疏分布区域产生更多簇头,并且每个簇中成员节点数 目大致相同,从而保证各簇头的工作能耗也相对均衡。
BACK
LEACH算法的改进
考虑了节点的剩余能量,为了避免节点在剩余能量 很小时也会被选为簇头节点。 1.簇头之间最优距离D 的计算 首先假设探测区域 A 是边长为L 的正方形区域,理想状态下k 个簇首节点应当完全覆盖区域A,则应该kπ(D/2)2 = C*L2。 其中C>=1 是一个常数,是为了充分保证群首节点能覆盖区域 A而设置的。由此得出平均意义下每个群首覆盖的区域半径应 该为

无线传感器网络改进的LEACH-ID算法

无线传感器网络改进的LEACH-ID算法

无线传感器网络改进的LEACH-ID算法摘要:分析了经典的分簇路由协议LEACH,针对LEACH中的簇头个数、簇中成员数太多或太少,从而导致节点加快死亡、网络能量利用率低的问题,通过计算最优簇头数、控制簇中成员数,均衡了网络中能量的消耗,提高了网络能量的利用率,延长了网络寿命。

同时给出一种简单的产生临时ID的方法,保证了相互间较大概率的互异性。

仿真实验结果表明,LEACH??ID协议与LEACH 协议相比延长了网络寿命,推迟了第一个死亡节点出现的时间,提高了能量利用率。

?ス丶?词:无线传感器网络;LEACH协议;簇头;临时ID号?ブ型挤掷嗪牛? TP393.04; TN915.04文献标志码:A英文标题??Improved LEACH??ID algorithm for wireless sensor networks?び⑽淖髡呙?SHI Ye??ling, CHEN Bin??bing?び⑽牡刂?(School of Electrical Engineering and Information, Sichuan University, Chengdu Sichuan 610065, China英文摘要)??Abstract:Classical clustering communication protocol of LEACH was analyzed. Concerning the problem that the amounts of cluster heads andtoo many or too few members of the cluster may cause the accelerated death of the nodes and low energy use of the network, by calculating optimal clustering heads and controlling members of the cluster, the consumed energy was balanced, the usage rate of the network energy was improved and the network??s lifetime was prolonged. At the same time, a simple and effective method of assigning temporary ID was given, which can assure the dissimilarity of the IDs with large probability. The simulation results indicate that, compared with LEACH, LEACH??ID extends the lifetime of network, delays the first node??s death time, and enhances the energy efficiency.英文关键词??Key words:Wireless Sensor Network (WSN); LEACH protocol; clusterhead; temporary ID number??0 引言??由于工作环境和自身构造所限,无线传感器网络(Wireless Sensor Network, WSN)传感器节点的计算、通信能力及能量都十分有限,对于节点的更换和充电也较难实现。

述leach算法的工作流程

述leach算法的工作流程

述leach算法的工作流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!LEACH 算法是一种基于聚类的路由协议,它的工作流程如下:1. 初始化阶段。

简述LEACH算法的基本原理。

简述LEACH算法的基本原理。

简述LEACH算法的基本原理。

LEACH(Low Energy Adaptive Clustering Hierarchy)算法是一种无线传感器网络中常用的能量有效的数据聚集协议。

其基本原理是将传感器节点分为若干个簇,每个簇有一个簇头节点,簇头节点负责收集和汇总本簇内的数据并将其传输到基站,从而减少无线传输的能量消耗,延长网络寿命。

LEACH算法的具体实现步骤如下:
1. 初始阶段:每个节点随机选择一个数值作为阈值,若节点的能量水平高于该阈值,则该节点有可能成为簇头节点。

2. 簇头节点选择阶段:每个节点通过计算与其距离的平方和来确定与其最近的簇头节点,并将自己加入该簇头节点所在的簇中。

每个簇头节点根据自己的能量水平计算出一个概率值,该概率值与其他节点的能量水平成反比,能量水平越高的节点成为簇头节点的概率越小。

簇头节点将自己的概率值广播给其他节点,每个节点通过比较自己的概率值和簇头节点的概率值来决定是否成为簇头节点。

3. 簇内通信阶段:每个节点将数据发送给其所在的簇头节点,簇头节点负责汇总和压缩数据,并将数据传输到基站。

4. 轮换阶段:为了平衡能量消耗,每个簇头节点轮流充当簇头节点,其他节点
重新选择簇头节点。

LEACH算法的优点是能够有效地减少能量消耗,延长网络寿命,同时具有良好的可扩展性和自适应性。

但是由于其随机性较强,可能导致网络中出现簇头节点密集或稀疏的情况,从而影响网络性能。

WSN中LEACH协议源码分析报告

WSN中LEACH协议源码分析报告

WSN中LEACH协议源码分析分析(一)首先对wireless.tcl进行分析,先对默认的脚本选项进行初始化:set opt(chan)Channel/\VirelessChannelset opt(prop) Propagatioii/TwoRayGroundset opt(netif)PhyAVirelessPhyset opt(mac) Mac/802_l 1set opt(ifq) Qucuc/DropTail/PriQueueset opt(ll) LLset opt(ant) Antenna/OmniAntennaset opt(x) 0 。

# X dimension of the topographyset opt(y) 0。

# Y dimension of the topographyset opt(cp),H,set opt(sc) N../mobility/scene/scen-670x670-50-600-20-2u。

# scenario file set opt(ifqlen)50o # max packet in ifset opt(nn) 51。

# number of nodesset opt(secd) 0.0set opt(stop) 10.0 o # simulation timeset opt(tr) out.tr。

# trace fileset opt(rp) dsdv 。

# routing protocol scriptset opt(lm) M on H。

# log movement在这个wireless.tcl中设置了一些全局变呈::##Initialize Global Variables#set ns_ [new Simulator]set chan [new $opt(chan)]set prop [new $opt(prop)]set topo [newTopography]set tracefd [open Sopt(tr) w]Stopo Ioad_flatgrid $opt(x) $opt(y)Sprop topography Stopo这些初始化将在后而的使用中用到,该文件最重要的是创建leach 17点:创建方法如下:} elseif { [string compare Sopt(rp) M leach,,]==0} {for {set i 0} {$i < $opt(nn) } {incr i} {leach-create-mobile-node $i}如果路由协议是leach协议,则在Uamps.tcl中调用leach-create-mobile-node方法创建leach节点。

birch算法代码

birch算法代码

birch算法代码Birch算法是一种用于聚类的算法,它是一种基于模型的方法,可以有效地处理大规模的数据集。

该算法由David Arthur和William Vitter于1996年提出,是一种适用于大规模数据的分布式聚类算法。

以下是一个使用Python实现的Birch算法的示例代码:```pythonimport numpy as npimport randomimport copyclass BirchClustering:def __init__(self, k, n_clusters, n_neighbors):self.k = k # 聚类个数self.n_clusters = n_clusters # 聚类数量self.n_neighbors = n_neighbors # 邻居数量self.clusters = [] # 存储聚类结果的列表self.trees = [] # 存储每个聚类树的列表def generate_initial_clusters(self, data):# 使用k-means算法生成初始聚类中心initial_clusters = np.random.choice(len(data), self.k, replace=False)clusters = self.kmeans(data, initial_clusters)return clustersdef split_tree(self, tree):# 分割树并返回新的树和剩余的数据点new_clusters = []remaining_data = []for child in tree.children:new_clusters += self.split_tree(child)remaining_data += tree.datareturn new_clusters, remaining_datadef fit_tree(self, clusters):# 根据聚类结果生成树,并返回树对象root = TreeNode(len(clusters), clusters)for i in range(self.k):for cluster in clusters:if cluster[i] == 1:breakcluster = copy.deepcopy(clusters[i])new_cluster = self.split_cluster(cluster)root.children.append(TreeNode(new_cluster))return rootdef split_cluster(self, cluster):# 分割集群并返回分割后的集群和剩余的数据点new_cluster = []remaining_data = []for point in cluster:if point not in remaining_data:new_cluster += [point]else:remaining_data += [point]return new_cluster, remaining_data[:],remaining_data[len(new_cluster)] # 数据点和剩余点重合并赋值给一个新列表返回。

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

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’。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if (((Node*) nodePtr[sender])->myStatus != STATUS_DEAD)this->deadNodes++;//消息的状态
advInfo[sender].status = STATUS_DEAD;//此时的状态赋值为死亡
status = STATUS_DEAD;
double xpos, ypos;
/*???????????????????????????????????*/
sender = ((Status2BSMessage*) msg)->getSrcAddress();//发送信息地址
energy = ((Status2BSMessage*) msg)->getEnergy();//发送信息能量
cluster = ((Status2BSMessage*) msg)->getCluster();//簇
status = ((Status2BSMessage*) msg)->getStatus();//状态
xpos = ((Status2BSMessage*) msg)->getXpos();
ypos = ((Status2BSMessage*) msg)->getYpos();
ev << "BS trRange is: " << trRange << "\n";//总的轮数是:
for(i=1;i<=simulation.getLastModuleId();i++)//????????????????????????????????????????????
{
mod=simulation.getModule(i);//????????????????????????????????????????????????????????
if (energy < 0 && this->halfDead == 0)this->halfDeadCtr++;//?????????????????????????????????????????????????
advInfo[sender].id = sender;//信息表中的发射量发射地址
void BS::initialize() {
int i;
cModule* parent = getParentModule();//消息参数的访问调用cModule的par()成员函数可以访问模块指针:
//cPar& delayPar = par("delay");cPar类是一个存储值的对象,//它支持数据类型,指针值可以这样读:
ev << "BS: got start message\n";//
this->initNodes();
}
} else {//其他消息no selfmessage来自节点的消息或者是簇头的消息
if (((ClusterMessage*) msg)->getProto() == CL_TOBS) {//簇头到基站的消息(红色的)。
this->nrRounds = parent->par("rounds");
this->deadNodes = 0;
this->roundsDone = 0;
this->oldDeadNodes = 0;
this->nrStatusRec = 0;//?????????????????????????????????
ev << "status message " << "\n";//消息状态
double energy;
int cluster;//簇头
int status;//各个状态
int sender;//发射机
int clHead;
double curHEnergy;
int curHStatus;
double rating;
//scheduleAt(simtime()+delta, msg);
}
/*********************第三个执行的函数*******************/
void BS::initNodes() {//初始化函数
cModule* parent = getParentModule();
///周围的复合模块可以通过parentModule()成员函数访问: cModule *parent = parentModule();
//例如,父模块的参数像这样被访问: double timeout = parentModule()->par( "t
this->myId = par("id");
this->nrStatusRec++;//接收到的节点自加
ev << "BS rec " << this->nrStatusRec << " nrNodes: "<< this->nrNodes << "\n";
//check if done
if (this->nrStatusRec == this->nrNodes - this->oldDeadNodes) {
cmsg->setKind(SMSG_INIT);//初始化消息
scheduleAt(simTime(), cmsg);//立即发送给基站自己
ev<<"id:"<<this->myId <<"\n";//基站自己的地址
//)使用scheduleAt()发送自传消息;scheduleAt(absoluteTime, //msg);
#include "leach.h"
Define_Module( BS);//定义简单模块(1)直接或间接定义一个CSimpleModule的子类;
///(2)以define_Module()或define_Module_Like()宏注册之;
/******************第一个执行的函数***********************/
advInfo[i].energy = 0;
advInfo[i].status = 0;
}//初始化节点信息共103项为什么是103??????????????????????
this->setGateSize("out", nrGates + 1);//需要设置参数值或门向量大小???????????
if (msg->isSelfMessage()) {//本身的身消息
ev << "BS: got self message type " << msg->getKind() << "\n";//节点开始初始化完(在initialize()函数中)
if (msg->getKind() == SMSG_INIT) {
deadNodesVector.record(this->deadNodes);///记录当前死亡的节点*****************************************************I*****
olddeadNodesVector.record(this->oldDeadNodes);///记录所有死亡的节点****************************************************I*****
roundVector.setName("round");//轮数
deadNodesVector.setName("nodes dead");//死亡的节点
olddeadNodesVector.setName("all dead");//所有死亡的节点
nrheadVector.setName("headnumber");//簇头的个数
if(strcmp(mod->getName(),"node")==0)//遍历节点,把模块指针填充
{
nodePtr[((Node*)mod)->myId]=(Node*)mod;//Id标识,指针
}
}
}
/**********第六个执行的函数********************/
void BS::handleMessage(cMessage* msg) {//消息处理函数
((Node*) nodePtr[sender])->myStatus = STATUS_DEAD;
}
rating = energy - roundEnergyLoss;//发送功率
advInfo[sender].rating = rating;
ev << "BS received from " << sender << "status " << status<< " rating:" << rating << "\n";
/*
*
*
* Created on: 2011-4-17
相关文档
最新文档