LEACH&LEACH-C仿真分析(3) 收藏
转自:http://blog.csdn.net/xinxiuz/archive/2010/03/10/5364846.aspx
对LEACH及LEACH-C的仿真结果产生的几个文件开始分析,具体的仿真步骤就不介绍了哈。自己看哦!
leach.alive, leach.energy, leach.data, leach.err, leach.out我个人觉得有点价值的就是这5个文件。因为我的。TCL脚本文件没有记录.tr和.nam。
1。leach.err里面主要就是提示仿真过程中的一些错误信息,如果在仿真完成后,该文件中的内容是
INITIALIZE THE LIST xListHead
channel.cc:sendUp - Calc highestAntennaZ_ and distCST_
highestAntennaZ_ = 1.5, distCST_ = 222.8
SORTING LISTS ...DONE!
代表一切正常。
2。leach.out我目前觉得没有什么分析的价值,它好象是对整个仿真过程数据的一个记录过程,从初始化节点,创建节点。记录节点的坐标。一些警告信息,在每个时间间隔内,总的能量消耗,总的数据传输量,总的节点存活数。节点什么时候与BS传输信息等等。由于我的该文件有很多警告信息,所以不是很好看。也没分析。以后学习中可能会有个分析出炉。
3。leach.alive的分析。AWK文件在我前面的文章中有,这我就不重复介绍了。.alive 文件第一行是运行时间,第二行就节点ID,第三行记录的是节点状态,如果是1,表示该节点还存活,如果是0,则表示节点死亡
4。leach.energy的分析是我今天介绍的重点之一。因为之前的.awk文件都是在网上搜索的,只知道用该文件以及一定的命令就可以用它来对目标文件进行提取。今天自己看了看分析leach.alive文件的.awk文件。我自己写了个energy.awk文件如下:
energy.awk脚本文件
BEGIN {
countcyl=0; //计数器,用来记录当前的轮数 或者当前的时段数
energysum=0; //用来暂时储存当前时段的节点消耗能量总和
lasttime=0; //记录当前最后的时间
time[0]=0; //存储各(轮)分段的时间
sum[0]=0; //存储各分段时间对应的消耗的能量
}
{
simtime = $1; //文件中第一字段的值,当前时间
nodeid = $2; //。。。第二字段的值,节点ID
nodeenergy = $3; //。。。第三字段的值,当前节点使用的能量
if (simtime>lasttime ) { //这里就是一个简单的方法来提取每个时间段,节点总共消耗了多少能量
energysum=0;
countcyl++;
lasttime=simtime;
time[countcyl]=simtime;
}
if (simtime==lasttime ) {
if (nodeenergy<2.0) {
energysum=energysum+nodeenergy;
sum[countcyl]=energysum;
}
else if (nodeenergy>=2.0) { //节点初始的总能量为2
energysum=energysum+2.0;
sum[countcyl]=energysum;
}
}
}
END { //对应时间段,得出能量消耗量并打印
for(i=0;i<=countcyl;i++)
printf ( "%f %f/n",time[i],sum[i]);
}
这个就是我的分析思路。具体gawk命令我就不再介绍了。
5。接下来的leach.data的分析和上面4。的分析基本上差不多,在这里我要介绍一下的是,.data文件第3个字段的涵义困扰了我很久。今天查了下原始英文资料是这样介绍的:
Leach produces many data files that are stored in the directory of leach_sims. In leach.data, the first column denotes the time, more precisly the time at the beginning of every round; the second column denotes the ID of a node; the third column stands for the number of packets that are sent by this node and sucessfully received by the base station.
我的理解是,第3列代表的意思是,节点当前时间内,节点发送且被BS成功接收的数据包的个数。
所以我就写了以下一个data.awk文件来记录每个时间段(可以理解为每轮),协议发包且成功接收的总数。如下:
BEGIN {
countcyl=0;
packetsum=0; //当前时间发包且接收的总数
lasttime=0;
time[0]=0;
sum[0]=0;
}
{
simtime = $1;
nodeid = $2;
packet = $3; //读取当前时间,当前节点的发包且被成功接收的数目
if (simtime>lasttime ) { //具体算法
packtsum=0;
countcyl++;
lasttime=simtime;
time[countcyl]=simtime;
}
if (simtime==lasttime ) {
packetsum=packetsum+packet;
sum[countcyl]=packetsum;
}
}
END { //对应时段,打印发包总量。
for(i=0;i<=countcyl;i++)
printf ( "%f %f/n",time[i],sum[i]);
}
差不多都介绍完了吧!上图!
照片描述:与那张100,100是一样的,就是BS站的位置不一样!其他的分析脚本文件和环境参数全部一样!
左上这个图我们已经很熟悉了,之前已经发过。现在我们来看看右上这个图(对.energy的对比分析),很明显可以看到,LEACH和LEACH-C的能量消耗曲线是交替上升,不好分出优劣。而在520秒左右的时候,节点能量先达到了200J(100个节点,每个节点2J)。过了80多秒左右后,LEACH-C的能量曲线才达到200。
下面这个图,是对.data的对比分析。这个图可以很清晰的看到,在一直的过程中,LEACH-C发送的包都是比LEACH要多的,并且在520秒之后,LEACH所有节点全部死亡,LEACH-C仍有发包成功。我可以这样理解吧。相同的能量消耗,在相同特定环境下,最后使用LEACH-C采集到的数据包更多。
最后附上我GNUPLOT的命令吧,如何画多图:
gnuplot> set multiplot //设置多图模式
multiplot> set origin 0.0,0.5 //设置第一个图的0,0点的坐标
multiplot> set size 0.5,0.5 //设置图大小
multiplot> plot 'l-a-2.gnuplot' with linespoint,'lc-a-2.gnuplot' with linespoint //画图
multiplot> set origin 0.5,0.5
multiplot> set size 0.5,0.5
multiplot> plot 'l-e-2.gnuplot' with linespoint,'lc-e-2.gnuplot' with linespoint
multiplot> set origin 0.33,0.0
multiplot> set size 0.5,0.5
multiplot> plot 'l-d-2.gnuplot' with linespoint,'lc-d-2.gnuplot' with linespoint
没有迈不过的坎,没有翻不过的山。学如此,人生亦如此!加油,一切都会好起来
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xinxiuz/archive/2010/03/10/5364846.aspx
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qq361301276/archive/2010/05/31/5638135.aspx