SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 2387|回复: 21
打印 上一主题 下一主题

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

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-3-13 13:27:59 | 只看该作者

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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2011-3-13 15:03:56 | 只看该作者

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

出队列这块,感觉比较简单,就是不知道用sas怎么实现,路过的游客也顺便帮忙支点招么,谢谢啦!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2011-3-13 16:33:32 | 只看该作者

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

你可以把问题的描述清楚, 然后用简单的数据来举个例子。


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

ps: 这个问题蛮有意思。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2011-3-13 17:03:55 | 只看该作者

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;
非常感谢,还有其他什么问题没表达清楚的,我会补充!真的谢谢你们的关注!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2011-3-13 17:14:56 | 只看该作者

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

传上来的程序,格式全部被打乱了,看着很不舒服。也不清楚可不可以把程序的压缩包传上来,呜呜!有知道帮帮,说说怎么传.....
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2011-3-14 12:27:56 | 只看该作者

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

[quote:2vxce3xw]又分几种情况,如:一直等待的;最多等待t1或t2分钟的…[/quote:2vxce3xw]

我不是很理解t1和t2...
最多等待t1是指等了t1时间后没有排到就离开了,还是估计t1时间后还轮不到的,就转身离开了?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2011-3-14 15:12:10 | 只看该作者

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

你可以搜索排队模拟问题。SAS有专门的解决方案。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2011-3-14 17:30:12 | 只看该作者

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

程序太长了,看了这些判断看了头痛,个人觉得问题出在:没有判断顾客从得到服务开始,服务时间是否到了,到了就相应的在队伍减1(你好像没有相应的语句)。 <!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2011-3-14 21:30:32 | 只看该作者

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]
我原来的程序中用了很多的数组办法来解决出队列这块的,不过没成功,就是因为程序太长了,所以就把所有的相关的出队列那块删掉后,再传上来,不过还是比较长,确实太麻烦各位了,我会想办法把问题转换为类似简单情况,然后再补充,非常感谢两位了!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2011-3-14 21:32:06 | 只看该作者

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

[quote=&quot;superkuhasu&quot;:asbfzt0m]你可以搜索排队模拟问题。SAS有专门的解决方案。[/quote:asbfzt0m]
我会的,谢谢你了哈!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-6-11 11:51 , Processed in 0.077955 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表