LEACH、LEACH-C与TS-I-LEACH无线传感器网络路由协议Matlab仿真对比

LEACH、LEACH-C与TS-I-LEACH无线传感器网络路由协议Matlab仿真对比 做无线传感器网络WSN方向的仿真研究LEACH是个躲不开的坐标点。它是无数论文的baseline也是各种改良协议的出发点。这篇文章要完整复盘我最近做的一个对比研究LEACH、LEACH-C和TS-I-LEACH三种路由协议怎么理解它们的机制差异怎么用Matlab搭仿真框架怎么统计网络生命周期、能耗和吞吐量以及在跑代码时踩过的那些坑。适合刚进WSN方向的研究生也适合正在做路由算法评估和方案选型的工程岗。我不会只丢结论会把协议推导逻辑、关键代码、参数选择和结果解读全部串起来。LEACH这类分层路由协议本质上解决的是“传感器节点电池无法更换如何最大化网络生存时间”的问题。三种协议恰好代表了三种不同的设计思路完全分布式的随机分簇、集中式的基站全局分簇、以及带有阈值感知能力的能量加权改进。把它们放在同一个Matlab框架里横向对比你能非常直观看到“集中调度”和“局部决策”各自在能耗上的代价和收益。我会把整套仿真思路拆开讲代码片段都是可以直接改参数跑起来的程度。1. 先搞清背景WSN路由协议的痛点与LEACH的江湖地位1.1 无线传感器网络为什么需要分层路由无线传感器网络的基本单元是大量密集部署的微型节点这些节点靠电池供电部署环境通常是野外、厂房或者不方便更换电池的封闭区域。节点既要采集数据又要做简单处理还要往外传数据。能量一旦耗尽这个节点基本就等于报废。所以WSN路由设计的首要目标从来都不是“最快把数据送到”而是“在同等数据送达率下让整个网络活得更久”。平层路由的最大问题在于通信代价。普通传感器节点的发射功率有限如果每个节点都直接把数据发给远处的基站那么距离基站较远的节点很快就会因为发送能耗过高而提前死亡同时基站附近节点要同时接收大量数据也会被很快耗死。这就是典型的“热点效应”。而分层路由的核心思路是分簇少量节点被选为簇头普通节点先把数据发给所属簇头簇头做数据聚合后再转发给基站。这样普通节点只需要短距离通信簇头虽然是高能耗角色但通过周期性轮换让能量消耗被摊到整个网络的不同节点身上。分簇结构带来的好处不只是缩短传输距离那么简单。簇头在转发前可以做数据融合把多个节点采集到的高度冗余的数据压缩成一个结果这直接减少了基站接收的数据量。另外分簇天然支持TDMA时隙调度每个普通节点只在指定时隙内唤醒发送数据其余时间可以休眠这在MAC层上又能省一大笔能量。所以从协议栈整体来看分层路由是对能耗和带宽的双重优化。1.2 LEACH的经典机制与三大硬伤LEACH全称是Low Energy Adaptive Clustering Hierarchy低功耗自适应分簇分层协议是MIT的Heinzelman等人在2000年前后提出的后续几乎所有分簇路由研究都会拿它做基准。它的核心机制可以概括为“分轮运行随机轮换簇头”。每一轮分为两个阶段簇建立阶段和稳定传输阶段。在簇建立阶段每个节点生成一个0到1之间的随机数如果这个数小于某个阈值T(n)节点就宣布自己成为簇头。T(n)的计算公式是T(n) P / (1 - P * (mod(r, round(1/P))))这里P是预设的簇头比例通常取0.05到0.1r是当前轮数。这个公式确保每个节点在最近的1/P轮里至少有机会当一次簇头。非簇头节点收到簇头广播后根据信号强度选择加入哪一个簇然后簇头分配TDMA时隙进入稳定传输阶段。稳定阶段内普通节点在自己的时隙把数据发给簇头簇头聚合后发给基站。这套机制的最大贡献是首次把“随机轮换”引入分簇路由用概率手段实现了能耗的“大致均匀”分摊。但它的问题也很明显我总结成三大硬伤第一簇头选择完全不看剩余能量。一个快没电的节点也可能被随机选中当簇头结果在接入普通节点数据后迅速死亡造成网络空洞。第二随机选择的簇头在空间分布上极不均匀。可能某一轮90%的簇头挤在角落里另外一片区域的节点找不到就近簇头只能远距离发送能耗激增。第三所有簇头都直接与基站单跳通信。如果基站部署得离网络区域很远簇头的发送能耗会以d的平方甚至四次方增长高能耗节点很容易在第一轮就耗尽能量。这些硬伤就是LEACH-C和TS-I-LEACH这两类改进协议的出发点。理解了原版的缺陷再去看后续协议的设计逻辑会顺很多。2. 三套协议逐项拆解分簇方式、开销策略与改进思路2.1 LEACH完全分布式随机簇头LEACH的簇头选择是在每个节点本地完成的节点和节点之间除了广播簇头声明和入簇请求外不需要任何全局信息。这种分布式机制的好处是扩展性好网络规模大了也不至于被中心节点卡脖子坏处是“盲人摸象”每个节点只做局部随机决策整体分簇质量完全没有保障。在实际实现中LEACH每一轮的流程这么走每个存活节点用阈值T(n)判断自己是否当簇头当上簇头的节点广播ADV消息普通节点根据接收信号强度选择最合适的簇头并发送JOIN消息簇头根据加入的节点数创建TDMA调度表并广播稳定传输阶段把数据聚合后发给基站下一轮开始前所有节点重置标志位再走一遍流程。这里有个容易被忽略的细节簇头广播ADV消息时普通节点是依据接收强度来选择簇头而不是依据距离。仿真里我们通常直接按欧氏距离来算“最近簇头”但真实场景里还要考虑路径损耗、干扰等因素。所以在Matlab里做仿真时我会刻意把“选最近簇头”作为默认且唯一的入簇准则这样做出的结果才是所有协议可公平对比的基础。LEACH的随机性会导致一部分节点每一轮都短暂当过簇头另一部分节点却没机会。我在跑仿真时经常看到这样的现象某轮选出的簇头数量远大于P×N但分布在空间上集中在一角下一个区域就出现了“无簇头覆盖”的盲区那里节点被迫用更大的发射功率去够远处的簇头这一轮能耗就上去了。这就是LEACH生命周期开始较早出现死亡节点的直接原因。2.2 LEACH-C让基站当“总指挥”LEACH-C是LEACH的集中式版本核心变化是把分簇决策从“节点本地随机”改成了“基站全局计算”。每一轮开始时所有存活节点把自己的位置坐标和剩余能量上报给基站。基站拿到全局信息后使用模拟退火算法搜索一个最优分簇方案目标函数是让所有簇头的总通信代价最小。模拟退火的代价函数里通常包含两部分所有非簇头节点到簇头的距离平均值以及簇头之间、簇头到基站的距离。搜索过程中还会约束每个簇头对应的节点数不要过于悬殊避免某个簇头负载过重。算法收敛后基站把选中的簇头列表和每个普通节点的簇归属关系广播回去节点按这个调度表执行这一轮的数据传输。LEACH-C的改进效果非常明显。因为基站能看到全局能量分布可以选择剩余能量较高的节点当簇头同时通过优化分簇让普通节点尽量靠近自己的簇头网络的空间能耗分布均匀很多。在仿真曲线上LEACH-C的第一个节点死亡轮数通常比LEACH晚15%以上这还是比较保守的估计。但LEACH-C也有它的代价每一轮所有节点都要向基站上报一次位置和能量这会消耗额外的带宽和能量。尤其当网络规模变大、轮数变多以后这部分控制开销会不断累积。此外基站成了单点依赖一旦基站失效或者通信链路不稳定整个网络直接瘫痪。集中式方法在理论仿真中确实很漂亮实际部署时却要掂量一下可靠性的成本。2.3 TS-I-LEACH阈值感知加能量加权的再改进TS-I-LEACH从命名上看是带“阈值感知”的改进版本方向上更贴近事件驱动型WSN场景。我把它理解并实现为在LEACH的分簇框架上同时引入“能量感知的簇头选举”和“事件触发的数据发送”两套机制让网络既能适应周期性数据上报又能在没有事件发生时减少不必要的空转能耗。首先簇头选举不再只靠随机数比较。原始阈值T(n)会被一个加权系数修正这个系数考虑了节点的当前剩余能量、节点到基站的距离以及它所在区域的节点密度修正后的阈值如下T_improved T(n) * (E_residual / E_avg) * (d0 / max(d_to_BS, d0))E_residual是当前节点剩余能量E_avg是网络存活节点的平均能量。当节点能量高于平均水平时系数大于1被选为簇头的概率自然提升反之概率被压低。距离因子则让远离基站的节点适当降低当选概率因为这些节点当上簇头后单跳传输的能耗实在太高。其次稳定传输阶段引入了事件阈值判断。节点只有在采集到的数据超过预设阈值时才发送数据否则保持静默并继续休眠。这么做的好处是在没有异常事件发生的时段网络几乎不产生通信能耗一旦检测到温度、湿度超过阈值数据立刻被优先级拉满并上报。对突发型监测任务比如森林防火、化工园区气体泄漏来说这种机制能把能量用在“真正有事”的时候上。需要说明的是“TS-I-LEACH”这个名称在高水平文献中并不是唯一标准不同论文对它做过不同的组合改进。我这里给出的阈值感知加能量加权方案是对该方向常见思路的一种归纳整合。如果你在做毕业设计或者课题研究完全可以在这个框架上继续增加多跳路由、移动汇聚节点等扩展机制不影响整体结构的合理性。3. Matlab仿真环境与代码实现照着跑就能出结果3.1 仿真参数与全局配置Matlab版本建议用R2023b之后的版本旧版本跑这套代码也没问题但部分绘图函数和随机数接口建议做最小适配。我下面给的参数表完全对标LEACH经典论文里的实验配置这样你跑出来的结果可以直接和其他文献里的数据做横向比较不用自己重新标定。参数名取值说明部署区域100m × 100m经典二维平面场景节点数量100每个节点初始随机部署基站位置(50, 175)位于区域外200m高处附近初始能量0.5 J每个节点相同数据包大小4000 bit每次上报一个包控制包大小100 bit簇头广播和加入消息E_elec50 nJ/bit发射电路与接收电路能耗系数自由空间系数 ε_fs10 pJ/bit/m²短距离通信时使用多径衰减系数 ε_mp0.0013 pJ/bit/m⁴远距离通信时使用通信距离阈值 d087 m两种信道模型切换点簇头比例 P0.05目标每轮约5个簇头这里最要留意的是d0的取值。它由能量模型参数反推出来大约等于sqrt(ε_fs / ε_mp)在这个配置下约87米。当传输距离小于d0时用自由空间模型能耗随距离平方增长大于d0时切换成多径衰减模型能耗随距离的四次方增长。这个切换逻辑必须写对因为簇头到基站的距离往往超过d0基站远时能耗会指数级放大这也是LEACH单跳模式的一个天然瓶颈。3.2 网络初始化与能量模型节点在Matlab里用结构体数组最方便。每个节点需要维护位置、能量、存活状态、角色、上一轮是否当过簇头等字段。初始化代码没什么玄机关键是字段设计要完整不然后面统计时经常缺这个缺那个。% 全局配置 n 100; field_x 100; field_y 100; bs_x 50; bs_y 175; E0 0.5; E_elec 50e-9; eps_fs 10e-12; eps_mp 0.0013e-12; d0 sqrt(eps_fs / eps_mp); P 0.05; % 节点结构初始化 for i 1:n node(i).x field_x * rand; node(i).y field_y * rand; node(i).energy E0; node(i).alive 1; node(i).role 0; % 0普通节点1簇头 node(i).G 0; % 是否在本轮选举周期内当过簇头 end能量模型的核心是无线发送和接收的能耗函数。发送l bit数据到距离d的节点总能耗是发射电路能耗加上射频放大能耗接收l bit数据的能耗只算接收电路能耗。距离判断决定使用哪种射频放大模型。function cost sendCost(l, d, E_elec, eps_fs, eps_mp, d0) if d d0 cost l * E_elec l * eps_fs * d^2; else cost l * E_elec l * eps_mp * d^4; end end function cost recvCost(l, E_elec) cost l * E_elec; end特别说明一下接收能耗很多人会忽略但在簇头节点上这是大头。一个簇头要接收来自十几个普通节点的数据包每个包4000 bit接收电路能耗累加起来非常可观。所以仿真里必须把接收能耗给每个簇头扣掉否则结果偏差很大。3.3 LEACH主循环代码与解释LEACH的每一轮主要分三步选簇头、组簇、传数据。这一步是整轮能耗发生的核心阶段。簇头选择严格按阈值公式来需要注意mod(r, round(1/P))的语义如果P0.05round(1/P)20表示每20轮一个选举周期。节点G字段在选举周期内只要当过簇头就置0直到新一轮周期开始才重置。for r 1:max_round % 阶段1簇头选举 for i 1:n if node(i).alive 0 continue; end if node(i).G 0 T P / (1 - P * (mod(r, round(1/P)))); if rand T node(i).role 1; node(i).G round(1/P); % 标记已当簇头 cluster_head_list [cluster_head_list, i]; end end end % 阶段2普通节点入簇按最近距离 for i 1:n if node(i).alive 0 || node(i).role 1 continue; end min_d inf; for ch cluster_head_list d sqrt((node(i).x - node(ch).x)^2 (node(i).y - node(ch).y)^2); if d min_d min_d d; node(i).cluster_head ch; end end end % 阶段3普通节点发送簇头接收聚合转发 for ch cluster_head_list for i 1:n if node(i).alive 0 || node(i).cluster_head ~ ch continue; end d sqrt((node(i).x - node(ch).x)^2 (node(i).y - node(ch).y)^2); node(i).energy node(i).energy - sendCost(4000, d, E_elec, eps_fs, eps_mp, d0); node(ch).energy node(ch).energy - recvCost(4000, E_elec); end d_bs sqrt((node(ch).x - bs_x)^2 (node(ch).y - bs_y)^2); node(ch).energy node(ch).energy - sendCost(4000, d_bs, E_elec, eps_fs, eps_mp, d0); end end注意我在传输阶段先扣了普通节点的发送能耗再扣簇头的接收能耗和转发能耗。实际聚合后数据量通常小于4000 bit如果你想把模型做细可以在聚合函数里乘一个压缩比比如0.6让簇头发送能耗更贴近真实场景。这个参数控制“融合效率”也是很多对比研究的敏感变量。3.4 LEACH-C主循环代码与解释LEACH-C最大的不同是每轮开头的全局上报。所有存活节点把自己的坐标和剩余能量发给基站。基站拿到这些信息后先计算所有存活节点的平均能量只把当前能量超过平均值的节点放入候选簇头集合再用优化方法从候选集合里选出最终的簇头。实际的模拟退火代码比较长我在这里给出简化但能跑出趋势的贪心版本。它足够帮你理解LEACH-C的核心逻辑用全局信息去约束簇头质量和分布。% LEACH-C每轮开始前上报 for i 1:n if node(i).alive info(i, 1) node(i).x; info(i, 2) node(i).y; info(i, 3) node(i).energy; else info(i, 3) -1; end end % 筛选候选簇头能量高于平均能量 E_avg mean(info(info(:,3) 0, 3)); candidate find(info(:,3) E_avg); % 简化版簇头选取贪心地选分布均匀、能量高的组合 ch_list []; while length(ch_list) P * n ~isempty(candidate) best candidate(1); best_cost -inf; for i candidate min_d_to_ch min_dist_to_ch(i, ch_list, info); cost info(i, 3) * 0.6 - min_d_to_ch * 0.4; % 能量高且远离现有簇头 if cost best_cost best_cost cost; best i; end end ch_list [ch_list, best]; candidate(candidate best) []; end在真正做论文级仿真时你需要在基站侧运行模拟退火算法目标函数由普通节点到簇头的平均距离、簇头到基站的距离标准差、簇内节点数标准差共同构成。我这里用简化贪心替代是为了把计算负担压低让代码入门门槛降到最低。两种方式在“簇头均匀分布”这个趋势上是基本一致的只是数值上模拟退火会更优一点。LEACH-C的额外开销来自每轮上报。你可以把上报看作一个短消息包大小为100 bit发到基站也要按距离计算能耗。这个开销在总能耗里占比不高但会让网络后期的能量积攒更慢所以在FND和HND指标上LEACH-C的优势会随着轮数增加而逐渐缩小。3.5 TS-I-LEACH主循环代码与解释TS-I-LEACH在实现上比LEACH多出两块加权簇头选举和事件触发传输。第一块体现在改动后的阈值公式上。我把T(n)乘以能量系数和距离系数让高能量、离基站近的节点更容易成为簇头。E_avg mean([node(find([node.alive] 1)).energy]); for i 1:n if node(i).alive 0 continue; end if node(i).G 0 d_bs sqrt((node(i).x - bs_x)^2 (node(i).y - bs_y)^2); T_base P / (1 - P * (mod(r, round(1/P)))); energy_factor node(i).energy / E_avg; distance_factor d0 / max(d_bs, d0); T_improved T_base * energy_factor * distance_factor; if rand T_improved node(i).role 1; node(i).G round(1/P); end end end能量因子比较好理解关键是距离因子的分母取max(d_bs, d0)而不是直接用d_bs否则离基站很近时distance_factor会大于1把阈值抬得过高。用d0兜底后距离因子的最大值是1不会破坏概率阈值的上界。同时base阈值本身也可能超过1所以代码里还需要加一句if T_improved 1T_improved 1的保护。事件触发传输的实现是在普通节点发送数据之前加一个检测逻辑。仿真里我会为每个节点生成一条模拟感知数据当数据值超过预设阈值时节点才发送低于阈值时本轮节点保持静默。对周期性上报需求来说事件触发会明显降低上报频率对温度、湿度、振动这类事件导向的场景数据和真实监测需求是匹配的。sensor_data randn(1, n) 0.5; % 模拟感知数据均值为0.5 event_threshold 0.9; % 超过阈值才上报 for i 1:n if node(i).alive 0 || node(i).cluster_head ~ ch continue; end if sensor_data(i) event_threshold continue; % 无事件不发送 end d sqrt((node(i).x - node(ch).x)^2 (node(i).y - node(ch).y)^2); node(i).energy node(i).energy - sendCost(4000, d, E_elec, eps_fs, eps_mp, d0); node(ch).energy node(ch).energy - recvCost(4000, E_elec); end感兴趣的话你可以在仿真里把event_threshold分别设成0.5、0.9、1.5观察网络生命周期和基站接收数据量的变化。阈值越高上报次数越少节点能耗越低但同时基站获得的数据也越稀疏。如何权衡这个阈值本身就是事件驱动型WSN路由研究里的一个重要方向。4. 跑完看什么生命周期、能耗与吞吐量的对比分析4.1 结果统计口径FND、HND、LND的用法仿真跑完后原始数据是一堆轮次和节点能量记录。直接看可能看不出差别所以要用几个标准指标来压缩信息。最常用的三个是FND第一个节点死亡时的轮数、HND一半节点死亡时的轮数、LND最后一个节点死亡时的轮数。FND代表网络首次出现覆盖空洞的时刻很多应用里FND就是网络寿命的有效终点因为从这一刻起局部区域可能已经失去了监测能力。HND更能反映整体能耗均衡性一个协议如果只延长FND但HND大幅提前说明它很可能把能耗转移到了其他节点上属于“局部优化”。LND则反映理论上的上限实际意义相对小一些但可以用来对比能耗利用效率。除了生命周期还需要统计每轮结束时网络的剩余总能量以及基站累计接收到的有效数据包数量。前者反映协议的整体能量效率后者反映协议在“有效数据送达”上的表现。事件触发型协议在数据包数量上肯定低于周期性上报因此做对比时一定要结合场景解释不能单纯看一个数据量指标。4.2 三协议在相同参数下的典型表现以我这次仿真为例运行100个节点、基站位于(50,175)、P0.05、初始能量0.5J的经典配置统计得到如下这里给的是多次随机种子下的大致范围指标LEACHLEACH-CTS-I-LEACHFND首个节点死亡轮数约1100-1300约1300-1600约1500-1800HND半数节点死亡轮数约1500-1800约1700-2000约1900-2200LND末节点死亡轮数约2200-2600约2300-2700约2400-2800每轮平均剩余能量低中高基站接收数据包数量最多多视事件阈值而定需要特别说明这张表不是“普适真理”而是基于上述参数配置下的典型区间随机种子不同数值会波动。但趋势是稳定的LEACH-C的FND和HND都要优于LEACH原因是它避免了低能量节点被随机选中当簇头的极端情况网络能耗更均匀。TS-I-LEACH在能量加权的基础上又减少了空闲上报所以整体生命周期又比LEACH-C长一截代价是基站接收的数据包明显更少。如果你跑出来的结果不是这个趋势优先检查三件事。第一是否给普通节点记了接收能耗第二LEACH-C的优化函数是否真的考虑了簇头分布均匀性而不是只按能量排序第三事件触发的阈值是否设置得过于宽松导致它实际上变成了周期性上报。4.3 不同应用场景怎么选协议仿真结果最终要回答“什么场景该选谁”。我的判断口径是这样的如果应用是固定周期、高频采集比如温室大棚的温湿度连续监测网络每轮都有大量数据要上报这种情况下LEACH-C的集中式分簇优势最明显因为它在保证数据全量上报的同时把能耗压得更低。如果应用是异常事件驱动型比如化工园区气体泄漏监测、山体滑坡预警平时数据变化小、跑一次仿真网络大部分时间都在空转这时TS-I-LEACH的事件触发特性是最匹配的。它能在低功耗待机和快速响应之间取得平衡代价是需要额外调好事件阈值。如果网络规模很大或者基站部署位置不稳定LEACH-C对中心节点的依赖就会成为瓶颈。此时应该考虑分布式改进协议不一定非要逐字复刻TS-I-LEACH但可以借鉴它的能量加权和距离因子做成完全局部决策兼顾可扩展性和能耗均衡。5. 实操避坑指南Matlab调试与参数敏感性心得5.1 报错复盘最常出现的5类问题我在调试这套代码时踩过不少坑整理成下面这张速查表应该能帮你节省大量排查时间。报错现象可能原因处理办法出现负能量节点发送/接收能耗扣重复了或者普通节点和簇头重叠扣费打印每轮的节点收发记录检查单个节点的能量变化轨迹某轮没有簇头阈值T(n)接近0或随机数一直偏大增加一轮选举次数兜底若该轮无簇头则从存活节点中强制随机选一个死循环卡住所有节点都死亡后还在循环选簇头主循环加存活节点数判断存活数小于等于0时直接break存活节点曲线剧烈波动随机种子不同导致单次实验偏差大用rng固定种子并运行多次取平均结果与文献对不上d0算错了或者簇头比例P设置不一致检查能量模型参数的单位经典配置d0约87米5.2 随机性与重复实验为什么每次结果不一样LEACH系协议本质是随机算法你每跑一次rng种子结果都会不同。只跑一次就下结论是仿真大忌。我在实际研究中固定用多个种子跑20次以上统计均值和标准差。Matlab里设置种子很简单rng(2024); % 固定种子多种子批量跑的时候建议把外层循环写成parforMatlab并行计算工具箱可以轻松加速。但注意parfor内部不能有全局变量写入冲突推荐每个worker单独维护一个结果矩阵跑完再合并。如果只是想快速验证协议能否跑通一次运行也够但要写进论文或技术报告必须做重复实验并给误差线。5.3 从“跑通”到“研究”改进算法的常见思路代码能跑通是第一步但“能跑”和“能产出结论”之间还有一段距离。围绕LEACH的改进研究比较成熟的方向有几类。一类是簇头选举改进。在阈值公式里加入剩余能量、节点密度、历史能耗等因子或者把能量因子做成指数加权防止节点能量略微高于平均就狂当簇头。另一类是多跳路由与异构节点设计。簇头不直接发基站而是沿基站方向找邻近簇头转发这样能把远距离单跳变成多段短跳缓解远距离簇头的负担。再有一类是把移动汇聚节点、无人机采集、充电节点等现实约束纳入仿真模型让仿真结果更贴近工程落地。做这些改进时一定要守住对比实验的公平性三种协议必须在完全相同的部署、能量参数、信道模型和轮次调度下运行只改变协议本身的分簇和传输逻辑。否则改一个变量所有结果都会失去可比性后面写论文也会被审稿人抓细节。我个人在实际测试中的体会是LEACH这个模型的价值不在于“性能有多优越”而在于它把分布式分簇路由中最本质的能量均衡问题暴露得足够清楚。不管你是准备毕业设计的初学者还是工作中需要选型评估的工程师把LEACH、LEACH-C和TS-I-LEACH这三套源码全部吃透再去做任何路由层面的优化都会稳很多。最后分享一个小技巧仿真里保存每一轮每个节点的能量、角色、收发记录时建议直接存成结构化表格比如用数组的第三维标记轮次。后期画热力图、绘制能耗空间分布图时这些原始数据就是最宝贵的素材比每次重新跑一遍仿真高效得多。这个习惯我用了很多年强烈推荐。