clear all
close all
clc
%eepb vs eepb_im算法
%1. 初始参数设定模块
%.传感器节点区域界限(单位 M)
xm=100;
ym=100;
% 汇聚节坐标给定
sink.x=0.0*xm;
sink.y=0.0*ym;
%区域内传感器节点数
node_number=100;
datanum=200;
%能量模型(单位 焦)
%初始化能量模型
Eo=1;
%Eelec=Etx=Erx
ETX=50*10^(-9);
ERX=50*10^(-9);
%Transmit Amplifier types
Efs=100*10^(-12);
Emp=0.0013*10^(-12);
%Data Aggregation Energy
EDA=5*10^(-9);
%Data Aggregation 融合后剩下的数据比率 融合率为:1-DA 完全融合时融合率为100% DA=1-100%=0 这里融合率为0.6
DA=0.6;
datanum1=DA*datanum;
%最大循环次数
rmax=800;
%算出参数 do
do=sqrt(Efs/Emp);
%2.无线传感器网络模型产生模块
%构建无线传感器网络,在区域内均匀投放100个节点,并画出图形
node_x=100*rand(1,node_number);%节点的X值
node_y=100*rand(1,node_number);%节点的Y值
%plot(node_x,node_y,'.')%节点撒完,且设为均匀分布
hold on
for i=1:node_number
S1(i).E=Eo;
S2(i).E=Eo;
S1(i).Q=0;
S2(i).Fd=0;
S2(i).Fe=0;
S2(i).F=0;
Emax(i)=S1(i).E;
end
%1.首先假设簇头节点与SINK通信的距离为每一个节点与SINK的平均距离
%2.算法先找到最远的一个节点,从这个节点开始构.入簇的节点就不再入簇.令牌很小,相当于在数据传输的时候再加一个小数据量
%3.能耗包括找邻居节点,包括稳定传输,先算稳定传输时候
%4.可能要算一个延时.
%3 eepb 网络运行模块
% 死亡节点数
flag_first_dead1=0;
flag_teenth_dead1=0;
flag_half_dead1=0;
flag_all_dead1=0;
dead1=0;
first_dead1=0;
teenth_dead1=0;
half_dead1=0;
all_dead1=0;
%活动节点数
allive1=node_number;
%counter for bit transmitted to Bases Station
packets_TO_BS1=0;
%(1)循环模式设定
for r=0:1:rmax %该 for 循环将下面的所有程序包括在内,直到最后一 end 才结束循环
r
%(2)死亡节点检查模块
dead1=0;
for i=1:1:node_number
%检查有无死亡节点
if (S1(i).E<=0)
dead1=dead1+1;
%(3)第一个死亡节点的产生时间(用轮次表示)
%第一个节点死亡时间
if (dead1==1)
if(flag_first_dead1==0)
first_dead1=r;
flag_first_dead1=1;
end
end
%10%的节点死亡时间
if(dead1==0.1*n)
if(flag_teenth_dead1==0)
teenth_dead1=r;
flag_teenth_dead1=1;
end
end
%50%的节点死亡时间
if(dead1==0.5*n)
if(flag_half_dead1==0)
half_dead1=r;
flag_half_dead1=1;
end
end
if(dead1==n)
if(flag_all_dead1==0)
all_dead1=r;
flag_all_dead1=1;
end
end
end
end
STATISTICS.DEAD1(r+1)=dead1;
STATISTICS.ALLIVE1(r+1)=allive1-dead1;
%计算平均余能模块
Et1(r+1)=0;
for i=1:1:node_number
if (S1(i).E>0)
Et1(r+1)=Et1(r+1)+S1(i).E;
end
end
if (STATISTICS.ALLIVE1(r+1)>0)
%Eavg1=Et1/STATISTICS.ALLIVE1(r+1);
Eavg1(r+1)=Et1(r+1)/(node_number*Emax(i));
else
Eavg1(r+1)=0;
end
% (3)建链过程
p=0.15;n=fix(1/p);
distance=zeros(1);
max_distance=0;
max_node=0;
for i=1:node_number,
distance(i)=sqrt((node_x(i)-sink.x)^2+(node_y(i)-sink.y)^2);
if max_distance<distance(i),
max_distance=distance(i);
max_node=i;
end
end
%plot(node_x(max_node),node_y(max_node),'.')%节点撒完,且设为均匀分布
hold on
average_distance=sum(distance(:))/node_number;
connect_distance=zeros(1,node_number);%连接距离
connect_node=zeros(1,node_number);%连接节点的号码,SINK用0表示
connect_node(1)=max_node;
connect_distance(1)=average_distance;
for i=2:node_number,
temp_node=0;temp_min_distance=150;
for j=1:node_number,
b=0;
for k=1:(i-1),
if j==connect_node(k),
b=1;
break
end
end
if b==0,
distance=sqrt((node_x(connect_node(i-1))-node_x(j))^2+(node_y(connect_node(i-1))-node_y(j))^2);
if temp_min_distance>distance,
temp_min_distance=distance;
temp_node=j;
end
end
end
connect_distance(i)=temp_min_distance;
connect_node(i)=temp_node;
% plot([node_x(connect_node(i-1)) node_x(connect_node(i))],[node_y(connect_node(i-1)) node_y(connect_node(i))],'-');
hold on
end
%(4)链首轮换选择
Q_max=0;
L_node=0;
for i=1:node_number
if S1(i).E>0
distance_to_bs(i)=sqrt((node_x(connect_node(i))-sink.x)^2+(node_y(connect_node(i))-sink.y)^2);
S1(i).Q=S1(i).E/distance_to_bs(i);
if Q_max<S1(i).Q
Q_max=S1(i).Q;
L_node=i;
end
k=L_node;
S1(k).E=S1(k).E-((ETX+EDA)*(datanum)+ETX*datanum+datanum*Emp*(distance_to_bs(k)*distance_to_bs(k)*distance_to_bs(k)*distance_to_bs(k)));
%jisuan nenghao
for j=1:k-1
if connect_distance(j)>do
S1(j).E=S1(j).E- ((ETX+EDA)*(datanum)+ETX*datanum+datanum*Emp*(connect_distance(j+1)*connect_distance(j+1)*connect_distance(j+1)*connect_distance(j+1)));
end
if connect_distance(j)<=do
S1(j).E=S1(j).E- ((ETX+EDA)*(datanum)+ETX*datanum+datanum*Efs*(connect_distance(j+1)*connect_distance(j+1)));
end
end
for j=k+1:node_number
if connect_distance(j)>do
S1(j).E=S1(j).E- ((ETX+EDA)*(datanum)+ETX*datanum+datanum*Emp*(connect_distance(j)*connect_distance(j)*connect_distance(j)*connect_distance(j)));
end
if connect_distance(j)<=do
S1(j).E=S1(j).E- ((ETX+EDA)*(datanum)+ETX*datanum+datanum*Efs*(connect_distance(j)*connect_distance(j)));
end
end
end
%receive_factor=512*50*0.0001;%接收一个节点数据需要的能量
%receive_consumption=100*receive_factor;%第一步,不变的能量:簇头节点接收别人信号的总能量
%energy_consumption=zeros(1,node_number);
%send_factor=512*12*0.001;%发送单位数据到单位距离需要的能量
%第二步每一个节点的一跳发送能量
%for i=1:node_number,
% energy_consumption(i)=connect_distance(i)^2*send_factor+receive_factor;
%end
%consumption=receive_consumption+sum(energy_consumption(:))
%plot(1:100,energy,'.')
%hold on
end
end
%3.4.new 网络运行模块
%死亡节点数
flag_first_dead2=0;
flag_teenth_dead2=0;
flag_half_dead2=0;
flag_all_dead2=0;
dead2=0;
first_dead2=0;
teenth_dead2=0;
half_dead2=0;
all_dead2=0;
%活动节点数
allive2=node_number;
%counter for bit transmitted to Bases Station and to Cluster Heads
packets_TO_BS2=0;
%(1)循环模式设定
for r=0:1:rmax %该 for 循环将下面的所有程序包括在内,直到最后一 end 才结束循环
r
%(2)死亡节点检查模块
dead2=0;
for i=1:1:node_number
%检查有无死亡节点
if (S2(i).E<=0)
dead2=dead2+1;
%(4)第一个死亡节点的产生时间(用轮次表示)
%第一个节点死亡时间
if (dead2==1)
if(flag_first_dead2==0)
first_dead2=r;
flag_first_dead2=1;
end
end
%10%的节点死亡时间
if(dead2==0.1*n)
if(flag_teenth_dead2==0)
teenth_dead2=r;
flag_teenth_dead2=1;
end
end
%50%的节点死亡时间
if(dead2==0.5*n)
if(flag_half_dead2==0)
half_dead2=r;
flag_half_dead2=1;
end
end
if(dead2==n)
if(flag_all_dead2==0)
all_dead2=r;
flag_all_dead2=1;
end
end
end
end
STATISTICS.DEAD2(r+1)=dead2;
STATISTICS.ALLIVE2(r+1)=allive2-dead2;
%计算平均余能模块
Et2(r+1)=0;
for i=1:1:node_number
if (S2(i).E>0)
Et2(r+1)=Et2(r+1)+S2(i).E;
end
end
if (STATISTICS.ALLIVE2(r+1)>0)
%Eavg2=Et2/STATISTICS.ALLIVE2(r+1);
Eavg2(r+1)=Et2(r+1)/(node_number*Emax(i));
else
Eavg2(r+1)=0;
end
% (3)建链过程
p=0.15;n=fix(1/p);
distance=zeros(1);
max_distance=0;
max_node=0;
for i=1:node_number,
distance(i)=sqrt((node_x(i)-sink.x)^2+(node_y(i)-sink.y)^2);
if max_distance<distance(i),
max_distance=distance(i);
max_node=i;
end
end
%plot(node_x(max_node),node_y(max_node),'.')%节点撒完,且设为均匀分布
hold on
average_di