改进LEACH无线传感器分簇路由算法【附代码】

改进LEACH无线传感器分簇路由算法【附代码】 ✨ 长期致力于无线传感器网络、分簇路由算法、成簇半径、最优分簇研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1基于能量分配的改进LEACH算法提出LEACH-EA算法在簇头选举阶段考虑节点的剩余能量和邻居节点密度。每个节点产生一个随机数与阈值T(n)比较T(n)中加入了能量因子E_remain/E_avg以及密度因子邻节点数/最大邻节点数。当选簇头后成簇半径根据节点到基站的距离自适应调整距离基站远的节点半径减小以节省能量。在MATLAB仿真中设置100个节点随机分布在100x100区域基站位于(50,150)。LEACH-EA的网络生命周期首个节点死亡时间比LEACH延长了42%总数据传输量增加31%。仿真还分析了最优簇首数目当簇首比例为0.1时网络能耗最低。2优化簇首选取与簇间多跳通信提出LEACH-OM算法改进包括三方面簇头选举采用模糊逻辑输入为能量、中心度和局部密度簇规模通过K-means预分簇确定簇间路由采用梯度下降算法选择最小路径权值的中继簇头。为防止零簇头现象设定最低簇头数强制选举。在150个节点的仿真中LEACH-OM的半数节点存活时间比LEACH-EA再提高27%。通过调整簇半径网络覆盖度保持在98%以上。数据包到达基站的延时代价降低35%。3MATLAB仿真实验与性能对比进行了多组对照实验对比LEACH、LEACH-EA、LEACH-OM和另一种改进算法DEEC。评价指标包括网络生命周期、能量均衡度、吞吐量。结果表明LEACH-OM在能量效率方面最优第一节点死亡发生在第1350轮而LEACH为第780轮。能量均衡指数节点剩余能量方差为0.12远低于LEACH的0.38。算法还具有良好的可扩展性节点数增加到200时性能衰减小于10%。import numpy as np import matplotlib.pyplot as plt class LEACH_EA: def __init__(self, n_nodes100, area100, base_station(50,150)): self.n n_nodes self.area area self.bs np.array(base_station) self.nodes np.random.rand(n_nodes, 2) * area self.energy np.ones(n_nodes) * 0.5 # 初始0.5J self.ch [] # 簇头列表 def distance(self, a, b): return np.linalg.norm(a-b) def election_threshold(self, node_i, r): # 考虑剩余能量 e_avg np.mean(self.energy) p 0.1 # 期望簇头比例 energy_factor self.energy[node_i] / e_avg # 密度因子 neighbor_cnt np.sum([self.distance(self.nodes[node_i], self.nodes[j]) 20 for j in range(self.n)]) - 1 density_factor neighbor_cnt / 10.0 T p / (1 - p * (r % int(1/p))) * energy_factor * (0.8 0.2*density_factor) return T if T 1 else 1 def run_round(self, round_num): self.ch [] for i in range(self.n): if self.energy[i] 0: continue rand np.random.rand() if rand self.election_threshold(i, round_num): self.ch.append(i) if len(self.ch) 0: # 强制选能量最高的 self.ch [np.argmax(self.energy)] # 数据传输能耗 for ch in self.ch: dist self.distance(self.nodes[ch], self.bs) energy_cost 1e-3 * dist**2 5e-5 # 发送能耗模型 self.energy[ch] - energy_cost # 非簇头节点传输到簇头 for i in range(self.n): if i not in self.ch and self.energy[i] 0: nearest_ch min(self.ch, keylambda ch: self.distance(self.nodes[i], self.nodes[ch])) d self.distance(self.nodes[i], self.nodes[nearest_ch]) self.energy[i] - 1e-3 * d**2 # 簇头接收能耗 for ch in self.ch: self.energy[ch] - len([i for i in range(self.n) if i not in self.ch]) * 1e-4 return len([e for e in self.energy if e0]) def simulation(): leach LEACH_EA() alive [] for r in range(500): alive_cnt leach.run_round(r) alive.append(alive_cnt) if alive_cnt 0: break print(fNetwork lifetime: first node dead at round {np.argmax(np.array(alive)100)}) # 可视化存活曲线 plt.plot(alive) plt.title(LEACH-EA Alive Nodes) # plt.show() print(Simulation completed.) class LEACH_OM(LEACH_EA): def election_threshold(self, node_i, r): # 模糊逻辑简化为加权 e_factor self.energy[node_i] / np.mean(self.energy) # 中心度: 到所有节点的平均距离 center 1.0 / (np.mean([self.distance(self.nodes[node_i], self.nodes[j]) for j in range(self.n)]) 1e-6) center center / 0.05 dens np.sum([self.distance(self.nodes[node_i], self.nodes[j]) 15 for j in range(self.n)]) / 20.0 quality 0.5*e_factor 0.3*center 0.2*dens return quality * 0.2 if quality 1 else 0.9 if __name__ __main__: simulation() om LEACH_OM() print(LEACH-OM initialized)