SAS中文论坛

标题: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题) [打印本页]

作者: shiyiming    时间: 2011-3-13 13:27
标题: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
原始的排队模型,5个服务窗口,5条队列。刚到的客户,如果选择等待的话,选择最少的那一服务窗口进行排队,则他选择的那条队列人数增加1个;队列前边的人若办完业务则也出队列,人数减1。
    需要求助的问题就在出队列这块,数据结构比较简单,但由于我对sas程序函数的不熟悉,特别是数组那块。想了好多用数组的办法,对出队列这块都不成功,始终会出错。还请sas的朋友们帮帮忙看看,帮我解决出队列的这块问题。感觉比较简单的,但是我用sas解决不了。时间不急,但也希望朋友们积极些帮下忙,真的谢谢啦!
    下边是自己用的一些简单语句(像if语句等等)编写的程序。由于程序非常长,我自己看了,有时都会搞错,所以把原来程序中的用到的数组,全部省去了。不过还是比较长,有点难为大家了,各位可以直接把程序复制去调试下,在新生成的银行排队系统模拟(ypxm)数据集中可以比较容易的发现问题!

data ypxm(drop=i k1-k5 x1-x5 y);
           label              T='时间刻度表(分钟)'
                                 by_t='该客户办理业务所需花费的时间'
                 sfdd='该客户是否等待'
                 ddlx='等待类型'
                 ddlx_1='等待类型一(一直等)'
                 ddlx_2='等待类型二(不差过t1分钟)'
                 ddlx_3='等待类型三(不差过t2分钟)'
                 xzfwck='选择服务窗口'
                                 lywbw='客户离业务完成需等候时间'
                 N1='窗口一排队人数'
                                T1='窗口一需等待时间'
                 N2='窗口二排队人数'
                                T2='窗口二需等待时间'
                 N3='窗口三排队人数'
                                T3='窗口三需等待时间'
                 N4='窗口四排队人数'
                                T4='窗口四需等待时间'
                 N5='窗口五排队人数'
                 T5='窗口五需等待时间';
  do i=1 to 150;
  retain T k1-k5 0;
  retain T1-T5 0 N1-N5 0;
  x1=rand('uniform');
  x2=rand('uniform');
  x3=rand('uniform');
  x4=rand('exponential');
  x5=rand('exponential');
  y=0.5*x4;                     /*y表示两个客户到达的时间间隔,服从的是指数分布*/
  by_t=2.5*x5;                /*by_t表示随机生成的每个客户实际办理业务的时间*/
  xzfwck=int((6-1)*x3+1);

/*当人数少的时候,刚到的客户考虑是否排队的机率比较小,所以下面是随意设置的一个值(30)
当排队人数超过这个值时,所有刚到的银行客户都认为是要考虑等还是不等,其中考虑等,选
择等待的,又分几种情况,如:一直等待的;最多等待t1或t2分钟的…在人数未超过这个值时,
全部默认为第一种情况:一直等。下边是客户是否等待的一段程序。
*/
   if (sum(of N1-N5)>=30)then do;
        sfdd=int((3-1)*x1);
         if (1<=sfdd<2)then do;
                          ddlx=int((4-1)*x2+1);
                  if(1<=ddlx<2) then do;
                                      ddlx_1=1;
                                      ddlx_2=0;
                                      ddlx_3=0;
                           end;
                           if(2<=ddlx<3) then do;
                                      ddlx_1=0;
                                      ddlx_2=1;
                                      ddlx_3=0;
                    end;
                    if(3<=ddlx<4) then do;
                       ddlx_1=0;
                                       ddlx_2=0;
                                       ddlx_3=1;
                     end;
                  end;
                  else do;
                     ddlx=0;
                     ddlx_1=0;
                             ddlx_2=0;
                             ddlx_3=0;

                   end;
    end;
    else do;
           sfdd=1;
                   ddlx=1;
                   ddlx_1=1;
                   ddlx_2=0;
                   ddlx_3=0;
    end;
