无线网络协议原理-实验报告
武
汉
工
程
大
学
计算机科学与工程学院
《无线网络协议原理》实验报告
专业班级
实验地点
学生学号
指导教师
学生姓名
实验时间
实验项目 实验二:LEACH 协议仿真实验 实验类别 操作性( )
验证性()
设计性( √
)
综合性( )
其它( )
实验目的及要求
(1)实验目的 通过此实验使学生加深理解 leach 成簇协议,分析算法优、缺点。
(2)实验要求 a)
编写簇头选举代码; b) 编写普通节点加入簇代码; c) 编写能量消耗代码; d) 和 PEGASIS 协议实验结果对比并分析原因。
e) 尝试对节点初始能量不均匀情况改进簇头选举算法。
成 绩 评 定 表 类
别 评 分 标 准 分值 得分 合
计 上机表现 积极出勤、遵守纪律 主动完成实验设计任务
0 30 分
程序代码 比较规范、基本正确 功能达到实验要求
0 30 分
实验报告 及时递交、填写规范 内容完整、体现收获
0 40 分
说明:
评阅教师:
日 期:
年
月
日
实 验 内 容 一、实验目的 1 编写 WSN 网络节点生成代码 2 编写簇头选举代码 3 编写普通节点加入簇代码 4 编写路由能量消耗代码 5 尝试对节点初始能量不均匀情况改进簇头选举算法(可选)
6 画出分簇效果图 7 和 PEGASIS 协议能量消耗性能对比并分析原因
二、实验准备
1、实验中会用到的库函数有 rand()函数:随机数生成函数,即生成 0~1 的随机数,里面参数表示矩阵大小 Round()函数:四舍五入取整函数 Plot()函数:二维曲线绘图函数 2、掌握 LEACH 协议的基本类容,根据簇的划分以及簇头的选择编写代码
并得到仿真结果。
设置区域范围、节点坐标、区域内节点数目、节点成为簇头概率以及各种能
量和最大轮数的设定 利用 rand()函数创建随机的传感器网络,并设定汇聚节点位置 根据节点能量是否大于零来判断节点是否死亡并在图中画出节点的位置,死 亡的节点用红点表示,没有死亡的普通节点用“。”表示并用 plot()函数画出 这些节点的曲线图 根据 LEACH 协议中簇头节点的选取要求选出簇头,根据簇头节点的坐标用 plot()函数在图上将簇头表示黑*,并计算簇头节点到汇聚节点的距离,将距 离与通信路径进行比较计算出各簇头的能量消耗 选取正常节点的相关簇头,在 n 个节点中选取出节点类型为 N 且能量大于 零的节点,计算这些节点到汇聚界定的距离,设定距离最小最小簇头数为 1, 计算该节点与各簇头的距离,取最小距离的簇头节点为该节点簇头,并计算 出各普通节点的能量消散 用 plot()函数画出各簇头节点和普通节点的划分图
三、实验步骤
clear;
xm=100;
ym=100;//设置区域为 100*100
sink.x=0.5*xm;
sink.y=0.5*ym;//汇聚节点坐标
n=100 //区域内节点数目
p=0.1; //节点成为簇头的概率
Eo=0.5;//节点初始能量
ETX=50*0.000000001;//发射单位报文损耗能量
ERX=50*0.000000001;//接收单位报文损耗能量
Efs=10*0.000000000001;//自由空间能量
Emp=0.0013*0.000000000001;//衰减空间能量
EDA=5*0.000000001;多路径衰减能量
rmax=20 最大的轮数 do=sqrt(Efs/Emp);//计算通信路径 do 1、下面利用 for 循环语句和 rand()函数在 n 个节点中随机生成普通节点类型的节点,并表示出它的坐标以及初始能量,普通类型节点用‘N’表示。(请按要求在“*”处填上合适的代码)
for ****** for i=1:1:n
S(i).xd=rand(1,1)*xm;
S(i).yd=rand(1,1)*ym;
S(i).G=0;
S(i).type="N";
S(i).E=Eo;
end ****
End 定义汇聚节点的位置坐标 S(n+1).xd=sink.x;
S(n+1).yd=sink.y; cluster=1; 利用 for 循环语句初始化每个节点的簇头节点 for r=0:1:rmax
if(mod(r, round(1/p) )==0)
for i=1:1:n
S(i).G=0;
end
end
hold off;
figure(1); 2、请分析下段代码的功能。
for i=1:1:n
if (S(i).E<=0)
plot(S(i).xd,S(i).yd,"red .");
hold on;
end
if (S(i).E>0)
S(i).type="N";
plot(S(i).xd,S(i).yd,"o");
hold on;
end
end plot(S(n+1).xd,S(n+1).yd,"x");
plot(S(n+1).xd,S(n+1).yd,"red ."); cluster=1;
功能:利用 for 语句判断每个节点是否死亡,如果节点能量小于零则节点死亡,并用 plot()函数在图上表示出该节点的位置,用‘red.’表示死亡的节点。反之则节点没有死亡,将节点类型定义为普通节点,并用并用 plot()函数在图上表示出该节点的位置,用‘。’表示未死亡的普通节点。并表示出汇聚节点的位置,并将其记为第一个簇头,判断节点是否死亡 。
3、利用 for 语句和 if 语句根据 LEACH 协议的簇头选取规则在 n 个节点中选出簇头节点,将簇头节点的类型用‘C’表示,并将选出的接待点的坐标赋值给簇头 C(cluster),并用 plot()函数将簇头节点的位置在图中用‘k*’表示。然后计算该点到汇聚节点的距离并将该距离赋值给簇头到汇聚节点的距离 C(cluster).distance。并记录得到的簇头节点是 n 个节点中的哪一个,给簇头的 X、Y 坐标赋值并将簇头总数加一。最后通过比较各簇头节点到汇聚加节点的距离和通信半径的距离计算出簇头节点的能量耗散(请按要求补全下列横线处的代码)
for i=1:1:n //簇头的选择
if(S(i).E>0)
temp_rand=rand;
if ((S(i).G)<=0)
if(temp_rand<= (p/(1-p*mod(r,round(1/p)))))
S(i).type= “C”
;
S(i).G=round(1/p)-1;
C(cluster).xd=
S(i).xd
;
C(cluster).yd=
S(i).yd
;
plot(
S(i).xd,S(i).yd,"k*"
);
distance=
sqrt( (S(i).xd-(S(n+1).xd) )^2 + (S(i).yd-(S(n+1).yd) )^2 )
;
C(cluster).distance=
distance
;
C(cluster).id=
i
;
X(cluster)=
S(i).xd
;
Y(cluster)=
S(i).yd
;
cluster=
cluster+1
;
distance;
if (distance>do)
S(i).E=
S(i).E-(ETX+EDA)*(4000)+Emp*4000* ( distance*distance*distance*distance ));
end
if (distance<=do)
S(i).E=
S(i).E- ( (ETX+EDA)*(4000)
+ Efs*4000*( distance * distance ))
;
end
end
end
end
end 4、利用 for 循环对普通节点进行簇的划分即对普通节点选取相关簇头,首先初始化该点的通信最短距离,即该点到汇聚节点的距离,并记录下它的簇头为汇聚节点。然后将该普通节点与全部的簇头节点进行距离计算并与它与汇聚节点的距离进行比较,将距离的最小值赋值给 min_dis。然后计算普通节点和簇头节点的能量耗散,记录该普通节点的簇头节点和到簇头节点的距离。(请按要求补全下列横线处的代码)
for i= 1:1:n
//选取正常节点的相关簇头
if ( S(i).type=="N" && S(i).E>0 )
if(cluster-1>=1)
min_dis=
sqrt( (S(i).xd-S(n+1).xd)^2 + (S(i).yd-S(n+1).yd)^2 )
;
min_dis_cluster=
1
;
for
c=1:1:cluster-1
temp=min(min_dis,
sqrt( (S(i).xd-C(c).xd)^2 + (S(i).yd-C(c).yd)^2 )
);
if ( temp<min_dis )
min_dis=temp
;
min_dis_cluster=c;
;
end
end
if (min_dis>do)
//普通节点能量耗散
S(i).E=
S(i).E- ( ETX*(4000) + Emp*4000*( min_dis * min_dis * min_dis * min_dis));
;
end
if
(min_dis<=do)
S(i).E= S(i).E- ( ETX*(4000) + Efs*4000*( min_dis *
min_dis))
;
end
if(min_dis>0)
//簇头节点能量耗散
S(C(min_dis_cluster).id).E =
S(C(min_dis_cluster).id).E- ( (ERX + EDA)*4000 )
;
end
S(i).min_dis=
min_dis
;
S(i).min_dis_cluster=
min_dis_cluster
;
end
end
end
hold on; 5、分析下列代码的功能。
[vx,vy]=voronoi(X,Y);
plot(X,Y,"r*",vx,vy,"b-");
hold on;
axis([0 xm 0 ym]);
功能:输出对区域内节点的划分图。
四、实验分析 请根据仿真结果对测试结果进行分析
>> LEACH
n = 100 rmax = 20
上一篇:用友软件实验报告书