第一篇:銀行排隊系統的優化
題目:銀行排隊系統的優化
論文通過分析銀行售票窗口的排隊系統實例,根據排隊系統的數量指標銀行售票處的排隊系統,確定售票窗口的開設個數。首先通過題目所給數據確定單位時間到達的顧客人數和每位顧客在售票窗口前的服務時間分別服從Possion分布和雙參數指數分布,從而確定排隊系統符合n個M/G/1排隊系統模型;接著通過排隊系統的數量指標確定銀行設立售票窗口個數的最優值,得到的是系統效率較高且成本較低,并提出能使顧客達到滿意最大化的方案,最后提出論文中解決排隊問題方法的普適性。
關鍵字:排隊論分布擬合檢驗M/G/1模型最優化客戶滿意度
一、問題重述
1.1背景分析
隨著我國加入WTO以后,國有銀行的日益壯大,各種商業銀行的創辦,銀行為了經營效益,將不高的營業網點拆并,網點資源減少后,客戶流進一步像現有網點集中,導致客戶排隊現象突出,造成客戶等待時間過長,引發服務投訴和存款的流失。本文結合我國銀行營業廳排隊問題的現狀,利用排隊論原理及其模型對排隊服務制度上的問題進行剖析,找出最優方案,旨在提高銀行服務質量和最大收益。1、2問題重述
此題對已給的顧客到達時間和銀行服務時間,研究符合經理的條件:期待顧客平均等待時間小于2分鐘,平均隊列長度小于等于2人,在給定的每天大約150名顧客的前提下提供服務,第一問是建立銀行排隊系統的優化模型,第二問是給出能提高顧客滿意度的優化方法,以此達到經理的的目標。
二、問題分析
第一問是要我們建立銀行排隊系統的優化模型,我們認為這里有必要引進排隊論的知識。
三、模型假設
1、影響排隊系統的因素是很多的,不包括特設或突發情況,如:顧客蠻不講理或遭遇災難等;
2、顧客一個一個到來,不同顧客之間到達相互獨立
3、顧客服務方式為一個一個進行的,采用先到先服務的原則
4、每位顧客的服務時間長度是隨機的,其分布對時間是平穩的
5、一個窗口可以辦理多項業務
6、排除銀行地理位置的影響因素
四、符號說明
(1)Ls:平均隊長:指系統內顧客數(包括正被服務的顧客與排隊等待服務的顧客)的 數學期望;
(2)Lq:平均排隊長:指系統內等待服務的顧客數的數學期望;
(3)Ws:平均逗留時間:顧客在系統內逗留時間(包括排隊等待的時間和接受服務的 時間)的數學期望;
(4)Wq:平均等待時間:指一個顧客在排隊系統中排隊等待時間的數學期望;
(5)Tb:平均忙期:指服務機構連續繁忙時間(顧客到達空閑服務機構起,到服務機 構再次空閑止的時間)長度的數學期望;
(6)?s:系統的服務強度;
(7)Cs:單位時間內每個服務臺的成本費;(8)Cw:單位時間內的總分費用的期望值;(9)W:系統中顧客總的等待時間
五、模型的建立與求解
設顧客單個到達,相繼到達時間間隔服從參數為λ的負指數分布,系統中共有s個 服務臺,每個服務臺的服務時間相互獨立,且服從參數為μ的負指數分布。當顧客到
達時,若有空閑的服務臺則馬上接受服務,否則便排成一個隊列等待,等待時間為無限。
p?P?N?n?下面來討論這個排隊系統的平穩分布。n(n=0,1,2,3,…….)為系統
達到平穩狀態后隊長N的概率分布,注意到對個數為s的多服務臺系統,有
?n??,n?0,1,2,...?n??
記?s?
?n?,n?0,1,21...s?s?,n?s,s?1,....?
s
?
???.....?0
則當?s?1時,由Cn?n?1n?2,n?1,2,......s??n?n?1.....?1
pn?Cnp0,n?1,2,...p0?
11??Cn
n?1?
得到:
?(??)n,n?1,2,...,s?
n!?
Cn??ns
????,n?s??(??)??????s!sn?s?s!?s??
所以
??n
?,n?1,2,...,s??n!0
pn??n
??p,n?s
??s!sn?s
其中
?s?1?n?s?p0?????
n!s!(1??)s??n?0
?1
由前面的公式給出了在平衡條件下系統中顧客數為n的概率,當n?s時,即系統中顧客
數大于或者等于服務臺個數時,這時再來的顧客必須等待,因此記
c?s,????pn?
n?s
?
?s
s!1??sp0
平均排隊長
p0?s
Lq???n?s?pn?
s!n?s?1
?
??n?s??
n?s
?
n?s
s
p0?sd??n?p0?s?s??s???2
s!d?s??n?1?s!?1??s?
記系統中正在接受服務的顧客平均數是s,顯然s也是正在忙得服務臺平均數,所以
?s?1?n?1??s?1n?n?s
?s??npn?s?pn??p0?sp0?p0??????n?1!s?1!1??s?s!1??sn?0n?sn?0n!?n?1s?1
?
s?
1上式說明,平均在忙的服務臺個數不依賴于服務臺個數s平均隊長Ls=平均排隊長+正在接受服務的顧客的平均數=Lq??平均逗留時間和平均等待時間分別為
Ws?
Ls
?,Wq?
Lq
?
?Ws?
?
六、模型檢驗
七、模型評價與改進
7.1模型的優點和缺點 7.1.1缺點
1、我們并沒有考慮到顧客的主觀因素;
2、排除了銀行位置和突發事件的不確定性因素;
3、對人數上限的約束較難實現; 7.1.2優點
1、我們通過分析的的道理了滿足條件的最優窗口數;
2、提出了滿足顧客需求的最優方案;
3、該模型適用于多種排隊系統,具有普適性; 7.2改進
八、模型推廣
應用排隊輪的理論和方法對服務機構進行定量分析評價,優化服務系統質量,提高效率,為設備的合理配置和有效利用提供科學的依據,這是進行布局規劃和可行性分析的一種有效途徑。該模型同樣適用于各種排隊系統,如火車售票系統,超市排隊系統
九、參考文獻
【1】楊米沙,銀行排隊系統分析及窗口設置優化研究,武漢理工大學學報,2008 【2】劉衛國,MALAB程序設計教程,中國水利水電出版社,北京,2005 【3】唐映輝,排隊論(基礎與應用),電子科技大學出版社,成都,2000 【4】
附錄
第二篇:銀行排隊
以人為本,解決銀行排隊問題
近年來,隨著經濟的快速發展和人們生活水平的提高,銀行排隊的問題凸顯出來。在一些大城市、繁華地帶和高峰時段,往往會出現排長隊的現象,辦理一次銀行業務要等好長時間。這種現象降低了人們的辦事效率,加大了交易成本,解決這個問題成為各方關注的焦點。
銀行排隊問題之所以如此突出,其原因是多方面的:其一,隨著經濟的發展,銀行的業務出現復雜化的趨勢,各種代收代繳的業務,各種金融理財產品加大了銀行的負擔;其二,銀行的服務態度和服務效率存在一些突出問題。銀行職員服務的主動性和業務的熟練程度有待加強,銀行窗口設置不夠合理和有效,銀行操作流程比較繁瑣,自助服務設施還不夠廣泛;其三,銀行和社會部門的金融業務有效對接存在問題,社會部門的金融業務往往沒有統一的標準,這導致了銀行處理此類業務效率較低,本可以通過批處理解決的業務卻只能單獨手動解決,大大降低了效率。另外,廣大客戶對自助設備不習慣使用、銀行對相關業務流程的宣傳不到位也是重要原因。
銀行排隊問題反映了銀行的服務水平和整個社會的協調能力,關系到廣大公民的日常生活,我們必須采取切實有效的措施解決好這個問題。
第一,銀行部門要有服務意識,要把客戶是上帝的理念落到實處,銀行不僅是商業部門,而且是窗口部門,是服務部門,銀行必須要加強自律,要為客戶提供優質的服務。要有效整合現有的資源,在人員配置和網點配置上實現優化,要對員工加強教育培訓,提高他們的業務素質和服務意識。要配備好大堂經理,以有效指導銀行客戶選擇合適的服務方式,以節約客戶的時間,提高銀行的效率。
第二,要增加相關方面的投入,在大城市、繁華地段增加網點,增設自助設備,增加服務人員,要加大宣傳力度,引導公眾使用電話銀行、電子銀行等新業務方式提高業務效率,要在銀行設定排號器等設施實現業務有序,要為等待的客戶提供休息和娛樂的服務。
第三,要有效整合社會資源,銀行要推動制定金融業務的統一規范標準,實現銀行和社會部門的無縫對接,要對客戶進行宣傳教育和引導,對客戶的簡單業務盡量說服通過自助設備進行,要通過宣傳單、標語指示牌等豐富多樣的方式對公眾進行服務引導。要引導公眾盡量避免高峰時段辦理業務。
第四,監管部門和行業組織要加強對銀行部門的管理和引導,要對銀行系統內的資源進行有效整合,各銀行網點和自助服務系統要實現有效對接,實現聯通服務。要吸收借鑒國內外的先進經驗,加強與優秀跨國公司的交流與合作。
總而言之,解決好銀行排隊的問題是貫徹以人為本理念的重要體現,解決這個問題,銀行增強服務意識是關鍵,全社會聯動、協調和配合是重要保障。相信通過我們的努力,這個問題會得到逐步解決。
第三篇:銀行排隊系統需求分析報告
銀行排隊系統需求分析報告
1.引言
編寫目的
隨著時代的發展,信息技術在各服務行業中的重要作用得到充分體現,通過服務模式的信息化,可以極大提高服務質量,節約人力成本,提高工作效率。
本產品是針對銀行的排隊取號業務而開發的新一代銀行排隊系統。本產品較現有的銀行排隊系統在功能上有一定的擴充,這體現在用戶端用戶體驗的提升以及銀行內部管理人員的管理效率的提升。
本產品目前版本號:ver.1.0 1.2項目風險 1.3 文檔約定
1.4 預期讀者和閱讀建議 用戶:各大銀行
開發人員:熊宇軒,蔣雅楠,劉昕
項目經理:王萌
營銷人員:暫缺
測試人員:蔣雅楠
文檔編寫入員:熊宇軒 1.3定義
靜態數據:系統固化在內的描述系統實現功能的一部分數據。動態數據:在軟件運行過程中用戶輸入的后系統輸出給用戶的一部分數據,也就是系統要處理的數據。
數據字典:數據字典中的名字都是一些屬性與內容的抽象和概括,它們的特點是數據的“嚴密性”和“精確性”,沒有半點含糊。1.4參考資料
NEUSOFT實習資料
2任務概述
2.1目標
本系統的設計目標是能夠實現客戶銀行排隊取號,柜員柜臺叫號功能,并且使銀行管理者能夠查詢排隊記錄。系統應該具有簡單,易用,小巧,經典的特色,應該能夠對銀行排隊取號業務進行優化,使其系統化,高效化,智能化。并保證工資管理的準確性,簡易性,為學校財務人員提供便利。相應的需求如下:
(1)普通客戶排隊取號
(2)VIP客戶優先取號
(3)移動端預約客戶身份驗證取號
(4)柜員叫號
(5)客戶對柜員服務進行評分
(6)數據的統計,并且在經理客戶端顯示數據
(7)經理手動插隊權限
(8)登錄信息管理。(9)人性化服務體驗提升功能 本軟件系統的開發設計思想是:
1.系統應符合銀行管理的規定,滿足銀行客戶和管理人員的需要,并達到操作過程中的直觀、方便、實用、安全等要求;
2.系統采用模塊化程序設計方法,既便于系統功能的各種組合和修改,又便于未參與開發的技術維護人員對其進行補充、維護;
3.系統應具備數據庫維護功能,及時根據用戶需求進行數據的添加、刪除、修改、備份等操作。
2.2用戶的特點
本軟件的最終用戶是各銀行網點,由于該單位的員工的學歷、素質較高,具有一定的計算機操作技能。本軟件需要至少一名系統管理人員,由于本軟件系統的易用性,并不需要受過專業訓練人員。
2.3假定和約束
由于本軟件系統較小,且在linux系統下采用c 語言開發,故在一般環境下基本沒有什么限制。
一個更為完善的工資管理系統,應提供更為便捷與強大的信息查詢功能,如相應的網絡操作及服務,由于開發時間和計算機數量有限,該系統并未提供這一功能。對信息的保護手段僅限于設置用戶級別,以及提供數據文件的備份,比較簡單,不能防止惡意的破壞,安全性能有待進一步完善。
3需求規定
3.1對功能的規定
3.1.1功能模塊及描述
本系統主要功能模塊如下,系統功能模塊圖如圖: 1)用戶排隊取號模塊
叫號機當前服務信息: 普通用戶VIP用戶預約用戶 圖1-1 該模塊可以實現普通用戶取票,VIP 用戶取票,移動客戶端預約用戶身份驗證取號業務。三個按鈕對應三個不同的服務客戶對象類型,右側的對話框顯示當前叫號情況。
普通用戶和VIP用戶會跳轉至圖1-2所示的頁面
窗體標題負債業務當前等候人數資產業務當前等候人數中間業務當前等候人數
圖1-2-1
三個按鈕對應不同的業務類型,按下之后就可以取票,通過socket通信將排隊請求上傳到服務器,并在服務器端口進行多線程任務管理,自動為客戶分配排隊號碼。負債業務對應柜臺1-3,資產業務對應4-6,中間業務對應7-9。
圖1-2-2 預約用戶可跳轉至圖1-2-2的界面,輸入手機號和驗證碼來驗證信息,并且取已預約的號
2)員工叫號模塊 叫號界面正在為 服務叫號正在呼叫下一個
圖1-3 員工可使用圖1-3所示界面進行叫號,叫號按鈕按下之后,會自動生成正在呼叫的客戶排隊號碼。為了防止有的客戶取號之后又離開銀行的廢票現象的發生,我們設置了跳轉至下一個排隊用戶的按鈕。右側的對話框顯示正在服務的客戶,在柜員對面的客戶服務端按下開始服務按鈕之后,柜員的正在呼叫對話框內將被置空,而有側的對話框會顯示相應服務信息。
3)用戶服務模塊
用戶界面評分1開始服務2345結束服務
圖1-4 開始服務和結束服務按鈕對應柜員端相應功能,在按下結束服務按鈕之前,用戶要通過右側的按鈕對服務進行評分。評分情況和服務時間可在經理端顯示
4)經理管理模塊
業務情況排隊情況業務分類序號刷新插隊退出排隊號取號時間已等候時間負債業務已受理情況資產業務柜員評分信息統計中間業務
圖1-5-1 經理可使用圖1-5-1所示界面來查看當前排隊信息,并且可以通過上方的插隊按鈕幫助特殊客戶插隊。業務情況排隊情況業務分類序號刷新插隊退出排隊號開始時間結束時間負債業務已受理情況資產業務柜員評分信息統計中間業務
圖1-5-2 經理可以通過左側的已受理情況按鈕查詢以往客戶的排隊情況。業務情況排隊情況業務分類柜員號刷新插隊退出姓名已受理人數平均分負債業務已受理情況資產業務柜員評分信息統計中間業務
圖1-5-3 經理可以通過評分按鈕來查看客戶對柜員的評分情況,便于內部考核使用。信息統計排隊情況已受理情況柜員評分信息統計刷新
圖1-5-4 經理可以查看總體的數據統計概要。
5)柜員/經理登陸模塊
柜員登陸柜員號密碼登陸 系統可以通過查詢數據庫中的記錄來識別柜員/經理的身份。
4.業務流程圖
系統的業務流程圖如下圖所示:
普通用戶取號VIP用戶取號插隊插隊插隊負債業務資產業務中間業務預約用戶取號等待叫號插隊柜員叫號開始服務經理結束服務返回記錄客戶評分5.數據庫管理
5.1 動態數據描述 輸入數據:菜單選項,查找關鍵字,新建記錄項。輸出數據:由查詢關鍵字確定的數據庫記錄集合。內部生成的數據:中間查詢結果。數據庫描述
5.2數據庫描述
本系統使用MySQL數據庫
第四篇:銀行排隊叫號系統需求分析 設計文檔
銀行排隊叫號系統的分析與UML建模
一、需求分析
近年來,由于各行各業的信息化、智能化建設越來越普及,整個社會對各個行業的辦事效率的要求也越來越高。例如像銀行辦業務,在顧客辦業務過程中排隊現象在所難免,為了在排隊時減少顧客的等待時間,為顧客辦業務創造一個良好的環境,銀行排隊叫號系統應運而生。銀行排隊系統的功能性需求包括以下內容:
1、排隊系統可以分為票務打印系統和窗口操作系統。
2、票務打印系統(1)顯示
發號機上的顯示屏使用液晶顯示,顯示對待辦業務的選擇;(2)輸入
輸入過程即通過觸摸屏對業務進行選擇的過程;(3)輸出打印
號票打印內容應該包括業務名稱、排隊號碼、時間等;
3、窗口操作系統基本包括顯示屏、語言提示,叫號按鈕(1)顯示屏
使用點陣式LED顯示,顯示內容應該是下一個號碼以及辦理業務窗口;(2)語音提示
語音播報時用語音的形式通過廣播或者音箱給人一提示信息。語音提示不需要用戶一直盯著提示屏或者排隊情況。選擇使用語音芯片,實現的功能應該是當操作員按下按鈕后,語音播放下一個辦理者的票號。(3)叫號按鈕
設置叫號按鈕,以便于操作員控制窗口模塊的顯示屏及語音提示。滿足上述需求的系統主要包括以下幾個小的系統模塊:
(1)派號功能模塊。派號功能模塊主要是用于在用戶進入服務大廳后,根據自己的業務需要,通過自助式觸摸屏號票機領取票號;或者用戶在服務大廳業務咨詢臺進行業務咨詢后,咨詢員可以為用戶打印排隊號票。號票是由排隊服務器根據當前情況自動生成。
(2)叫號功能模塊。工作人員可以通過座席軟件鍵盤上的設置鍵對客戶進行叫號;也可通過按鍵控制器對客戶進行叫號;系統可以設置單語或雙語進行語音播放;以及通過LED顯示屏和其它視頻顯示設備顯示票號。
(3)預約功能模塊。用戶可以通過電話預約領取排隊號;預約成功后取得預約號;系統將此預約號按預約時間插入當前的排隊隊列,在系統處理后進行優先呼叫;在同時間下辦理業務時,可以進行預約服務,優先辦理。同時用戶可以在網上進行預約。用戶可以在正常受理業務的工作日和系統進行網上預約。系統將此預約日期的預約號檢索到排隊序列中。
(4)管理功能模塊。實現窗口靈活安排,根據業務需要設置叫號規則;業務分類排隊管理;鼠標、鍵盤、按鍵控制器混合使用。可以按業務和窗口分類統計業務辦理情況。
二、用例圖
● 客戶能夠通過該系統進行如下活動:
(1)顧客取票:需要辦理業務的顧客到取票機前取號,并獲得打印。(2)顧客休息等待:取到排隊號的顧客在休息區休息等待,留意顯示屏信息和語音提示。
(3)營業員按鈕呼叫:窗口操作員按“下一位”,當前窗口就顯示顧客排隊號并語音呼叫“請XX到X”。(4)顧客到窗口辦理業務:休息區的顧客聽到呼叫就到相應窗口進行一對一服務。
根據以上的描述畫出相應的用例圖如下:
三、系統類圖 我們可以識別系統中存在的主要實體類:顧客,柜臺營業員,維修管理員,保安。界面類:取票機。
根據以上的描述畫出相應的類圖如下:
四、系統動態模型 顧客取號排隊辦理業務工作流程:
(1)取號:顧客取一張號票,上面有號碼、時間、辦理的業務類型等(2)休息等待:持號票在休息區休息并留意顯示屏音箱叫號。(3)按鍵叫號:工作人員辦完一筆業務后按下叫號器上的下一位按鈕(4)前去辦理:叫號時根據顯示屏音箱的信息到指定位置享受一對一的服務。根據以上的描述畫出序列圖如下:
柜臺營業員辦理業務工作流程:
(1)登 錄:工作開始前,輸入員工代碼進行登錄。(2)退 出:在工作結束后,退出系統。(3)順 呼:呼叫第一位或下一位顧客。
(4)重 呼:第一次呼叫顧客時沒有響應,重新進行呼叫。
(5)轉移窗口:對單一業務隊列可在窗口間進行轉移;對多業務隊列,不但可以在本業務隊列窗口間轉移,還可以在不同的業務隊列窗口間轉移。(6)優先呼叫:碰到緊急或有特殊關系的顧客,可優先呼叫。
(7)回 呼:顧客錯過機會或需多柜臺服務時,鍵入其號碼進行呼叫(注:回呼的號碼必須是已被呼叫過的號碼)。(8)棄 號:多次呼叫后,顧客依然沒有響應,可能顧客已棄號,然后呼叫下一位顧客。
(9)詢 問:查詢當前等待人數。根據以上的描述可畫出序列圖如下:
管理員管理業務工作流程:
(1)系統管理:對系統中排隊機、顯示屏、座席及其它與系統相關的硬件進行管理;
(2)管理顧客動態:可實時提供當前各部門所有顧客取號時間、服務情況和等待人數等有關參考信息;
(3)員工效率管理(即監督工作):可獲知員工幾時上班、幾時下班、服務人次、平均和最長及最短服務時間等有關信息;
(4)統計:統計多種有價值的信息,供管理層決策參考
五、狀態圖 排隊叫號系統包含以下六種狀態:顧客到達、取票、等候辦理、辦理業務、柜員呼叫、顧客離去。它們之間的轉換規則是:
(1)需要辦理業務的顧客到達取票機前取票,并獲得打印。
(2)取到排隊號的顧客在休息區休息等待,留意顯示屏信息和語音提示。(2)柜臺營業員辦完一筆業務后按下叫號器上的下一位按鈕。(3)叫號時根據顯示屏音箱的信息到指定位置前去辦理業務。(4)辦理完業務后即可離開。根據以上的描述可繪制出狀態圖如下:
六、活動圖 顧客對象的活動圖:
(1)顧客在取票機的界面上輸入選擇所需辦理的相關業務。
(2)界面將信息傳遞到控制業務邏輯的對象中心顯示屏(動態顯示所有等待服務的顧客號碼以及相關的業務信息)進行驗證,然后傳遞到窗口顯示屏(顯示顧客、業務受理員號碼及宣傳、服務用語)。(3)窗口顯示屏獲得到的信息顯示顧客辦理業務的詳細信息。柜員對象的活動圖:
(1)柜員獲取中心顯示屏傳遞過來的信息,然后通過對象呼叫機進行按鍵呼叫。(2)叫號時顧客根據顯示屏音箱的信息到指定位置前去辦理業務,辦完業務后即可離開。
管理員對象的活動圖:
(1)可實時提供當前各部門所有顧客取號時間、服務情況和等待人數等有關參考信息。
(2)可獲知員工幾時上班、幾時下班、服務人次、平均和最長及最短服務時間等有關信息,進行監督。
(3)可監督維修人員對系統中排隊機、顯示屏、座席及其它與系統相關的硬件進行管理。
通過以上的描述可繪制出活動圖如下:
七、系統構件圖 在排隊叫號系統中,可以對參與者和主要的業務實體類分別創建對應的構件進行映射。我們前面在類圖中創建的顧客類、柜臺營業員類、系統管理員類,所以可以映射出相同的構件類,包括顧客構件、柜臺營業員構件、排隊叫號系統構件,此外,還必須有一個主程序構件。由以上描述可繪制出構件圖如下:
八、系統部署圖 在排隊叫號系統中,系統包括四個節點,分別是:主控箱節點,對系統中排隊機、顯示屏、座席及其它與系統相關的硬件進行管理;排隊機節點,提供顧客排隊取號的票據;叫號器節點,提供給柜臺營業員通過叫號機對客戶進行叫號;窗口顯示屏節點,用于動態顯示所有等待服務的顧客號碼以及相關業務的信息;音箱節點,用于提示顧客辦理相關業務。由以上描述可繪制出部署圖如下:
第五篇:c++版模擬銀行窗口排隊叫號系統
c++版模擬銀行窗口排隊叫號系統
c++版模擬銀行窗口排隊叫號系統
看了兩位LZ的銀行排隊系統blog,感覺不錯,就也產生了用C++寫個排號系統,原因有二,1、對Java不太熟悉,沒有看太懂。
2、練練手。
3、提高一下C++的人氣。進入主題:
對于這一塊的業務系統需求沒有做過多的分析,只在兩位LZ的基礎做了小小的改動,然后用C++實現。題目:
模擬實現銀行業務調度系統邏輯,具體需求如下:
銀行內有6個業務窗口,1-4號窗口為普通窗口,5號窗口為快速窗口,6號窗口為VIP窗口。
有三種對應類型的客戶:VIP客戶,普通客戶,快速客戶(辦理如交水電費、電話費之類業務的客戶)。
異步隨機生成各種類型的客戶,生成各類型用戶的概率比例為: VIP客戶:普通客戶:快速客戶 = 1 :6 :3。
客戶辦理業務所需時間有最大值和最小值,在該范圍內隨機設定每個VIP客戶以及普通客戶辦理業務所需的時間,快速客戶辦理業務所需時間為最小值(提示:辦理業務的過程可通過線程Sleep的方式模擬)。
各類型客戶在其對應窗口按順序依次辦理業務。
當VIP(6號)窗口和快速業務(5號)窗口沒有客戶等待辦理業務的時候,這兩個窗口可以處理普通客戶的業務,而一旦有對應的客戶等待辦理業務的時候,則優先處理對應客戶的業務。
隨機生成客戶時間間隔以及業務辦理時間最大值和最小值自定,可以設置。
不要求實現GUI,只考慮系統邏輯實現,可通過Log方式展現程序運行結果。修改:
1、在這里為了簡化程序的設計(只省了只行代碼),FAST和VIP窗口只辦理對應的客戶,不辦普通客戶的業務。
2、由于對于客戶的到來,也采用1S來一個的做法,但因為在console程序對于時間不太好控制,在這里只是設定了客戶數,即每個1秒來一個客戶,根據來的客戶數控制時間。
開發環境:Linux 代碼:
文件constances.h 該文件中定義了一些常量,其中MAX_WAITING_CLIENT_NUM指的是,最多正在等待的客戶數,如果客戶數到達最大,后來的客戶將會離開。
[cpp] view plaincopy
1.#ifndef CONSTANCES_H_
2.#define CONSTANCES_H_
3.enum {
4.MAX_SERVICE_TIME = 10, 5.MIN_SERVICE_TIME = 1, 6.CLIENT_INTERVAL_TIME = 1, 7.MAX_WAITING_CLIENT_NUM = 50, 8.MAX_CLIENT_NUM = 100, 9.};
10.#endif /* CONSTANCES_H_ */
文件main.cpp
1、每一個窗口對應一個線程,在此創建了6個線程,分別對應4個客戶窗口,1個FAST窗口中,1個VIP窗口中。
2、在這里本想用Unix中的alarm信號來控制客戶的間隔時間,但因為時間不好控制就廢棄了
[cpp] view plaincopy
1.#include
2.#include
3.#include
4.#include
5.#include
6.#include
7.#include “numMachine.h”
8.#include “serviceWin.h”
9.#include “client.h”
10.#include “constances.h”
11.Client::ClientType createClientType(){ 12.int type;
13.type = rand()% 10 + 1;14.if(type <= 6)
15.return Client::CLIENT_COMMON;16.else if(type >= 7 && type <= 9)17.return Client::CLIENT_FAST;18.return Client::CLIENT_VIP;19.}
20.int createTasktime(){
21.return rand()% MAX_SERVICE_TIME + 1;22.}
23.void createClient(){
24.Client::ClientType clientType;25.int taskTime;
26.for(int i = 0;i < MAX_CLIENT_NUM;++i){ 27.clientType = createClientType();28.taskTime = createTasktime();
29.std::cout << “Come in a client : clientType = ” << clientType 30.<< “ taskTime = ” << taskTime << std::endl;
31.NumMachine::getInstance()->pressMachine(clientType, taskTime);32.sleep(1);33.}
34.sleep(5);35.}
36.void * serviceWin(void *win){
37.ServiceWin *serWin = static_cast
41.bool createServiceWin(){
42.pthread_t commonServiceWin[4];43.pthread_t fastServiceWin;44.pthread_t vipServiceWin;45.char tmp[10];46.ServiceWin *win;
47.for(int i = 0;i < 4;++i){ 48.sprintf(tmp, “CommonWin%d”, i);49.win = new CommonSerWin(tmp);50.if(win == NULL){
51.std::cout << “Create common service win error.” << std::endl;52.return-1;53.}
54.if(pthread_create(&commonServiceWin[i], NULL, serviceWin,(void*)win)
55.!= 0){
56.std::cout << “Create common service thread error.” << std::endl;
57.return false;58.} 59.} 60.sprintf(tmp, “FastWin”);61.win = new FastSerWin(tmp);62.if(win == NULL){
63.std::cout << “Create fast service win error.” << std::endl;64.return false;65.}
66.if(pthread_create(&fastServiceWin, NULL, serviceWin,(void*)win)!= 0){
67.std::cout << “Create fast service thread error.” << std::endl;68.return false;69.}
70.sprintf(tmp, “VipWin”);71.win = new VipSerWin(tmp);72.if(win == NULL){
73.std::cout << “Create vip service win error.” << std::endl;74.return false;75.}
76.if(pthread_create(&fastServiceWin, NULL, serviceWin,(void*)win)!= 0){
77.std::cout << “Create vip service thread error.” << std::endl;78.return false;79.}
80.return true;81.}
82.int main(int argc, char *argv[]){
83.std::cout << “/***start : please wait 5 seconds when progress suspend *****/” << std::endl;
84.srand((unsigned)time(0));85.if(!createServiceWin()){
86.std::cout << “Create service win error.” << std::endl;87.return-1;88.}
89.createClient();
90.delete NumMachine::getInstance();91.}
文件client.cpp client.h 定義了我們的客戶,因為我們的客戶比較簡單,所有的客戶共享一個class,只是clientType來區分不同的客戶。
[cpp] view plaincopy 1.#ifndef CLIENT_H_
2.#define CLIENT_H_
3.class Client { 4.public:
5.enum ClientType {
6.CLIENT_COMMON, CLIENT_FAST, CLIENT_VIP 7.};
8.Client(ClientType type, int time);9.virtual ~Client();
10.ClientType getClientType();11.int getServiceTime();12.private:
13.ClientType clientType;14.int serviceTime;15.};
16.#endif /* CLIENT_H_ */
[c-sharp] view plaincopy
1.#include “client.h”
2.Client::Client(ClientType type, int time): 3.clientType(type), serviceTime(time){ 4.}
5.Client::~Client(){ 6.}
7.Client::ClientType Client::getClientType(){ 8.return clientType;9.}
10.int Client::getServiceTime(){ 11.return serviceTime;12.}
文件numMachine.cpp numMachine.h 文件中定義了排號機,在numMachine中定義了一個client list用來存放我們的客戶。
[cpp] view plaincopy
1.#ifndef NUMMACHINE_H_
2.#define NUMMACHINE_H_
3.#include 4.#include
5.#include
7.#include
8.#include “client.h”
9.#include “constances.h”
10.class NumMachine { 11.public:
12.virtual ~NumMachine();
13.static NumMachine *getInstance();
14.void pressMachine(Client::ClientType clientType, int tasktime);15.Client * removeClient(Client::ClientType val);16.private:
17.NumMachine();
18.static NumMachine *numMachine;19.std::list
22.int handledClient;
23.pthread_mutex_t clientListLock;24.};
25.class DelClientList { 26.public:
27.void operator()(Client * item);28.};
29.class FindClient { 30.public:
31.FindClient(Client::ClientType t);32.bool operator()(Client * item);33.private:
34.Client::ClientType clientType;35.};
36.#endif /* NUMMACHINE_H_ */
[cpp] view plaincopy
1.#include “numMachine.h”
2./***************************************************************************************/
3.NumMachine * NumMachine::numMachine = new NumMachine;4.NumMachine::NumMachine():
5.leaveClient(0), total(0), handledClient(0){ 6.pthread_mutex_init(&clientListLock, NULL);7.} 8.NumMachine::~NumMachine(){
9.std::cout << “/********** end ****************/” << std::endl;
10.std::cout << “The number of total client is ” << total << std::endl;11.std::cout << “The number of handled client is ” << handledClient << std::endl;
12.std::cout << “The number of waiting client is ” << clientList.size()<< std::endl;
13.std::cout << “The number of client is ” << leaveClient 14.<< “ ,because waiting time too long.” << std::endl;15.for_each(clientList.begin(), clientList.end(), DelClientList());16.}
17.NumMachine * NumMachine::getInstance(){ 18.return numMachine;19.}
20.void NumMachine::pressMachine(Client::ClientType clientType, int taskTime){
21.++total;
22.if(clientList.size()< MAX_WAITING_CLIENT_NUM){ 23.Client * c = new Client(clientType, taskTime);24.if(c == NULL){
25.std::cout << “Can't create Client” << std::endl;26.exit(-1);27.}
28.clientList.push_back(c);29.} else {
30.++leaveClient;31.} 32.}
33.Client * NumMachine::removeClient(Client::ClientType val){ 34.std::list
36.pthread_mutex_lock(&clientListLock);
37.pos = find_if(clientList.begin(), clientList.end(), FindClient(val));38.tmp = *pos;
39.if(pos!= clientList.end()){ 40.clientList.erase(pos);41.++handledClient;
42.pthread_mutex_unlock(&clientListLock);43.return tmp;44.} else {
45.pthread_mutex_unlock(&clientListLock);46.return NULL;47.} 48.}
49./***************************************************************************************/
50.void DelClientList::operator()(Client *item){
51.std::cout << “Waiting client : clientType =” << item->getClientType()52.<< “ taskTime = ” << item->getServiceTime()<< std::endl;53.delete item;54.}
55./***************************************************************************************/
56.FindClient::FindClient(Client::ClientType t): 57.clientType(t){ 58.}
59.bool FindClient::operator()(Client * item){ 60.if(item->getClientType()== clientType)61.return true;62.else
63.return false;64.}
文件serviceWin.cpp serviceWin.h 文件中定義了我們窗口。
[cpp] view plaincopy
1.#ifndef SERVICEWIN_H_
2.#define SERVICEWIN_H_
3.#include
4.#include
5.#include “numMachine.h”
6.class ServiceWin { 7.public:
8.ServiceWin(std::string n);9.virtual ~ServiceWin();10.virtual void execute()= 0;11.std::string getWinName();12.private:
13.std::string winName;14.};
15.class CommonSerWin: public ServiceWin { 16.public:
17.CommonSerWin(std::string n);18.virtual ~CommonSerWin();19.virtual void execute();20.};
21.class FastSerWin: public ServiceWin { 22.public:
23.FastSerWin(std::string n);24.virtual ~FastSerWin();25.virtual void execute();26.};
27.class VipSerWin: public ServiceWin { 28.public:
29.VipSerWin(std::string n);30.virtual ~VipSerWin();31.virtual void execute();32.};
33.#endif /* SERVICEWIN_H_ */
[cpp] view plaincopy
1.#include “serviceWin.h”
2./*********************************************************************************************/
3.ServiceWin::ServiceWin(std::string n): 4.winName(n){ 5.}
6.ServiceWin::~ServiceWin(){ 7.}
8.std::string ServiceWin::getWinName(){ 9.return winName;10.}
11./*********************************************************************************************/
12.CommonSerWin::CommonSerWin(std::string n): 13.ServiceWin(n){ 14.}
15.CommonSerWin::~CommonSerWin(){ 16.}
17.void CommonSerWin::execute(){ 18.Client * client = NULL;19.while(1){
20.client = NumMachine::getInstance()->removeClient(Client::CLIENT_COMMON);
21.if(client!= NULL){ 22.std::cout << “A client be handled : clientType = ” << client->getClientType()
23.<< “ taskTime = ” << client->getServiceTime()<< “ ”<< getWinName()<< std::endl;
24.sleep(client->getServiceTime());25.delete client;26.} 27.} 28.}
29./*********************************************************************************************/
30.FastSerWin::FastSerWin(std::string n): 31.ServiceWin(n){ 32.}
33.FastSerWin::~FastSerWin(){ 34.}
35.void FastSerWin::execute(){ 36.Client * client = NULL;37.while(1){
38.client = NumMachine::getInstance()->removeClient(Client::CLIENT_FAST);
39.if(client!= NULL){
40.std::cout << “A client be handled : clientType = ” << client->getClientType()
41.<< “ taskTime = ” << client->getServiceTime()<< “ ”<< getWinName()<< std::endl;
42.sleep(client->getServiceTime());43.delete client;44.} 45.} 46.}
47./*********************************************************************************************/
48.VipSerWin::VipSerWin(std::string n): 49.ServiceWin(n){ 50.}
51.VipSerWin::~VipSerWin(){ 52.}
53.void VipSerWin::execute(){ 54.Client * client = NULL;55.while(1){
56.client = NumMachine::getInstance()->removeClient(Client::CLIENT_VIP);
57.if(client!= NULL){ 58.std::cout << “A client be handled : clientType = ” << client->getClientType()
59.<< “ taskTime = ” << client->getServiceTime()<< “ ”<< getWinName()<< std::endl;
60.sleep(client->getServiceTime());61.delete client;62.} 63.} 64.}
結論:
經過幾次測試發現在上述條件下,FAST窗口辦理業務不能滿足需求,在客戶不在來的后5秒內,不能處理完FAST客戶。