/*下边是客户选择窗口排队的一段程序,模拟的情况是哪个窗口前的排队人数最少,客户就选
择这个窗口排队,有排队人数一样时,默认为选择小号窗口服务台。
*/
    if(N1>N2) then do;
           xzfwck=2;
           if(N2>N3) then do;
                 xzfwck=3;
                         if(N3>N4) then do;
                         xzfwck=4;
                         if(N4>N5) then do;
                                       xzfwck=5;
                                       N5=sum(N5,1);
                                       T5=sum(T5,by_t);
                          end;
                          else do;
                                        xzfwck=4;
                                        N4=sum(N4,1);
                                                                T4=sum(T4,by_t);
                           end;
                  end;
                          else do;
                                   xzfwck=3;
                                                   if(N3>N5) then do;
                                         xzfwck=5;
                                                                 N5=sum(N5,1);
                                                                 T5=sum(T5,by_t);
                                    end;
                            else do;
                                          xzfwck=3;
                                                                  N3=sum(N3,1);
                                                                  T3=sum(T3,by_t);
                            end;
                   end;
            end;
            else do;
                   xzfwck=2;
                                   if(N2>N4) then do;
                             xzfwck=4;
                             if(N4>N5) then do;
                                           xzfwck=5;
                                                                   N5=sum(N5,1);
                                                                   T5=sum(T5,by_t);
                                      end;
                              else do;
                                    xzfwck=4;
                                                                    N4=sum(N4,1);
                                                                   T4=sum(T4,by_t);
                               end;
                     end;
                     else do;
                                       xzfwck=2;
                                                       if(N2>N5) then do;
                                     xzfwck=5;
                                                                     N5=sum(N5,1);
                                                                     T5=sum(T5,by_t);
                               end;
                               else do;
                                      xzfwck=2;
                                                                      N2=sum(N2,1);
                                                                      T2=sum(T2,by_t);
                               end;
                       end;
                    end;
     end;
     else do;
            xzfwck=1;
                    if(N1>N3) then do;
                        xzfwck=3;
                                if(N3>N4) then do;
                                xzfwck=4;
                                if(N4>N5) then do;
                                               xzfwck=5;
                                                                       N5=sum(N5,1);
                                                                       T5=sum(T5,by_t);
                                 end;
                                 else do;
                                         xzfwck=4;
                                                                         N4=sum(N4,1);
                                                                         T4=sum(T4,by_t);
                                  end;
                           end;
                           else do;
                                   xzfwck=3;
                                                           if(N3>N5) then do;
                                          xzfwck=5;
                                                                          N5=sum(N5,1);
                                                                          T5=sum(T5,by_t);
                                   end;
                                   else do;
                                           xzfwck=3;
                                                                           N3=sum(N3,1);
                                                                           T3=sum(T3,by_t);
                                   end;
                            end;
               end;
               else do;
                          xzfwck=1;
                                         if(N1>N4) then do;
                                   xzfwck=4;
                                   if(N4>N5) then do;
                                           xzfwck=5;
                                                                           N5=sum(N5,1);
                                                                           T5=sum(T5,by_t);
                                           end;
                                   else do;
                                            xzfwck=4;
                                                                            N4=sum(N4,1);
                                                                            T4=sum(T4,by_t);
                                   end;
                          end;
                                  else do;
                                    xzfwck=1;
                                                            if(N1>N5) then do;
                                              xzfwck=5;
                                                                              N5=sum(N5,1);
                                                                              T5=sum(T5,by_t);
                                     end;
                                     else do;
                                                xzfwck=1;
                                                                                N1=sum(N1,1);
                                                                                T1=sum(T1,by_t);
                                      end;
                           end;
                end;
     end;

T=sum(T,y);
T1=sum(T1,-y);
T2=sum(T2,-y);
T3=sum(T3,-y);
T4=sum(T4,-y);
T5=sum(T5,-y);
if(T1<=0) then do; T1=0; N1=0;end;
if(T2<=0) then do T2=0; N2=0;end;
if(T3<=0) then do T3=0; N3=0;end;
if(T4<=0) then do T4=0; N4=0;end;
if(T5<=0) then do T5=0; N5=0;end;
output;
end;
run;
作者: shiyiming    时间: 2011-3-13 15:03
标题: Re: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
出队列这块,感觉比较简单,就是不知道用sas怎么实现,路过的游客也顺便帮忙支点招么,谢谢啦!
作者: shiyiming    时间: 2011-3-13 16:33
标题: Re: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
你可以把问题的描述清楚, 然后用简单的数据来举个例子。


