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

📄 ex_gated_sim_old.m

📁 通信网络的混合轮询系统仿真和等待时间解析求解程序。每个站有两类数据
💻 M
字号:
% 仿真程序          两类数据 一类穷尽 然后二类门限 数据源受限因为为了获得有界的等待时延     恒 定 跳 转%

clear;
r=16;%共有r个  假 站     r/2个工作站
l=zeros(1,r);u=zeros(1,r);
s_load=0.5;
s=0.18618*ones(1,r);%平均服务长度
ss=0.0330578*ones(1,r);
u=0.021/r*ones(1,r);%
uu=zeros(1,r);
rule=ones(1,r); 
%rule=zeros(1,r);
l(1)=s_load/s(1)*.90909;
for i=2:r,
    l(i)=s_load/s(1)*(1-.90909)/15;
end
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);

t_sim=1e5;

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 + -