文章目录
1. 按
生活中需要排队的地方很多,本模型用于分析和仿真现实生活中的排队现象。\ 排队论发源于上世纪初。当时美国贝尔电话公司发明了自动电话,以适应日益繁忙的工商业电话通讯需要。这个新发明带来了一个新问题,即通话线路与电话用户呼叫的数量关系应如何妥善解决,这个问题久久未能解决。\ 1909年,丹麦的哥本哈根电话公司A.K.埃尔浪(Erlang)在热力学统计平衡概念的启发下解决了这个问题。1917 年,爱尔朗发表了他的著名的文章—“自动电话交换中的概率理 论的几个问题的解决”。排队论已广泛应用于解决军事、运输、维修、生产、服务、库 存、医疗卫生、教育、水利灌溉之类的排队系统的问题,显示了强大的生命力。
2. 排队现象
排队是在日常生活中经常遇到的现象,如顾客到商店购买物品、病人到医院看病常 常要排队。此时要求服务的数量超过服务机构(服务台、服务员等)的容量。也就是说, 到达的顾客不能立即得到服务,因而出现了排队现象。这种现象不仅在个人日常生活中 出现,电话局的占线问题,车站、码头等交通枢纽的车船堵塞和疏导,故障机器的停机 待修,水库的存贮调节等都是有形或无形的排队现象。由于顾客到达和服务时间的随机性。可以说排队现象几乎是不可避免的。
| 到达顾客 | 服务内容 | 服务机构 | | ----- | ------ | ------ | | 病人 | 诊断/手术 | 医生/手术台 | | 进港的货船 | 装货/卸货 | 码头泊位 | | 到港的飞机 | 降落 | 机场跑道 | | 电话拨号 | 通话 | 交换台 | | 故障机器 | 修理 | 修理技工 | | 修理技工 | 领取修配零件 | 仓库管理员 | | 上游河水 | 入库 | 水闸管理员 |
3. 模型介绍
(1)由于顾客到达和服务时间的随机性,\ 现实中的排队现象几乎不可避免;\ (2)排队过程,通常是一个随机过程,\ 排队论又称“随机服务系统理论”;
3.1. 排队服务过程
3.2. 排队系统的要素
(1)顾客输入过程;\ (2)排队结构与排队规则;\ (3)服务机构与服务规则;
3.3. 顾客输入过程
顾客源(总体):有限/无限;\ 顾客到达方式:逐个/逐批;(仅研究逐个情形)\ 顾客到达间隔:随机型/确定型;\ 顾客前后到达是否独立:相互独立/相互关联;\ 输入过程是否平稳:平稳/非平稳;(仅研究平稳性)\
3.4. 排队结构与排队规则
顾客排队方式:等待制/即时制(损失制);\ 排队系统容量:有限制/无限制;\ 排队队列数目: 单列/多列;\ 是否中途退出: 允许/禁止;\ 是否列间转移: 允许/禁止;\ (仅研究禁止退出和转移的情形)
3.5. 服务机构与服务规则
服务台(员)数目;单个/多个;\ 服务台(员)排列形式;并列/串列/混合;\ 服务台(员)服务方式;逐个/逐批;(研究逐个情形)\ 服务时间分布;随机型/确定型;\ 服务时间分布是否平稳:平稳/非平稳;(研究平稳情形)\
3.6. 服务台(员)为顾客服务的顺序
a)先到先服务(FCFS);\ b)后到先服务(LCFS);\ c)随机服务;\ d)优先服务;
3.7. 到达间隔和服务时间典型分布
(1)泊松分布M ;\ (2)负指数分布M ;\ (3)k阶爱尔朗分布Ek;\ (4)确定型分布D;\ (5)一般服务时间分布G;
3.8. 排队模型示例
——M/M/1,M/D/1,M/ Ek /1;\ ——M/M/c,M/M/c/∞/m,\ ——M/M/c/N/∞,…
3.9. 系统运行状态参数
系统状态N(t):指排队系统在时刻t时的全部顾客数N(t),包括“排队顾客数”和“正被服务顾客数”;
系统状态概率:
- 瞬态概率P n ( t ) P_{n}(t)Pn(t):表示时刻t系统状态N(t)=n 的概率;
- 稳态概率P n P_{n}Pn:\ P n = lim t → ∞ P n ( t ) P_{n}=\lim _{t \rightarrow \infty} P_{n}(t)Pn=limt→∞Pn(t)\ 一般排队系统运行了一定长的时间后,系统状态的概率分布不再随时间t变化,即初始时刻(t=0)系统状态的概率分布 (P n ( 0 ) P_{n}(0)Pn(0), n>>0)的影响将消失。
3.10. 系统运行指标参数
用于评价排队系统的优劣。
队长与排队长\ (1)队长: 系统中的顾客数(n)期望值记为L s L_{s}Ls;\ (2)排队长: 系统中排队等待服务的顾客数;\ 期望值记为L q L_{q}Lq
逗留时间与等待时间\ (1)逗留时间:指一个顾客在系统中的全部停留时间;期望值,记为W s W_{\mathrm{s}}Ws\ (2)等待时间:指一个顾客在系统中的排队等待时间;期望值,记为W q W_{\mathrm{q}}Wq\ W s W_{\mathrm{s}}Ws= W q W_{\mathrm{q}}Wq + E[服务时间]
其他相关指标\ (1)忙期: 指从顾客到达空闲服务机构起到服务机构再次空闲的时间长度;\ (2)忙期服务量:指一个忙期内系统平均完成服务的顾客数;\ (3)损失率: 指顾客到达排队系统,未接受服务而离去的概率;\ (4)服务强度:ρ= λ/sμ;
``` function varargout = ChaoShiXiTong(varargin) guiSingleton = 1; guiState = struct('guiName', mfilename, ... 'guiSingleton', guiSingleton, ... 'guiOpeningFcn', @ChaoShiXiTongOpeningFcn, ... 'guiOutputFcn', @ChaoShiXiTongOutputFcn, ... 'guiLayoutFcn', [] , ... 'guiCallback', []); if nargin && ischar(varargin{1}) guiState.gui_Callback = str2func(varargin{1}); end
if nargout [varargout{1:nargout}] = guimainfcn(guiState, varargin{:}); else guimainfcn(guiState, varargin{:}); end % End initialization code - DO NOT EDIT
% --- Executes just before ChaoShiXiTong is made visible. function ChaoShiXiTong_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to ChaoShiXiTong (see VARARGIN)
% Choose default command line output for ChaoShiXiTong clc; handles.output = hObject;
% Update handles structure guidata(hObject, handles);
% UIWAIT makes ChaoShiXiTong wait for user response (see UIRESUME) % uiwait(handles.gaotiepaiduixitong);
% --- Outputs from this function are returned to the command line. function varargout = ChaoShiXiTong_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure varargout{1} = handles.output;
%-----------菜单部分的制作---------------------% %------------帮助菜单-------------------------%
function help_Callback(hObject, eventdata, handles)
% 菜单多服务台系统仿真说明函数 function notice_Callback(hObject, eventdata, handles) h = figure('MenuBar','none','Name','多服务台排队论模型说明','NumberTitle',... 'off','units','pixels','position',[500,400,400,200],'Windowstyle','modal'); uicontrol('style','text','units','pixels','position',[50 60 300 80],... 'string','本仿真系统是标准的M/M/N排队模型,各服务台平均服务时间相同;服务员中间没有休息、排队容量不受限制;采用下次事件时间推进机制和先到先服务FIFO排队规则;选择选排队最短的柜台',... 'BackgroundColor',get(h,'Color'),... 'fontsize',16,'foregroundcolor','b','fontname','宋体'); uicontrol('string','关闭','units','pixels','position',[160 30 70 40],... 'fontsize',16,'fontweight','bold','foregroundcolor','b','callback',... 'delete(gcf);');
% 菜单运行指南 function guideCallback(hObject, eventdata, handles) h = figure('MenuBar','none','Name','运行指南','NumberTitle',... 'off','units','pixels','position',[500,400,400,200],'Windowstyle','modal'); uicontrol('style','text','units','pixels','position',[50 60 300 80],... 'string','输入参数,点击运行,可输出模型结果',... 'BackgroundColor',get(h,'Color'),... 'fontsize',16,'foregroundcolor','r','fontname','黑体'); uicontrol('string','关闭','units','pixels','position',[160 30 70 40],... 'fontsize',16,'fontweight','bold','foregroundcolor','b','callback',... 'delete(gcf);'); % 退出菜单 function exitCallback(hObject, eventdata, handles) selection = questdlg(['关闭 ' get(handles.gaotiepaiduixitong,'Name') '?'],... ['关闭 ' get(handles.gaotiepaiduixitong,'Name') '...'],... ' 是 ',' 否 ',' 是 '); if strcmp(selection,' 否 ') return; end
% delete(handles.gaotiepaiduixitong) close(gcf);
%——————————————————————————————以下正文
%顾客平均等待时间编辑框 function wq_Callback(hObject, eventdata, handles)
function wq_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end
%服务员繁忙程度编辑框 function ps_Callback(hObject, eventdata, handles)
function ps_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end
%顾客平均排队长度按钮 function ls_Callback(hObject, eventdata, handles)
function ls_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end
%设备配置弹出框 function fwts_Callback(hObject, eventdata, handles) global tai h = get(hObject,'value'); tai = h;
function fwts_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end
%顾客平均到达强度编辑框 function ddl_Callback(hObject, eventdata, handles)
function ddl_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end
%服务强度编辑框 function fwl_Callback(hObject, eventdata, handles)
function fwl_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end
% 运行按钮 function calc_Callback(hObject, eventdata, handles) global Lambda %顾客到达强度 global Lamda %顾客购物强度 global Minu %柜台服务强度 global tai %柜台数
handles=guihandles; guidata(hObject,handles);%更新数据 %读取到达强度,转换为数字 lambda = str2double(get(handles.ddl,'string')); %读取服务强度,转换为数字 minu = str2double(get(handles.fwl,'string'));
%判断仿真类型,服务台个数为1时,即是单服务台;大于1时,便是多服务台 ru = lambda/(minutai); %服务机构的平均利用率 if (ru > 0)&&(ru < 1) &&(lambda>0) && (minu>0) && (tai>0) P0=0; %计算初始转移概率 for i=0:tai-1 P0=P0+(rutai)^i/factorial(i); end P0=P0+((rutai)^tai)/(tai(1-ru)factorial(tai)); P0=1/P0; %初始转移概率 Lq = ((tairu)^tai)ruP0/(factorial(tai)(1-ru)^2); %平均排队长 Ls = Lq + lambda/minu; %平均队长 Wq = Lq/lambda; %平均等待时间 Ps = 1-P0; %服务利用率 p=lambda/((minu)(tai)); %服务员繁忙程度 else errordlg('请仔细检查,重新输入','错误'); return; end %显示顾客平均等待时间,顾客排队长度,服务员繁忙程度 set(handles.wq,'string',num2str(Wq)); set(handles.ls,'string',num2str(Ls)); set(handles.ps,'string',num2str(p)); clear P0,clear Lq %删除变量,释放内存
% 重置按钮 function reset_Callback(hObject, eventdata, handles) set(handles.ddl,'String',0); set(handles.fwl,'String',0);
set(handles.wq,'String','0'); set(handles.ls,'String','0'); set(handles.p,'String','0'); guidata(hObject, handles);
% --- Executes on button press in fangzhen. function fangzhen_Callback(hObject, eventdata, handles) global Lambda %顾客到达强度 global Lamda %顾客购物过强度 global Minu %服务员服务强度 global tai %柜台数
load halton %% 生成随机到达时间间隔、购物时间及每个柜台结账服务时间 Arrin = -1/Lambda.log(halton(1:1000,1)); %生成到达时间间隔 Carral = cumsum(Arrin); %到达时刻 Ncus = max(find(Carral<180)); %% 3个小时内到达的总顾客数 Shopping = -1/Lamda.log(halton(1:1000,2)); %生成购物时间间隔 Service = -1/Minu.*log(halton(1:1000,3)); %生成服务时间间隔 ArriGui = Carral+ Shopping; %所有顾客到达服务台的到达时刻及顺序,记为ArrGui
%% 初始化每个柜台的状态1 for g = 1:N Gui(g).Qu = [0,0]; % 按事件时间记录柜台g的排队,0时刻排队为0 Gui(g).Bu = [0,0];% 0表示空闲,1表示繁忙,0时刻空闲 Gui(g).Arrivaltime = []; %选择柜台g的顾客到达柜台的时间 Gui(g).startser=[]; %选择柜台g的顾客开始接受服务的时间 Gui(g).wait=[]; %选择柜台g的顾客排队等待的时间 Gui(g).servetime=[]; %选择柜台g的顾客接受服务的时间 Gui(g).Leavetime = []; %选择柜台g的顾客离开柜台的时间 Gui(g).cusnu = []; % 选择柜台g的顾客代码 Gui(g).staytime = []; %选择柜台g的顾客在服务台停留的时间 end ```