你的代码有bug,还有又这么长,怎么有耐心看下去啊 ?

ps: 这个问题蛮有意思。
作者: shiyiming    时间: 2011-3-13 17:03
标题: Re: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
生成的数据集中,每一个窗口的排队人数(N1-N5)都只在有客户进入队列的时候,加了1,而每个窗口有客户办完业务的时候,窗口排队人数(N1-N5)没有减1,只有在每个队列需等候时间小于等于0的时候,排队人数N就算不等于0,此刻也得把它置为0.
假如说,把其中的一段程序(下边)中的N1-N5=0这项去掉,你就会发现排队人数只增不减:
if(T1<=0) then do; T1=0; N1=0;end;
if(T2<=0) then do T2=0; N2=0;end;
if(T3<=0) then do T3=0; N3=0;end;
if(T4<=0) then do T4=0; N4=0;end;
if(T5<=0) then do T5=0; N5=0;end;
把上边的程序段改为下边的后(排队人数N1-N5都是只增不减):
if(T1<=0) then T1=0;
if(T2<=0) then T2=0;
if(T3<=0) then T3=0;
if(T4<=0) then T4=0;
if(T5<=0) then T5=0;
非常感谢,还有其他什么问题没表达清楚的,我会补充!真的谢谢你们的关注!
作者: shiyiming    时间: 2011-3-13 17:14
标题: Re: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
传上来的程序,格式全部被打乱了,看着很不舒服。也不清楚可不可以把程序的压缩包传上来,呜呜!有知道帮帮,说说怎么传.....
作者: shiyiming    时间: 2011-3-14 12:27
标题: Re: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
[quote:2vxce3xw]又分几种情况,如:一直等待的;最多等待t1或t2分钟的…[/quote:2vxce3xw]

