|
楼主

楼主 |
发表于 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; |
|