nojunyunEvote2new.m.txt
资源名称:vote.rar [点击查看]
上传用户:liweizzp
上传日期:2015-06-15
资源大小:4k
文件大小:16k
源码类别:
3G开发
开发平台:
Matlab
- %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 % 处理收到的簇头信息的节点
- if CH(i)==chval
- 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))=chval+1;
- 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)~=1&&CH(i)~=chval %CH(i)~=0&&CH(i)~=1
- 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
- chval=chval+2;
- end
- %ddddddddddddddddddddddddddd 簇形成阶段每个节点的能量消耗 ddddddddddddddddddddddddddddddddddddddd
- for i=1:N
- if e(i)~=0
- Eclu(i)=Einit(i)+Eprog(i);
- end
- end
- %ddddddddddddddddddddddddddd 计算簇的个数:簇头和成员 ddddddddddddddddddddddddddddddddddddddd
- temp1=cluster_head;
- cluster_num=1;
- for i=1:N
- if e(i)~=0
- if temp1(i)==0
- continue
- end
- head=temp1(i);
- temp1(i)=0;
- m=1;
- cluster(cluster_num,m)=head;
- m=m+1;
- for k=i+1:N
- if head==temp1(k)
- if k==head
- cluster(cluster_num,m)=i;
- else
- cluster(cluster_num,m)=k;
- end
- m=m+1;
- temp1(k)=0;
- end
- end
- node_num(cluster_num)=m-1;
- cluster_num=cluster_num+1;
- end
- end
- cluster_num=cluster_num-1;
- %ddddddddddddddddddddddddddd 数据传输阶段每个节点的能量消耗 ddddddddddddddddddddddddddddddddddddddd
- for i=1:cluster_num
- Edata(cluster(i,1))=5*(128*8*er*(node_num(i)-1)+efuse*128*8*(node_num(i)-1)); %簇头接收信息和融合信息能耗以及经多跳发送到网关的能耗
- for k=2:node_num(i)
- Edata(cluster(i,k))=5*128*8*(et+eta*dis(cluster(i,1),cluster(i,k))^2)+5*128*8*es; % 成员节点采集和发送数据能耗
- end
- end
- %下面计算簇头到网关的路由
- for i=1:cluster_num
- if dis(cluster(i,1),N+1)<=dT
- rout(cluster(i,1),1)=0;
- rout1(cluster(i,1),1)=0;
- continue
- else
- m=0;
- for j=1:cluster_num
- if dis(cluster(i,1),N+1)>dis(cluster(j,1),N+1)
- m=m+1;
- rout(cluster(i,1),m)=cluster(j,1);
- end
- end
- if rout(cluster(i,1),1)==0
- rout1(cluster(i,1),1)=0;
- end
- %求最佳中继节点的位置(x0,y0)
- x0=Loca(cluster(i,1),1)*(1-dn(cluster(i,1))/(dis(cluster(i,1),N+1)));
- y0=Loca(cluster(i,1),2)*(1-dn(cluster(i,1))/(dis(cluster(i,1),N+1)))+D*dn(cluster(i,1))/(dis(cluster(i,1),N+1));
- flag5=1;
- rout1(cluster(i,1),1)=0;
- dmin1=dn(cluster(i,1))^2;
- for j=1:m
- dtemp=(Loca(rout(cluster(i,1),j),1)-x0)^2+(Loca(rout(cluster(i,1),j),2)-y0)^2;
- if dtemp<dmin1
- dmin1=dtemp;
- node=rout(cluster(i,1),j);
- flag5=0;
- end
- end
- if flag5==0
- rout1(cluster(i,1),1)=node;
- end
- end
- end
- %下面计算簇头消耗的能量
- for i=1:cluster_num
- if rout1(cluster(i,1),1)==0
- Edata(cluster(i,1))=Edata(cluster(i,1))+128*8*(et+eta*(dis(cluster(i,1),N+1))^2);
- else
- temp=rout1(cluster(i,1),1);
- Edata(cluster(i,1))=Edata(cluster(i,1))+128*8*(et+eta*(dis(cluster(i,1),temp))^2);
- Edata(temp)=Edata(temp)+128*8*er;
- for k=1:7
- if rout1(temp,1)==0
- Edata(temp)=Edata(temp)+128*8*(et+eta*(dis(temp,N+1))^2);
- break
- else
- temp1=rout1(temp,1);
- Edata(temp)=Edata(temp)+128*8*(et+eta*(dis(temp,temp1))^2);
- Edata(temp1)=Edata(temp1)+128*8*er;
- temp=temp1;
- end
- end
- end
- end
- %ddddddddddddddddddddddddddd 一轮结束后每个节点的能量消耗和剩余能量 ddddddddddddddddddddddddddddddddddddddd
- for i=1:N
- if e(i)~=0
- e(i)=e(i)-Edata(i)-Eclu(i);
- Ecluz=Ecluz+Eclu(i);
- Edataz=Edataz+Edata(i);
- end
- end
- lunum=lunum+1;
- if N==200
- if lunum<=20
- Ehead(t,lunum)=0;
- for i=1:cluster_num
- if e(i)~=0
- Ehead(t,lunum)=Ehead(t,lunum)+Edata(cluster(i,1))+Eclu(cluster(i,1));
- end
- end
- end
- end
- for i=1:N
- if e(i)<=1*10^(-10) &&e(i)~=0 %能量耗尽后,该节点从邻居集中删去
- e(i)=0;
- if N==200
- dienote=dienote+1;
- if dienote==Nper
- die(t,Nper/10)=lunum;
- Nper=Nper+10;
- end
- end
- if d(i)~=0
- for k=1:d(i)
- nei=neibor(i,k);
- if d(nei)~=0
- for j=1:d(nei)
- if neibor(nei,j)==i
- if j~=d(nei)
- for x=j:d(nei)-1
- neibor(nei,x) =neibor(nei,x+1);
- end
- end
- break
- end
- end
- neibor(nei,d(nei))=0;
- if d(nei)>0
- d(nei)=d(nei)-1;
- end
- end
- end
- end
- d(i)=0;
- if flag3==0
- first_lu=lunum;
- flag3=1;
- % flag2=0;
- % break
- end
- end
- end
- flag4=0;
- for i=1:N
- if e(i)>=1*10^(-10)
- flag4=1;
- break
- end
- end
- if flag4==0
- flag2=0;
- last_lu=lunum;
- end
- end
- %ddddddddddddddddddddddddddd 算法结束 ddddddddddddddddddddddddddddddddddddddd
- first_luf(t)=first_lu; %重复100次,每次的第一个节点死去经历的轮数
- last_luf(t)=last_lu; %重复100次,每次的最后一个节点死去经历的轮数
- Ecluzf(t)=Ecluz; %重复100次,每次的簇形成消耗的能量
- Edatazf(t)=Edataz; %重复100次,每次的数据传输消耗的能量
- end % 对于相同的传输半径,重复100次结束
- %dddddddddddddddddddddd计算各参数100次的平均值dddddddddddddddddddddddd
- sum=0;
- sum1=0;
- sum2=0;
- sum3=0;
- if N==200
- for i=1:20
- sum4(i)=0;
- sum5(i)=0;
- end
- end
- for i=1:g
- sum=sum+first_luf(i);
- sum1=sum1+last_luf(i);
- sum2=sum2+Ecluzf(i);
- sum3=sum3+Edatazf(i);
- end
- if N==200
- for j=1:20
- for i=1:g
- sum4(j)=sum4(j)+Ehead(i,j);
- sum5(j)=sum5(j)+die(i,j);
- end
- end
- end
- first_lu_z(f)=sum/g;
- last_lu_z(f)=sum1/g;
- Ecluzz(f)=sum2/g;
- Edatazz(f)=sum3/g;
- if N==200
- for i=1:20
- Eheadz(i)=sum4(i)/g;
- diez(i)=sum5(i)/g;
- end
- end
- N=N+50;
- f=f+1;
- end %程序结束
- %dddddddddddddddddddd 画图 dddddddddddddddddddddddd