体检排队问题摘要:排队是日常生活中常见的现象。
本文讨论的是如何安排受检人员的体检顺序,以提高设备利用率、降低受检人员等待时间的问题,针对个人和团体建立了体检排队系统的优化模型,实现了以体检时间、路途时间及排队时间之和最小为目标函数的非线性规划模型,即排队动力学模型。
将对原目标函数的求解转化为求最优问题,求最优解,从而运用图论原理、VC6.0软件编程对个人的体检顺序做出定性分析和定量安排,并设计数据予以检验。
在此基础上,将团体的各队员全部分开,建立各体检者的等待时间最短为约束条件的非线性规划模型,求得团体时间最短,解决体检排队问题。
关键词:排队动力学模型;排队论;最优解;图论原理;VC++6.0;一、问题重述在某城市的体检中心每天有许多人前去体检,全部体检项目包括:抽血、内科、外科、B 超、五官科、胸透、身高、体重、…等等。
每个人的体检项目可能各不相同,假设每个体检项目的服务时间是确定的,并且只有1个医生值班,每次只能为1个客户服务。
为提高设备利用率、降低客人的等待时间,中心请你帮助完成如下任务:1.请你为某个新来的客人安排他的体检顺序,使其完成需要的全部检查的时间尽量少(在各个体检项目处都可能有人排队等待);2.设计1组数据来验证上述结论;3.接待团体客人时,如何安排每个人的体检顺序,使得体检中心能尽快完成任务,设计1组数据来验证该结论。
二、问题分析病人在就诊检查时,由于医院的医疗器件、医生人数的限制,或是由于病人就诊检查规则的不合理,会导致时间的浪费。
为了节约时间并保证体检有序的进行,那么选择一个合适的检查科目是非常有必要的。
问题一:假设客人到来之前就有人在排队等候就诊,那么新来的客人则需选择排队时间最少的科室,某科室排队的队长i L ,科室就诊的速度为i V ,那么第一次所需等候的时间iii V L T0,选择最小的值记为1T ,确定体检科室,检查完毕后,继续选择下一个科室;中途科室与科室之间有一定距离,需要的时间为t ,在选择下一个科室时,选择出1i T 的最小值,记为2T ;在经历k-1次科室的变换后,选择最后一个科室进行体检,所需的时间记为n T ,结束体检,则该客人体检所需的总时间为T ,即为1T ,2T ,……,n T 之和。
问题二:根据问题一提供的排队优化方法,输入k,i,t,i V V ,,1 ,00201,,i l l l ,……,11211,,,---k i k k l l l 的值,验证问题一的正确性。
问题三:因为为团体客人并且每个人的体检项目可能各不相同,所以团体客人是同时到达体检地点,要求体检中心能尽快完成任务,所以需要团体检查时间最少,而团体检查时间最少,则是团体之中最后一位客人被检查完毕,即团体时间最少。
在团体之中,各个成员按照问题一的解决方法,即可得到各位客人的最短体检时间,由于各位客人是同时到达,各客人中个人最短时间中的最大值即为团体体检的最短时间。
三、模型假设1.假设一开始就站在了最优选择的科室的队列之中;2.省略其他医院体检流程,直接进入排队体检项目;3.在体检室旁边具有显示各个科室排队长度及就诊速度的显示仪器;4.从一个科室到另一个科室的时间一定;5.在同一次做出选择的时候,没有出现两个最优科室;6.按先到先服务的原则进行体检,不考虑插队和优先等特殊情况;7.在接待团队客人,如果多个客人选择同一科室,增加的队列长队忽略不计。
四、符号说明对抽血、内科、外科、B超、五官科、胸透、身高、体重等科室分别用1,2,3……,n表示,其参数变量如下:iL:第i个科室在就诊前的队长(i=1,2,3……n)iV:第i个科室的平均就诊速度(i=1,2,3……n)kiT:第k次变换科室后,在第i个科室的等待及就诊时间(k=0,1,2……;i=1,2,3……n)t:从一个科室到另一个科室所需的时间kil:第k次变换科室后,科室i的新增队长(k=0,1,2……;i=1,2,3……n)T:就诊完所需的总时间五、模型的建立与求解该模型为排队优化模型。
运用、排队论构建体检排队系统的优化模型,旨在提高设备利用率、减少受检人员等待时间,运用图论知识、元胞自动机算法,建立以体检时间、路途时间及排队时间之和最小为目标函数的排队优化模型。
5.1 问题一模型的建立与求解在第零次变换科室,即第一次选择科室时,如果去第i科室所需的时间i iii V lL T 0+=,在01T,02T,……,0iT之中,选择值最小的科室就诊,所用的最短时间记为1T,此科室检查完毕后,选择另一个科室体检; 第一次换科室时,各个科室所需的等候时间⎪⎩⎪⎨⎧+>+++-+++≤++=ii i i i i i i i i i i i V t T l l L V V t T l l L V t T l l L T )(,)()(0110i 1101101,, 选择1i T 中的最小值所在科室体检,所用时间记为2T ,此科室检查完毕后,选择另一个科室体检; 同理可得到:第k-2次换科室时,剩余科室所需的等候时间可以表示为:⎪⎩⎪⎨⎧++⋯⋯++>++⋯⋯++++⋯⋯++-++⋯⋯++++⋯⋯++≤++⋯⋯++=-------i k i k i i i i k i k i i i ik i k i i i i V T T T l l l L V V t T T T l l l L V T T T l l l L T ]t 2-k [,]2-k []t 2-k [02-k 21120i 2-k 211202-k 211201k )()()(,,从1k -i T 表示的两个值中,选择最小值的所在科室体检,所用时间记为1-k T ,进行最后一个科室的体检。
第k-1次换科室时,最后一个科室所需的等候时间可以表示为:⎪⎩⎪⎨⎧++⋯⋯++>++⋯⋯++++⋯⋯++-++⋯⋯++++⋯⋯++≤++⋯⋯++=---ik i k i i i ik i k i i i ik i k i i i i V T T T l l l L V V t T T T l l l L V T T T l l l L T ]1)t -k ([,]1)-k ([]t 1-k [01-k 2110i 1-k 21101-k 2110k )(,将最后一个科室检查的时间作为k T ,体检结束。
因此,新顾客排队体检的总时间可表示为:t T T T T )(1-k k 21++⋯⋯++=5.2问题二:根据问题一,设计的具体数据为:附录一(问题一数据检验),C++程序见附录三。
在第零次变换科室,即第一次选择科室时,如果去1,2,3,4,5科室所需的时间分别为13,44,24,18,44,则选择值最小的科室1体检,所用的最短时间记为1T ,即1T =13,此科室检查完毕后,选择另一个科室体检;第一次换科室时,2,3,4,5科室所需的等候时间为41,13,7,41,则选择4科室体检,所用时间记为2T ,即2T =7,此科室检查完毕后,选择另一个科室体检;第二次换科室时,2,3,5科室所需的等候时间为52,16,40,则选择3科室体检,所用时间记为3T ,即3T =16,此科室检查完毕后,选择另一个科室体检;第三次换科室时,2,5科室所需的等候时间为50,38,则选择5科室体检,所用时间记为4T ,即4T =38,此科室检查完毕后,直接去最后一个科室体检;第四次换科室,即最后一个科室项目体检时,2科室所需的等候时间为14,则所用时间记为5T ,即5T =14,体检结束。
因此,新顾客排队体检的总时间可表示为:t T T T T )(1-k k 21++⋯⋯++==13+7+16+38+14+(5-1)*2=96检查顺序:25341→→→→符合问题一中的结论。
5.3问题三:接待团体客人时,使得体检中心能尽快完成任务,但是团体客人并非每个客人都到相同的科室检验,所以客人的体检项目可能各不相同。
由于团体客人是同时到达,因此,团体客人里单个客人的最短时间中的最大值就是团体体检最小值。
同时,在接待团队客人,如果多个客人选择同一科室,增加的队列长队忽略不计在团体之中,各个成员按照问题一的解决方法,即可得到各位客人的最短体检时间,然后找到客人体检时间最长的那个人,就是团体体检所花的最短时间。
根据上述问题,设计的检验数据见附录二(团体客人检验数据)。
我们设计了一个以3人为团体的体检方案。
假如3人体检项目各不相同,第1人检查的项目有:1、2、4、5、6科室;第2人检查的项目有:2、4、5科室;第3人检查的项目有:2、4、5、6科室。
我们利用C++ 程序求解得到三人的体检方案(如下表)。
表1 三人团体体检方案体检人员体检顺序花费时间(分钟)第1人1->5->4->6->2 92第2人5->4->2 76第3人5->4->6->2 92 从表中可以看出:该团体体检时间完成的最短时间为:92分钟。
六、模型评价对此体检排队问题的建模方法简单,采用优化模型,便于实现。
利用该模型安排体检排队问题,给体检者减少了等待时间,并且不需要医院投入太多的设备和医务人员,该模型实现十分灵活,适用于多种情况下的医生就医问题。
优点:1.可直接应用于医院的体检排队问题;2.能提高医院体检效益。
兼顾了提高设备利用率,使得各项体检设备都得以发挥其最大效用。
使得患者等待成本和医院服务成本之和最小;3.能实现医院体检的产品化排队系统。
深入探讨可构建可视化操作平台,制作辅助排队系统,使之产品化;缺点:1.可能出现机遇的情况,体检项目多的客人比体检项目少的客人有可能花的时间更少;2.给出的数据组来验证该结论,只能说明对于这组数据而言,该结论成立,还需要更多的数据来验证,这样才能不失一般性.推广:在售票处、银行窗口、公用电话亭、游乐场的游乐项目等涉及排队的场所均有较强的实用性。
帮助客人减少等待时间.七、参考文献[1]《运筹学》教材编写组.运筹学(第三版).北京:清华大学出版社,2005.6[2]卢向南, 李俊杰. 应用运筹学[M].浙江大学出版社,2005,2.[3]姜启源. 数学模型(第三版). 北京:高等教育出版社,2003.8[4]马琳,疗养院体检中心动态排队系统建设[J],中国数字医学,2007年。
[5]刘京梅,科学的组织管理运用于大批量人员体检工作中[J],中原医刊,2004年。
[6]张鹭鹭,医疗卫生服务系统建模方法学研究[J],解放军医院管理杂志,2007,3(3):237。
[7]Dayan B,Leiba,Weiss,,et a1.Waiting time is a major predictor of patient satisfaction in a primary military Med,2002,167:842-845.八、附录附录一:问题一数据检验输入数据(input.txt):5 5 210 3 4 6 7 416 6 8 8 8 212 0 2 6 0 114 4 4 0 0 316 6 6 4 8 41 0.5 0.5 1 0.5151 2 3 4 5输出数据(output.txt):最佳安排:----------------------------------------------------------第1人-------------------------------------------------------------------------第1轮-----------------------10 3总人数:13 - 走的人数:0所花时间:1316 6总人数:22 - 走的人数:0所花时间:4412 0总人数:12 - 走的人数:0所花时间:2414 4总人数:18 - 走的人数:0所花时间:1816 6总人数:22 - 走的人数:0所花时间:44----------------资料-----------------------1->----------------第2轮-----------------------16 6 8总人数:30 - 走的人数:7.5所花时间:4512 0 2总人数:14 - 走的人数:7.5所花时间:1314 4 4总人数:22 - 走的人数:15所花时间:716 6 6总人数:28 - 走的人数:7.5所花时间:41----------------资料----------------------- 4->----------------第3轮----------------------- 16 6 8 8总人数:38 - 走的人数:12所花时间:5212 0 2 6总人数:20 - 走的人数:12所花时间:1616 6 6 4总人数:32 - 走的人数:12所花时间:40----------------资料----------------------- 3->----------------第4轮----------------------- 16 6 8 8 8总人数:46 - 走的人数:21所花时间:5016 6 6 4 8总人数:40 - 走的人数:21所花时间:38----------------资料----------------------- 5->----------------第5轮----------------------- 16 6 8 8 8 2总人数:48 - 走的人数:41 所花时间:14----------------资料----------------------- 2->检查完毕最短时间: 96分钟*************************************共计最短总时间:96分钟*************************************附录二:问题三数据检验输入数据(input.txt):10 10 210 3 4 6 7 0 3 4 1 4 316 6 8 8 8 0 2 4 6 6 314 2 2 0 6 0 8 6 8 10 112 0 2 6 0 4 6 4 8 2 514 4 4 0 0 2 6 6 4 2 116 6 6 4 8 4 6 8 6 2 814 6 4 4 4 8 2 4 2 4 112 2 2 0 2 0 4 0 0 6 214 0 0 0 0 6 4 0 2 4 416 6 4 6 4 8 2 0 2 4 51 0.52 0.5 1 0.5 1 0.5 1 2351 62 5 432 5 442 4 5 6输出数据(output.txt):最佳安排:----------------------------------------------------------第1人-------------------------------------------------------------------------第1轮-----------------------10 3总人数:13 - 走的人数:0所花时间:1316 6总人数:22 - 走的人数:0所花时间:4416 6总人数:22 - 走的人数:0所花时间:4414 4总人数:18 - 走的人数:0所花时间:1812 0总人数:12 - 走的人数:0所花时间:24----------------资料-----------------------1->----------------第2轮-----------------------16 6 6总人数:28 - 走的人数:7.5所花时间:4116 6 8总人数:30 - 走的人数:7.5所花时间:4514 4 4总人数:22 - 走的人数:15所花时间:712 0 2总人数:14 - 走的人数:7.5所花时间:13----------------资料-----------------------5->----------------第3轮-----------------------16 6 6 4总人数:32 - 走的人数:12所花时间:4016 6 8 8总人数:38 - 走的人数:12所花时间:5212 0 2 6总人数:20 - 走的人数:12所花时间:16----------------资料-----------------------4->----------------第4轮-----------------------16 6 6 4 8总人数:40 - 走的人数:21所花时间:3816 6 8 8 8总人数:46 - 走的人数:21所花时间:50----------------资料-----------------------6->----------------第5轮-----------------------16 6 8 8 8 0总人数:46 - 走的人数:41所花时间:10----------------资料-----------------------2->检查完毕最短时间: 92分钟----------------------------------------------------------第2人-------------------------------------------------------------------------第1轮-----------------------16 6总人数:22 - 走的人数:0所花时间:4414 4总人数:18 - 走的人数:0所花时间:1812 0总人数:12 - 走的人数:0所花时间:24----------------资料-----------------------5->----------------第2轮-----------------------16 6 8总人数:30 - 走的人数:10所花时间:4012 0 2总人数:14 - 走的人数:10所花时间:8----------------资料-----------------------4->----------------第3轮-----------------------16 6 8 8总人数:38 - 走的人数:15所花时间:46----------------资料-----------------------2->检查完毕最短时间: 76分钟----------------------------------------------------------第3人-------------------------------------------------------------------------第1轮-----------------------16 6总人数:22 - 走的人数:0所花时间:4412 0总人数:12 - 走的人数:0所花时间:2414 4总人数:18 - 走的人数:0所花时间:1816 6总人数:22 - 走的人数:0所花时间:44----------------资料-----------------------5->----------------第2轮----------------------- 16 6 8总人数:30 - 走的人数:10所花时间:4012 0 2总人数:14 - 走的人数:10所花时间:816 6 6总人数:28 - 走的人数:10所花时间:36----------------资料----------------------- 4->----------------第3轮----------------------- 16 6 8 8总人数:38 - 走的人数:15所花时间:4616 6 6 4总人数:32 - 走的人数:15所花时间:34----------------资料----------------------- 6->----------------第4轮----------------------- 16 6 8 8 8总人数:46 - 走的人数:33所花时间:26----------------资料----------------------- 2->检查完毕最短时间: 92分钟*************************************共计最短总时间:92分钟*************************************附录三:C++源程序#include<iostream>#include<fstream>#include<string>using namespace std;static int Tijian[100];static int NeedData[100][101];static int ktemp;static double NeedSpeed[30];static int TotleTime;static int Totlemount;double compare(double a[30],int k){int i,j,temp;for(j=0;j<k;j++) //用冒泡排序比较它们,从大到小{for (i=0;i<k-j;i++)if (a[i]<a[i+1]){ temp=a[i];a[i]=a[i+1];a[i+1]=temp;}}return a[k-1];}double compare2(double b[30],int k){double a[30];for(int m=0;m<k;m++){a[m]=b[m];}int i,j,temp;for(j=0;j<k;j++) //用冒泡排序比较它们,从小到大{for (i=0;i<k-j;i++)if (a[i]>a[i+1]){ temp=a[i];a[i]=a[i+1];a[i+1]=temp;}}return a[k];}int way(int k,double speed[30],int degree){degree++;double data[100][101];for(int itemp5=0;itemp5<=Totlemount;itemp5++)for(int itemp6=0;itemp6<=Totlemount+6;itemp6++){data[itemp5][itemp6]=NeedData[itemp5][itemp6];}double timetemp[100];double NowPeople=0;cout<<endl;cout<<"----------------第"<<degree<<"轮-----------------------"<<endl;for(int itemp9=0;itemp9<k;itemp9++){NowPeople=0;for(int jtemp=0;jtemp<=degree;jtemp++){NowPeople+=data[itemp9][jtemp];cout<<" "<<data[itemp9][jtemp];// cout<<NowPeople<<" "<<endl;}cout<<"总人数:"<<NowPeople;NowPeople-=TotleTime*speed[itemp9];cout<<" - 走的人数:"<<TotleTime*speed[itemp9]<<endl;if(NowPeople>0){timetemp[itemp9]=NowPeople/speed[itemp9];}else{timetemp[itemp9]=0;}cout<<"所花时间:"<<timetemp[itemp9]<<endl;}cout<<"----------------资料-----------------------"<<endl;double tempTT[100];for(int i=0;i<k;i++){tempTT[i]=timetemp[i];}int mtemp=compare(tempTT,k);for(int itemp=0;itemp<k;itemp++){// cout<<timetemp[itemp]<<"....";if(timetemp[itemp]==mtemp){cout<<Tijian[itemp]<<"->"<<endl;for(int nowtemp=itemp;nowtemp<=Totlemount;nowtemp++) {for(int jtemp=0;jtemp<=Totlemount;jtemp++){NeedData[nowtemp][jtemp]=data[nowtemp+1][jtemp];}NeedSpeed[nowtemp]=speed[nowtemp+1];}int Tijiantemp[100];for(int m=0;m<k;m++){Tijiantemp[m]=Tijian[m];}for(;itemp<k-1;itemp++)Tijian[itemp]=Tijiantemp[itemp+1];// for(int m1=0;m1<k;m1++)// cout<<Tijian[m1]<<" ";ktemp--;return mtemp;}return 0;}void main(){int k,i,t;TotleTime=0;int temp;freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);cin>>k>>i>>t;Totlemount=i;cout<<"最佳安排:"<<endl;double Data[100][100];//定数据义变量for(int itemp=0;itemp<k;itemp++)//读入矩阵{for(int j=0;j<k+1;j++){cin>>Data[itemp][j];}}double speed[30];for(int itemp2=0;itemp2<k;itemp2++)//读入速度{cin>>speed[itemp2];}int howpeople;//代表多少人cin>>howpeople;int Duoshao;double Time[30];for(int temp_i=0;temp_i<howpeople;temp_i++){cout<<endl;cout<<"----------------------------------------------------------"<<endl;cout<<" 第"<<temp_i+1<<"人"<<endl;cout<<"---------------------------------------------------------" <<endl;cout<<endl;TotleTime=0;cin>>Duoshao;for(int itemp3=0;itemp3<Duoshao;itemp3++)cin>>temp;Tijian[itemp3]=temp;NeedSpeed[itemp3]=speed[temp-1];for(int jtemp=0;jtemp<=Totlemount;jtemp++)NeedData[itemp3][jtemp]=Data[temp -1][jtemp];}ktemp=Duoshao;for(int itemp4=0;itemp4<Duoshao;itemp4++ ){TotleTime+=way(ktemp,NeedSpeed,itemp4);TotleTime+=t;}TotleTime-=2;cout<<"检查完毕"<<endl;cout<<"最短时间: "<<TotleTime<<"分钟"<<endl;cout<<endl;cout<<endl;Time[temp_i]=TotleTime;}cout<<" *************************************"<<endl;cout<<" 共计最短总时间:"<<compare2(Time,howpeople)<<"分钟"<<endl;cout<<" *************************************"<<endl;}。