⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex_gated_sim.asv

📁 通信网络的混合轮询系统仿真和等待时间解析求解程序。每个站有两类数据
💻 ASV
字号:
% 仿真程序          两类数据 一类穷尽 然后二类门限 数据源受限因为为了获得有界的等待时延     恒 定 跳 转%
clear;
r=10;%共有r个  假 站     r/2个工作站
s=ones(1,r);%各工作站所有数据的服务时间 单位妙
l=zeros(1,r);u=zeros(1,r);
s_load=0.6;
l(1)=0.5/2*s_load;l(2)=l(1);
l(3)=0.125/2*s_load;l(4)=l(3);
l(5)=0.125/2*s_load;l(6)=l(5);
l(7)=0.125/2*s_load;l(8)=l(7);
l(9)=0.125/2*s_load;l(10)=l(9);
for i=1:r/2,
    u(2*i-1)=0;
    u(2*i)=0.1;
    rule(2*i-1)=0;
    rule(2*i)=1;
end
t_sim=10*3600;%仿真时间 单位秒?3600秒为1小时
load=zeros(1,r);s_u=0;x=0;s_load=0;max_l=0;% 计算负载率
for i=1:r,
    load(i)=l(i)*s(i);s_u=s_u+u(i);s_load=s_load+load(i);x=x+load(i)+l(i)*u(i); %稳定性条件  要保证<1
    if max_l<l(i),max_l=l(i);end
end
c=s_u/(1-s_load);
Ts_p=1.2*t_sim/c; %  估计轮询周期数目
l_wlist_p=20;%  估计最大等待信元数目

%信元生成数据
t_arr=zeros(r,1.1*max_l*t_sim);%存放各站各信元的到达时间
t_srv=zeros(r,1.1*max_l*t_sim);%存放各站各信元的服务所需时间
%生成仿真数据
for i=1:r%每个站都生成信元
   t=0;j=1;
   while t<(t_sim+10*c),%再仿真结束之后几个周期以后不再有信元
      t=t+(-1.0)/l(i)*log(1-rand);
      t_arr(i,j)=t;%存储信元到达的时刻 %每个工作站在仿真结束之后都会多产生一个
      t_srv(i,j)=(-1.0)*s(i)*log(1-rand);%存储信元到达的时刻
      j=j+1;
   end
end
x=0;y=0;for i=1:j,
    x=x+t_srv(r,i);
    y=y+t_srv(r,i)*t_srv(r,i);
end
x=x/j
y=y/j

%中间变量
i_come=zeros(1,r);%记录各站最晚到达的信元,用以标志数组
l_waitlist=zeros(1,r);%记录当前等待的信元数目
waitlist=zeros(r,l_wlist_p);%存储等待发送的信元的序号,最早到达的被排放在第一个位置
L_ii=zeros(r,Ts_p);%记录各站在服务器到来各时刻等待服务的信元数目
W=zeros(r,Ts_p);%记录各站各被服务的顾客等待时间
n_srvd=zeros(1,r);%记录各站被服务的数目
%仿真过程
t=0;T=0;
while t<t_sim, 
   T=T+1;%新的周期开始了,先从工作站1开始轮询
   for i=1:r, %   服务器到达了      
      % %整理一周期内新到达的数据使之入服务队列
      while t_arr(i,i_come(i)+1)<t,
         %表明指针所指的下一个信元是在当前时刻之前到达的,应当入等待队列;       
         i_come(i)=i_come(i)+1;%移动指向这个刚刚符合到达条件的信元,信元的序号产生了
         l_waitlist(i)=l_waitlist(i)+1;%等待队列长度增大
         waitlist(i,l_waitlist(i))=i_come(i);%将该信元的序号放入该站的等待队列的尾部
      end
      L_ii(i,T)=l_waitlist(i);%统计该周期内,服务器到达此站时,此站的信元等待队列长度
      % %服务  
      
      if l_waitlist(i)>0  %服务器到达时,该工作站非
          if rule(i)==0,  %  门限式服务
              for j=1:l_waitlist(i),% 门限式服务,将所有门限到达的数据全部发送出去
                 n_srvd(i)=n_srvd(i)+1;%统计被服务的信元数目
                 W(i,n_srvd(i))=t-t_arr(i,waitlist(i,j));%统计将要被服务信元的等待时间
                 t=t+t_srv(i,waitlist(i,j));%时间往前推移头信元的服务时间,彷佛发送完毕
                 waitlist(i,j)=0;
             end
             l_waitlist(i)=0;%门限时刻的数据全部发送完毕     
         end 
         
         if rule(i)==1, %  穷尽式服务
             for j=1:l_waitlist(i),% 将所有门限到达的数据全部发送出去
                 n_srvd(i)=n_srvd(i)+1;%统计被服务的信元数目
                 W(i,n_srvd(i))=t-t_arr(i,waitlist(i,j));%统计将要被服务信元的等待时间
                 t=t+t_srv(i,waitlist(i,j));%时间往前推移头信元的服务时间,彷佛发送完毕
                 waitlist(i,j)=0;
             end 
             l_waitlist(i)=0;%门限时刻的数据全部发送完毕   
             while t_arr(i,i_come(i)+1)<t,         %表明指针所指的下一个信元是在当前时刻之前到达的,应当入等待队列;   
                 i_come(i)=i_come(i)+1;%移动指向这个刚刚符合到达条件的信元,信元的序号产生了
                 n_srvd(i)=n_srvd(i)+1;%统计被服务的信元数目
                 W(i,n_srvd(i))=t-t_arr(i,i_come(i));%统计将要被服务信元的等待时间
                 t=t+t_srv(i,i_come(i));%时间往前推移头信元的服务时间,彷佛发送完毕
             end  %将服务期间到达的数据发送出去 体现了穷尽式服务     
         end          
     end %   if l_waitlist(i)>0  %服务器到达时,该工作站非工作站为空时,服务器离开      
     t=t+u(i);%-1.0)*u(i)*log(1-rand);   %将时间往前推移走步时间,完毕后服务器到达下一工作站
 end %  轮询下一个工作站
end   %时间若超过仿真时间,结束

   %统计平均等待时间等性能
for i=1:r,
   sum1=0;sum2=0;
   for j=1:n_srvd(i),%每一个被服务的信元都要统计
      sum1=sum1+W(i,j);%统计等待时间均值
   end
   w_avrg(i)=sum1/n_srvd(i);
   for j=1:T,%每一个周期服务器来到时,等待对长都要被统计
      sum2=sum2+L_ii(i,j);%统计等待对长均值
   end
   l_avrg(i)=sum2/T;%统计等待对长均值   
end
 w_avrg

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -