医院就诊问题的排队论解法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
排队论的应用及其计算机解法
问题的提出:
在校医院就诊时,我发现外科诊室共有六张诊台,而且经常六张诊台中总有一两张会被闲置下来。据此现象,我便想到了应如何利用运筹学知识来根据就诊人数配置诊台的问题。
问题模型:
此类问题属于排队论的范畴。首先根据诊台为多数个确定其为多服务台问题。其次,考虑到若采取多队方式会因各接待人服务效率不同而造成队伍之间人数的不平衡,不能使系统达到最优配置,故将模型定为单队多服务台型。具体框图如下:
单队多服务台型
设共有c 个诊台,每个医生的平均服务率均为u 。在正常情况下,病人的平均到达率为λ,则t ∆时间内有一个病人到达的概率为t P ∆=λ1,在t ∆时间内有一个病人离去的概率为t q ∆=λ1。
问题解决:
分三种情况考虑:
(1) 当无病人时,三种互不相容事件的概率分别为:
(a ) 在时间t 内没有病人排队,t ∆时刻也没有病人到达的概率为
)1(0t P ∆-λ。
(b ) 在时间t 内有一个病人,t ∆内没有顾客到达,但有一位病人接受
诊断后离去的概率为t u t P ∆∆-)1(1λ。
(c ) 在时间t 内没有病人排队,但在t ∆时刻内有一位病人到达,也有
一位病人接受诊断后离去的概率为t tu P ∆∆λ0。
则 20100)()1()1(t u P t u t P t P P ∆+∆∆-+∆-=λλλ
略去二阶小量,整理得 u P P /01λ=。
(2) 当已有n 个病人,且c n <≤1时,可分为以下四种情况:
(a ) 时间t 内有n-1个病人在排队,t ∆时刻内有一位病人到达,但没
有任何病人被诊断的概率为)1(1t nu t P n ∆-∆-λ。
(b ) 时间t 内有n+1个病人在排队,t ∆时刻内没有病人到达,但有一
位病人接受诊断后离去的概率为])1)[(1(1t u n t P n ∆+∆-+λ。
(c ) 时间t 内有n 个病人在排队,t ∆时刻内没有病人到达,也没有任
何病人被诊断的概率为)1)(1(t nu t P n ∆-∆-λ。
(d ) 时间t 内有n 个病人在排队,t ∆时刻内有一个病人到达,也有一
位病人接受诊断后离去的概率为t tnu P n ∆∆λ。
(3) 病人数c n ≥时,与情况(2)类似,但相应的概率分别为:
(a ) )1)((1t c t P n ∆-∆-μλ (b ) ))(1(1t c t P n ∆∆-+μλ (c ) )1)(1(t c t P n ∆-∆-μλ (d ) t c t P n ∆∆μλ)( 由上面的公式得到:
11--⎪⎪⎭
⎫
⎝⎛-⎪⎪⎭⎫
⎝⎛+=n n n P c P c c P μ
λμ
μλ 0!
P n P n
⨯⎪⎪⎭⎫ ⎝⎛=
μλ,c n <≤1
0!P c
c P c
n n
n -⎪⎪⎭⎫ ⎝⎛=
μλ,c n ≥
解得:
∑
-=⎪⎪⎭
⎫
⎝⎛-⎪⎪⎭
⎫ ⎝⎛+
⎪⎪⎭⎫ ⎝⎛=
1
01!!
1
c n c
n
c n P μλμλμλ
程序流程图
由此可得,
平均病人数目为()()
2
!1λμμλλμ--⎪⎪⎭
⎫ ⎝⎛=
c c P L c
q ,
每个病人平均候诊时间为()()
2
0!1λμμλμ--⎪⎪⎭
⎫ ⎝⎛=
c c P W c
q
问题的深入:
以上仅仅求得了平均病人数目和平均就诊时间,我们可以明显的看到,当有一个诊台数目c 时就可以得到对应的平均病人数目和平均就诊时间,但我们并不能判断何时系统的诊台配置为最优,为此我们将此问题进一步加以深入。假设加权系数21,k k ,使得问题化为求)**min(21c k W k q +,即适当选取c 值使得系统有最小值,则认为此时的c 值即为最优选择。将问题进一步简化,令12/k k k =,则原问题简化为求)*min(c k W q +。
由上一步结论可见,在病人平均候诊时间q W 中含有c 的阶乘及乘方项,很难对此问题进行求解。为此查阅了有关的书籍及资料,但均未能找到相应的解法。无奈只有自己设计了一个计算机解法,但仍有一定的局限性。计算机解法的流程图如上图所示。
计算机求解
以下是该排队算法的源程序清单(C 语言版)
#include "stdio.h" long fang(float x,int n) {long y=1; int i;
for(i=0;i long jie(int n) {int i; long y=1; for(i=1;i<=n;i++) y=y*n; return (y); } main( ) {double w,u,y ,l,p,z,m,k,b,a,s=0; int c,i,n,j=10,h=10; printf("Please input u,l,k!\n"); scanf("%f,%f,%f",&u,&l,&k); for(c=1;c<=j;c++) {for(i=c-1;i {s=fang(l,i)/jie(i)+s; y=s; } a=c*u; b=a-l; y=y+fang(l,c)/(jie(i)*b/a); p=1/y; w=u*fang((l/u),c)*p/jie(c-1)/fang((c*u-l),2); z=w+k*c; if(c==1) m=z; if(z {m=z; n=c; } if(n==j) j=j+h; else if(j>10&&n>j-h) j=j+h; } printf("%f,%d",m,n); } 小结 俗话说,要学以致用,学于生活,我们所学到的知识只有灵活运用于生活当中才有更大的价值,运筹学等应用数学尤其如此。关于这道题主要的灵感来源于生活当中小事(在医院排队),但是每一件小事如果深入研究都会有好的收获。由于本人的数学功底的限制,暂时无法给出这种类型的题目的最优解,只用通过计算机仿真来实现最后的最优预测。 相关参考书目: 《运筹学方法及其BASIC语言程设》王修才