📄 nojunyunevote2new.m.txt
字号:
%ddddddddddddddddddddd 基于选票分簇算法的能量消耗--非均匀分簇 ddddddddddddddddddddddddddd
%开始每个节点广播ID号和当前能量;接收计算,每个节点广播ID号和当前选票和适宜性(或节点度)
%接收,若本节点选票最多,作为簇头,并广播本节点ID号结束;簇成员节点接受簇头信息,加入并广播本节点ID号结束。
%能量消耗包括两部分:簇形成阶段的能耗和数据传输阶段的能耗。
%dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
N=50; %节点个数
f=1; %最后结果数组下标,50-500, 每隔50取一数,共有10
while N<=500
g=5; %相同条件下的重复次数
for t=1:g
%dddddddddddddddddddddddddddddd 节点配置 dddddddddddddddddddddddddddddddddddddd
% radius=25; %广播距离
X_axis=100; %x轴长度 代表节点分布范围中的一维
Y_axis=100; %y轴长度 代表节点分布范围中的另一维
Loca=[X_axis*rand(1,N);Y_axis*rand(1,N)]'; %产生坐标矩阵
for i=1:N
e(i)=10; %节点的能量
Eprog(i)=0;
end
er=0.533*10^(-6);
et=1.066*10^(-6);
eta=3.076*10^(-9);
efuse=1.8*10^(-7);
es=1.75*10^(-7);
D=-175;
c=0.2;
dopt=sqrt((er+et)/eta);
radius=dopt/2; %广播距离
dT=210; %门限距离,小于直接传输到网关,大于多跳到网关
%ddddddddddddddddddddddddddddd 节点位置示意图 dddddddddddddddddddddddddddddddd
%plot(Loca(:,1),Loca(:,2),'o')
%ddddddddddddddddddddddddddd 计算邻居节点矩阵 ddddddddddddddddddddddddddddddddddddddd
for i=1:N
d(i)=0; %节点的度
end
for i=1:N
for j=i:N
dis(i,j)=sqrt((Loca(i,1)-Loca(j,1))*(Loca(i,1)-Loca(j,1))+(Loca(i,2)-Loca(j,2))*(Loca(i,2)-Loca(j,2))); %存放节点间距离
dis(j,i)=dis(i,j);
end
end
dmax=0;
dmin=250;
for i=1:N
dis(i,N+1)=sqrt((Loca(i,1))*(Loca(i,1))+(Loca(i,2)-D)*(Loca(i,2)-D)); %存放节点到网关的距离
if dis(i,N+1)>dmax
dmax=dis(i,N+1);
end
if dis(i,N+1)<dmin
dmin=dis(i,N+1);
end
end
for i=1:N
r(i)=radius*(1-c*(dmax-dis(i,N+1))/(dmax-dmin));
for j=1:N
if dis(i,j)<=r(i)&&i~=j
d(i)=d(i)+1;
neibor(i,d(i))=j;
end
end
if d(i)==0
neibor(i,1)=0;
end
end
for i=1:N
n1=ceil(dis(i,N+1)/dopt);
syms k;
n2=double(symsum(1/k,1,n1));
dn(i)=dis(i,N+1)/n2;
end
%ddddddddddddddddddddddddddd 节点布置后,直到所有节点能量耗尽,所经历的轮数 ddddddddddddddddddddddddddddddddddddddd
lunum=0;
flag2=1;
Ecluz=0;
Edataz=0;
flag3=0;
Nper=10;
dienote=0;
while flag2==1
%ddddddddddddddddddddddddddd 计算节点初始阶段的能量消耗 ddddddddddddddddddddddddddddddddddddddd
for i=1:N
Edata(i)=0;
Einit(i)=0;
Eprog(i)=0;
end
for i=1:N
if e(i)~=0
Einit(i)=(6*8+8*8+8*8)*(eta*r(i)^2+et)+d(i)*(6*8+8*8+8*8)*er;
end
end
%ddddddddddddddddddddddddddd 计算节点初始选票 ddddddddddddddddddddddddddddddddddddddd
for i=1:N
if e(i)~=0
E(i)=e(i);
if d(i)~=0
for k=1:d(i)
E(i)=E(i)+e(neibor(i,k));
end
end
v(i,i)=e(i)/E(i);
if d(i)~=0
for k=1:d(i)
v(i,neibor(i,k))=e(neibor(i,k))/E(i);
end
end
end
end
for i=1:N
if e(i)~=0
if d(i)==0
fitness(i)=e(i);
else
fitness(i)=e(i)/d(i); %节点的适应性
end
curvote(i)=v(i,i);
if d(i)~=0
for k=1:d(i)
curvote(i)=curvote(i)+v(neibor(i,k),i); %节点的总选票
end
end
end
end
%ddddddddddddddddddddddddddd 查找本节点是否是邻居集合中最多选票的节点,如是发簇头广播 ddddddddddddddddddddddddddddddddddddddd
for i=1:N
CH(i)=0;
cluster_head(i)=0;
end
for i=1:N
if e(i)~=0
maxvote=curvote(i);
maxvoteID(i)=i;
flag=0;
if d(i)~=0
for k=1:d(i)
if curvote(neibor(i,k))>maxvote
flag=1;
break
end
end
end
if flag==0
cluster_head(i)=i;
CH(i)=1;
Eprog(i)=Eprog(i)+4*8*(eta*r(i)^2+et); %发簇头信息
end
end
end
%ddddddddddddddddddddddddddd 处理收到的簇头信息的节点,按适宜性选择簇头 ddddddddddddddddddddddddddddddddddddddd
for i=1:N
schnum(i)=0;
end
for i=1:N
if CH(i)==1
if d(i)~=0
for k=1:d(i)
schnum(neibor(i,k))=schnum(neibor(i,k))+1;
sch(neibor(i,k),schnum(neibor(i,k)))=i;
CH(neibor(i,k))=2;
Eprog(neibor(i,k))=Eprog(neibor(i,k))+4*8*er+4*8*(eta*r(neibor(i,k))^2+et); %接收簇头信息并发撤消包
if d(neibor(i,k))~=0
for b=1:d(neibor(i,k))
Eprog(neibor(neibor(i,k),b))=Eprog(neibor(neibor(i,k),b))+4*8*er; %接收撤消包
end
end
end
end
end
end
for i=1:N
if CH(i)==2
fitness1=0;
if schnum(i)~=0
for k=1:schnum(i) %收到的簇头集合中适宜性最高的簇头
if fitness(sch(i,k))>fitness1
fitness1=fitness(sch(i,k));
head=sch(i,k);
end
end
end
flag1=0;
if d(i)~=0
for k=1:d(i) %簇头的适宜性是否在未被覆盖的节点中最高
if CH(neibor(i,k))==0
if fitness(neibor(i,k))>fitness1
flag1=1;
break
end
end
end
end
if flag1==0
cluster_head(i)=head;
CH(i)=1;
Eprog(i)=Eprog(i)+6*8*(eta*r(i)^2+et); %发加入信息
end
end
end
%ddddddddddddddddddddddddddd 处理未被覆盖的节点 ddddddddddddddddddddddddddddddddddddddd
flag=1;
while flag==1
flag=0;
chval=3;
for i=1:N %重新计算未覆盖节点的选票
if e(i)~=0
if CH(i)==0
flag=1;
E(i)=e(i);
if d(i)~=0
for k=1:d(i)
if CH(neibor(i,k))==0
E(i)=E(i)+e(neibor(i,k));
end
end
end
v(i,i)=e(i)/E(i);
if d(i)~=0
for k=1:d(i)
if CH(neibor(i,k))==0
v(i,neibor(i,k))=e(neibor(i,k))/E(i);
else
v(i,neibor(i,k))=0;
end
end
end
end
end
end
for i=1:N
if e(i)~=0
if CH(i)==0
Eprog(i)=Eprog(i)+6*8*(eta*r(i)^2+et); %发新选票信息
curvote(i)=v(i,i);
if d(i)~=0
for k=1:d(i)
if CH(neibor(i,k))==0
curvote(i)=curvote(i)+v(neibor(i,k),i);
end
end
end
end
end
end
for i=1:N %查找本节点是否是邻居集合中最多选票的节点,如是发簇头广播
if e(i)~=0
if CH(i)==0
maxvote=curvote(i);
maxvoteID(i)=i;
flag1=0;
if d(i)~=0
for k=1:d(i)
if CH(neibor(i,k))==0
if curvote(neibor(i,k))>maxvote
flag1=1;
break
end
end
end
end
if flag1==0
cluster_head(i)=i;
CH(i)=chval;
Eprog(i)=Eprog(i)+4*8*(eta*r(i)^2+et); %发簇头信息
end
end
end
end
for i=1:N % 处理收到的簇头信息的节点
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -