資源簡介
添加能量感知的分簇路由算法,MATLAB仿真編譯程序,可直接運行,注釋詳細,可用,原版本不變,僅減少積分用
代碼片段和文件信息
function?y1?=?advance3()
clear;%清除變量
xm=100;%設置區域為100*100
ym=100;
sink.x=0.5*xm;%sink(匯聚)節點坐標
sink.y=0.5*ym;
n=100?;%區域內的節點數目
m=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;%多路徑衰減能量
a=2;
b=50;
rmax=2000;?%最大的輪數
do=sqrt(Efs/Emp);?%計算do?通信半徑
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure(1);%輸出節點分布圖形;共有n個節點,具體100前面已經預設
for?i=1:1:n?%i為矩陣1到n,間距為1
????S(i).xd=rand(11)*xm;%1行1列矩陣
????XR(i)=S(i).xd;%隨機生成的X軸坐標
????S(i).yd=rand(11)*ym;
????YR(i)=S(i).yd;%隨機生成的Y軸坐標
????S(i).G=0???????????????????????????;%定義第i個節點初始值為0,即有資格成為簇首節點
????S(i).type=‘N‘;%節點類型為普通
????temp_rnd0=i;%這一輪循環中的節點i
????if?(temp_rnd0>=m*n+1)?%普通節點的隨機選舉
????????S(i).E=Eo;%設置初始能量為E0
????????S(i).ENERGY=0;%普通節點
????????
????????plot(S(i).xdS(i).yd‘o‘);%輸出節點分布圖;圖1,用o表示
????????hold?on;
????????
????end
????if?(temp_rnd0 ????????S(i).E=Eo;%設置初始能量為Eo
????????S(i).ENERGY=1;%高級節點,作為區分高級和非高級節點的標志
???????
????????plot(S(i).xdS(i).yd‘o‘);%輸出節點,用*表示
????????hold?on;
????end
end
?
S(n+1).xd=sink.x;%基站X軸坐標
S(n+1).yd=sink.y;%基站Y軸坐標
plot(S(n+1).xdS(n+1).yd‘k:x‘);?%輸出基站,用黑色x表示?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%確定分簇的數目
distance1=sqrt(?(S(i).xd-(S(n+1).xd)?)^2?+?(S(i).yd-(S(n+1).yd)?)^2?);%計算各個節點到基站的距離
min_dis0=distance1;
max_dis0=distance1;
for?i=1:1:n
?????temp0=min(min_dis0sqrt(?(S(i).xd-S(n+1).xd)^2?+?(S(i).yd-S(n+1).yd)^2?)?);
????????????????if?(?temp0 ????????????????????min_dis0=temp0;
????????????????end
??????temp1=max(max_dis0sqrt(?(S(i).xd-S(n+1).xd)^2?+?(S(i).yd-S(n+1).yd)^2?)?);
????????????????if?(?temp1>min_dis0?)
????????????????????max_dis0=temp1;
????????????????end
end??????????????????????%找出各個節點到基站的距離d?最大最小值
nplot=(xm/(temp1-temp0))*sqrt(2*n/pi);%優化之后,最佳的簇頭個數
p1=nplot/n;%分簇的概率
flag_first_dead1=0;%第一個節點死亡的標志變量初始值為0
figure(1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%每過round(1/p)輪,節點重新選舉簇頭節點
for?r=1:rmax
countCHs1=0;??%??當前簇數目
rcountCHs1=0;??%??r輪后當過簇的節點數目
cluster1=1;??%定義一個以1開始變化的簇頭節點數目
countCHs1;
rcountCHs1=rcountCHs1+countCHs1;
?
????pnrm=p1;%普通節點的選舉概率
????padv=p1;?%高級節點的選舉概率
????if(mod(r?round(1/pnrm)?)==0)???????
????????%0起始,相當于每過多少輪重新選擇一次簇頭,最終使得所有節點都當過簇頭節點,
????????%?每個節點都可能成為簇頭節點,(余數為0)
????????for?i=1:1:n%i為矩陣1到n,間距為1
????????????S(i).G=0;%能成為簇頭的節點標志值
????????????S(i).cl=0;
????????end
????end
????
????if(mod(r?round(1/padv)?)==0)
??
????????for?i=1:1:n%i為矩陣1到n,間距為1
????????????if(S(i).ENERGY==1)
????????????S(i).G=0;%簇頭數目
????????????S(i).cl=0;
????????????end
????????end
????end
?
?
???hold?off;
?%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
?%統計節點死亡的數目,和第一個節點死亡的輪數
?
?dead1=0;%節點死亡數
?dead_a1=0;%高級節點死亡數
?dead_n1=0;%普通節點死亡數
- 上一篇:圖像亞像元位移操作的MATLAB代碼
- 下一篇:Levinson-Durbin算法
評論
共有 條評論