• 大小: 11KB
    文件类型: .m
    金币: 2
    下载: 4 次
    发布日期: 2022-09-30
  • 语言: Matlab
  • 标签: PEGASIS  

资源简介

PEGASI路由算法,寻找距离节点最近的节点,练成一条线。

资源截图

代码片段和文件信息

clear;
clc;
clf;

NodeNums=100;                                
AreaR=100;                                  

Bx=20;           
By=150;                                     

En=0.25;                                    
send_to_sink=0;                             %%簇头距离基站距离                 
data_pkt_length=2000;                       
die_node_num=0;                             %%本轮死亡节点数
die_node_num_pri=0;                         
run_round=0;                                
En_Cost=0;                                  %%本轮消耗能量
En_Cost_pre=0;                              %%上一轮消耗能量
En_cost_per_round=0;                        
begin_to_send=0;                            %%开始发送的num
num=1;

alive=1;                                   
dead=0;

Node.x=AreaR*rand(1NodeNums); 
Node.y=AreaR*rand(1NodeNums);              
Node.pri=linspace(00NodeNums);            
Node.already=linspace(00NodeNums);        
Node.to_nbr_dis=zeros(NodeNums);            
Node.to_pri_dis=linspace(00NodeNums);     %%与当前节点最近的距离
Node.send_dis=linspace(00NodeNums);       %%节点之间距离表初始为0
Node.E=linspace(EnEnNodeNums);            
Node.status=linspace(alivealiveNodeNums); 

ETX=50*0.000000001;                         %%发送数据包消耗能量
ERX=50*0.000000001;                         %%接收数据包消耗能量
Efs=100*0.000000000001;                     %%连接点之间的传递参数
Emp=0.0013*0.000000000001;                  %%簇首与基站之间的传递参数
EDA=5*0.000000001;                          %%融合数据消耗能量
do=sqrt(Efs/Emp);                           %%平均半径

%%计算各个节点距离基站的位置距离
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%                         数据通信
while (NodeNums-die_node_num)>0 %%每一轮循环为一次数据通信,直到节点死光
  
    if run_round==0||die_node_num_pri~=die_node_num     %%当上一轮死亡节点不等于下一轮死亡节点数
Node.pri=linspace(00NodeNums);                %%  与当前节点最近的节点num
num_plot=1;
Node.already=linspace(00NodeNums);             
        for i=1:1:NodeNums
if Node.status(i)==alive
to_sink_dist(i)=sqrt((Node.x(i)-Bx)^2+(Node.y(i)-By)^2);
else
to_sink_dist(i)=0;
end
        end  %%求出所有存活节点到基站的距离

[Max_Dis Max_num]=max(to_sink_dist);   %%求出距离基站最大的距离
now_node=Max_num;
Node.already(now_node)=1;
node_head=Max_num;                       %%头结点
% send_to_sink=now_node;
node_to_send=now_node;
start_node=now_node;                     %%求出开始节点
        while num_plot~=NodeNums-die_node_num
if num_plot==NodeNums-die_node_num
                Node.pri(now_node)=0;
node_tail=now_node;   %%记录尾节点
            end
            for j=1:1:NodeNums
if Node.already(j)==0&&Node.status(j)==alive
Node.to_nbr_dis(now_nodej)=sqrt((Node.x(now_node)-Node.x(j))^2+(Node.y(now_node)-Node.y(j))^2);   %%与邻居的距离
else
Node.to_nbr_dis(now_nodej)=0;
end
end
j=1;
while Node.to_nbr_dis(now_nodej)==0      %%即当有节点死亡时
j=j+1;                 %%重新编号
end
min_dis=Node.to_nbr_dis(now_nodej);
min_n

评论

共有 条评论