我不是很理解t1和t2...
最多等待t1是指等了t1时间后没有排到就离开了,还是估计t1时间后还轮不到的,就转身离开了?
作者: shiyiming    时间: 2011-3-14 15:12
标题: Re: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
你可以搜索排队模拟问题。SAS有专门的解决方案。
作者: shiyiming    时间: 2011-3-14 17:30
标题: Re: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
程序太长了,看了这些判断看了头痛,个人觉得问题出在:没有判断顾客从得到服务开始,服务时间是否到了,到了就相应的在队伍减1(你好像没有相应的语句)。 <!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( -->
作者: shiyiming    时间: 2011-3-14 21:30
标题: Re: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
[quote=&quot;jingju11&quot;:1xsus0fs][quote:1xsus0fs]又分几种情况,如:一直等待的;最多等待t1或t2分钟的…[/quote:1xsus0fs]

我不是很理解t1和t2...
最多等待t1是指等了t1时间后没有排到就离开了,还是估计t1时间后还轮不到的,就转身离开了?[/quote:1xsus0fs]
t1和t2是暂时还未确定的最多等待时间,它们指的是当已经选择要等待的客户,等待时间超过t1或t2时,还需要
等待一段时间的话,那该客户就不等了。因为在该客户选择排队等待时,只知道排在他前边的客户人数,
而并不知道会排多久,即使人数是最少的,也可能等候的时间是最多的,不过在这里,可以先不用管t1和t2,只要出队列这块
解决了,t1和t2相关的问题就比较容易解决了!

[quote=&quot;winsentess&quot;:1xsus0fs]程序太长了,看了这些判断看了头痛,个人觉得问题出在:没有判断顾客从得到服务开始,服务时间是否到了,到了就相应的在队伍减1(你好像没有相应的语句)。 <!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( -->[/quote:1xsus0fs]
我原来的程序中用了很多的数组办法来解决出队列这块的,不过没成功,就是因为程序太长了,所以就把所有的相关的出队列那块删掉后,再传上来,不过还是比较长,确实太麻烦各位了,我会想办法把问题转换为类似简单情况,然后再补充,非常感谢两位了!
作者: shiyiming    时间: 2011-3-14 21:32
标题: Re: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
[quote=&quot;superkuhasu&quot;:asbfzt0m]你可以搜索排队模拟问题。SAS有专门的解决方案。[/quote:asbfzt0m]
我会的,谢谢你了哈!
作者: shiyiming    时间: 2011-3-15 12:39
标题: Re: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
[code:36z2wh41]data ypxm1;
        array n&#91;5&#93;; array t&#91;5&#93;;        array r&#91;5&#93;;       
        retain T1-T5 N1-N5 r1-r5 0;
        do i=1 to 150 ;
                x1=rand('uniform'); x2=rand('uniform');x3=rand('uniform');x4=rand('exponential'); x5=rand('exponential'); x6=rand('exponential');
                y =0&#46;5*x4;        
                if (i =1) then        y =0;
           do ii =1 to 5;
                        if t&#91;ii&#93; &gt;r&#91;ii&#93; then do;       
                                n&#91;ii&#93; =max(0, n&#91;ii&#93;-1);
                                t&#91;ii&#93; =max(0, t&#91;ii&#93; -r&#91;ii&#93;);                               
                                r&#91;ii&#93; =2&#46;5*x6;
                        end;
                end;
                tt =sum(tt, y); **time o'clock;       
                sfdd =1;
                n_min =min(of n&#91;*&#93;);
                n_sum =sum(of n&#91;*&#93;);
                do ii =1 to 5;
                        if n&#91;ii&#93; &gt;0 then t&#91;ii&#93; =sum(t&#91;ii&#93;, y);
                end;
                if (n_sum &lt;30) then do ii =1 to 5;
                        if n&#91;ii&#93; =n_min then do;
                            xzfwck =ii;
                                n&#91;ii&#93; =sum(n&#91;ii&#93;, 1);
                                if n&#91;ii&#93; = 1 then do;
                                        r&#91;ii&#93; =2&#46;5*x5; t&#91;ii&#93; =sum(t&#91;ii&#93;, y);
                                end;
                                leave;
                        end;
                end;
                else if (n_sum &gt;=30)then do;
                        if x3 &lt;0&#46;5 then do;
                                xzfwck =ii;
                                do ii =1 to 5;                                       
                                        if n&#91;ii&#93; =n_min then do;                                               
                                                n&#91;ii&#93; =sum(n&#91;ii&#93;, 1);
                                                leave;
                                        end;
                                end;                                       
                        end;
                        else sfdd =0;
                end;       
                output;
        end;
run; [/code:36z2wh41]
还有一些东西我没有想的很明白。其中的道理对于我来说,理解起来有些困难。京剧
作者: shiyiming    时间: 2011-3-16 15:35
标题: Re: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
首先,给大家说声抱歉啊,这两天由于比较忙,还没来得及关注这上边的这个帖子。我非常感谢叫京剧的这位朋友,他在编写那段程序时,肯定花了些心思进去的,
我运行了程序,也认真的看了几遍,我认为他设计思路方法都比较好,也比较接近完成出队列那块模拟,但是我注意到了一点,那就是在程序中的那个r[ii] 应该指的是顾客办理的业务实际所需要的时间(不包括等待时间),而最外层的那个do i=1 to 150的循环,代表的是150个顾客,有150条观测值,每一条观测,代表的是一位顾客的所有信息。在这个循环内每循环一次,就需要随机产生一个y值:代表的是前后两位顾客到达的时间间隔,也可理解为两条观测信息的时间差。假如说从0时刻开始,过了第一个产生的y值时间段后的那个时刻,第一个顾客到达,他办理的业务实际所需的时间为京剧那段程序中的随机产生的r[ii],这样依次循环下去,每个循环中随机产生一个y值,就可以推出下一个顾客的到达,而每一个顾客就好像是自身携带了一个不同的r[ii]一样,因为每位顾客实际办理完业务所花费的时间不同(这里也不包括排队等候的时间),而在京剧的那段程序中的do i=1 to 150循环内,产生的r[ii] 有两个值:r[ii] =2.5*x6 和 r[ii] =2.5*x5,这样对仿真的可信度会再次降低。程序中还有些比较小的事项,那就是sas不能严格区分大小写,有些变量定义重复了,不过对这个问题不太影响,总之非常感谢哪位叫京剧的朋友。
   
   
    为了避免前面那个较复杂多队列模型的影响和程序代码较长的问题,我把问题转换为最简单的单队列模型来解决,然后再去考虑多队列,因为只针对出队列,所以变量可以先考虑少些,窗口,等待类型等可以先不用考虑,只需解决出队列这块就行:
   
    设计sas程序,完成单队列的模型。需要用到的主变量有:相邻两客户到达的时间间隔y(服从指数分布的随机数,参数可设为0.3-0.6),客户实际办理完业务所需时间z(服从伽马分布的随机数,形状参数设为2.5),当前队列的排队人数(N)
   
    基本设计思路可以为,通过循环的操作产生一定量的观测(可取150),每条观测里边的变量值可以反应的是每个客户的信息(比如,到达时刻,当前排队人数等)——》然后循环内随机产生一个y值,和z值;N+1(N的初值为0),定义一个时间表变量(Time,初值也为0),Time=Time+y;——》output 打印,再循环,其中在每一次循环中还需加入判断,队列最前边的客户是否已办理完业务,是,则N-1;最好再定义一个变量,表示的是此时刻与上一时刻之间是否有客户已办完业务,是为1,否为0,这样能够更好反应出出队列的情况。
作者: shiyiming    时间: 2011-3-17 16:11
标题: Re: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
程序模块可以为下面这段(供参照)
data a;
retain seed time N 0;
do i=1 to 150;
   x1=rand('exponential');
   y=0.4*x1;                    /*相邻两客户间的时间间隔*/
   time=sum(time,y);            /*时刻表*/
   z=rangam(seed,2.5);          /*客户实际办理完业务所需时间z*/
   N=sum(N,1);                  /*此时刻的排队人数*/
   /*
(代码省略部分)判断队列最前边的客户是否完成业务办理,即出队列(此时完成N-1)
再增加个变量,反应是否有出队列情况,有:1,无:0
   */
output;
end;
run;

终归问题归结为:就是用sas语言判断队列最前边的客户是否完成业务办理。

如果lag 函数的下标可以为变量,则问题比较容易解决了,我也用了比较多的数组办法不成,
其中貌似lag函数是可以解决的,它好像是队列函数。所以需要sas的朋友们帮我解决下这个麻烦哦!
作者: shiyiming    时间: 2011-3-18 12:37
标题: Re: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
知道的就帮帮忙,不太清楚的也支点招吗,谢谢各位了!
作者: shiyiming    时间: 2011-3-19 21:17
标题: Re: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
这么久都没人搭理我了,看来也只有自己搭自己了! 呜呜!呜呜! <!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( -->
不过我还是蛮希望得到论坛里朋友们的帮忙,希望你们能够帮我看看下边这段程序出错的缘由是什么呢?主要是数组那块,有什么好的办法
663  data a;
664  retain seed time N test 0;
665  retain k 1 r1-r30 0;
666  array r{30} r1-r30;
667  do i=1 to 150;
668  x1=rand('exponential');
669  y=0.4*x1;                            /*相邻两客户间的时间间隔*/
670  time=sum(time,y);                    /*时刻表*/
671  test=sum(test,y);                    /*比较测试变量*/
672  z=rangam(seed,2.5);                  /*客户实际办理完业务所需时间z*/
673  r(i)=z;                              /*用一个数组变量记录一个客户的实际办理完业务所需要花费的时间*/
674  N=sum(N,1);                          /*此时刻的排队人数*/
675  if(i&gt;1 and test&gt;=lag1(r(k))) then do;   /*出队列的情况时*/
676       N=sum(N,-1);
677       test=sum(test,-lag1(r(k)));
678       k+1;
679  end;
680  output;
681  end;
682  run;

ERROR: Array subscript out of range at line 673 column 1.
seed=0 time=6.5053489615 N=30 t=0 k=1 r1=5.0543248264 r2=4.1951733069 r3=1.705578679 r4=2.5924380015 r5=4.3783195493 r6=3.9666829069 r7=3.7741148642 r8=3.6177123486
r9=3.1815895984 r10=3.5323863883 r11=2.5843302065 r12=2.7075425969 r13=2.1221648417 r14=0.6802652604 r15=1.3761185163 r16=3.3514339174 r17=0.3632845083
r18=2.3099530204 r19=4.6675621206 r20=4.0174800602 r21=0.7062898593 r22=1.8473863286 r23=3.0907366931 r24=1.9369234141 r25=3.5461257712 r26=1.1660437241
r27=2.3036868635 r28=1.7507675047 r29=2.4960357055 r30=6.5663601574 i=31 x1=1.2270577758 y=0.4908231103 test=6.5053489615 z=5.3211699255 _ERROR_=1 _N_=1
作者: shiyiming    时间: 2011-3-20 11:50
标题: Re: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
有谁比较清楚上面那段程序,数组变量出现这种 ERROR: Array subscript out of range at line 673 column 1.
错误原因的就解释下吗?拜托各位牛哥了!
作者: shiyiming    时间: 2011-3-20 13:13
标题: Re: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
array r{30} r1-r30;
667 do i=1 to 150;
673 r(i)=z;


i=31的时候你值放哪里啊 <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->
作者: shiyiming    时间: 2011-3-20 15:34
标题: Re: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
[quote=&quot;superkuhasu&quot;:29x4kst3]array r{30} r1-r30;
667 do i=1 to 150;
673 r(i)=z;


i=31的时候你值放哪里啊 <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->[/quote:29x4kst3]

也对哈,i=31的时候值没地方放了,把30换成150,就不会出错了!原来考虑的是定义30个数组变量就足够了,而定义150个确实是太浪费资源了,
我的把它稍微改一下,这个数组问题解决了。非常感谢super哥,不过还有些程序逻辑问题可能要问大家!!@
作者: shiyiming    时间: 2011-3-20 17:19
标题: Re: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
[quote=&quot;superkuhasu&quot;:3t9trprv]array r{30} r1-r30;
667 do i=1 to 150;
673 r(i)=z;


i=31的时候你值放哪里啊 <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->[/quote:3t9trprv]

这下又来个小问题了,我把数组名r的长度从30改为150后,是没问题的。另外我想在r(i)=z;语句前面加一个限制条件应该是可以的,( if(i&lt;=30) then r(i)=z; )
但是还是出同样的错误,我已经避免了当 i&gt;=30时,值没地方放情况了啊,这点还没想明白,请高手些指教!!!

加入了限制条件(if(i&lt;=30))后的程序如下:
data a(drop= i);
retain seed time N test 0;
retain k 1 r1-r30 0;
array r{30} r1-r30;
do i=1 to 150;
x1=rand('exponential');
y=0.4*x1; /*相邻两客户间的时间间隔*/
time=sum(time,y); /*时刻表*/
test=sum(test,y); /*比较测试变量*/
z=rangam(seed,2.5); /*客户实际办理完业务所需时间z*/
N=sum(N,1); /*此时刻的排队人数*/
if(i&lt;=30) then r(i)=z; /*用一个数组变量记录一个客户的实际办理完业务所需要花费的时间*/
if(i&gt;1 and test&gt;=lag1(r(k))) then do; /*出队列的情况时*/
    N=sum(N,-1);
    test=sum(test,-lag1(r(k)));
    k=sum(k,1);
end;
output;
end;
run;
作者: shiyiming    时间: 2011-3-20 19:41
标题: Re: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
你要看log的反馈。人家说几行几列有问题
r(k)你找谁去啊~
作者: shiyiming    时间: 2011-3-20 20:37
标题: Re: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
[quote=&quot;superkuhasu&quot;:2x5wov0d]你要看log的反馈。人家说几行几列有问题
r(k)你找谁去啊~[/quote:2x5wov0d]

我的这个问题差不多解决了,谢谢啦!superkuhasu!!
作者: shiyiming    时间: 2011-3-23 15:25
标题: Re: sas的朋友们求助大家一个sas程序设计(关于银行队列的仿真模型中队列人数的减少问题)
感谢论坛里所有关注我贴子的朋友,在大家的提点下,我已经把银行仿真模拟的问题全部解决了!!
再次谢谢大家!!




欢迎光临 SAS中文论坛 (http://mysas.net/forum/) Powered by Discuz! X3.2