国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

3.5離散事件模擬

2019-11-14 12:05:15
字體:
供稿:網(wǎng)友

這節(jié)是銀行業(yè)務(wù)模擬程序、

假設(shè)某銀行有4個窗口對外接待客戶,每個窗口接待一個人,當(dāng)有人要辦理業(yè)務(wù)的時候,如果某窗口空閑,則可辦理,如果不空閑,則排在人最少的后面。現(xiàn)編制一個程序以模擬銀行這種活動并計算一天中客戶在銀行逗留的平均時間。

為了計算這個平均時間,要掌握每個客戶到達(dá)銀行和離開銀行這兩個時刻,后者減去前者就是逗留時間。所有客戶逗留時間的總和被一天內(nèi)進(jìn)入銀行的客戶數(shù)除便是所求的平均時間。

下面是銀行業(yè)務(wù)模擬,統(tǒng)計一天內(nèi)客戶在銀行逗留的平均時間:

代碼如下:

void Bank_Simulation(int CloseTime){	OpenForDay();	//初始化	while (MoreEvent)	{		EventDrived(OccurTime, EventType);	//事件驅(qū)動		switch (EventType)		{		case 'A':CustomerArrived(); break;		case 'D':CustomerDeparture();break;		default:Invalid();		}	}	CloseForDay();}下面分析下:

1.這個OpenForDay可以理解成開啟一個計時器,然后最后有CloseForDay()就是關(guān)閉計時器。

2.EventDrived(OccurTime,EventType)這個我們可以看見有個事件驅(qū)動,第一個參數(shù)是當(dāng)前時間,第二個參數(shù)是事件類型。

3.這個事件類型有A,D,和其他,A代表Arrived,D代表Departure,其他事件缺省情況(默認(rèn)情況)是無效的。

算法3.6:

模擬程序中有4個窗口業(yè)務(wù)窗口,所以要4個隊列,對每個隊頭客戶都存在一個將要驅(qū)動的客戶離開事件。

因此在任何時刻即將發(fā)送的事件只有5種可能:

1.新的客戶到達(dá)。

2.1號窗口客戶離開。

3.2號窗口客戶離開。

4.3號窗口客戶離開。

5.4號窗口客戶離開。

下面是有序鏈表和隊列的結(jié)構(gòu)體:

typedef struct{	int OccurTime;	//事件發(fā)生時刻	int NType;	//事件類型,0表示到達(dá)事件,1-4表示4個窗口的離開事件}Event,ElemType;typedef LinkList EventList;	//事件鏈表類型,定義為有序鏈表typedef struct{	int ArrivalTime;	//到達(dá)時刻	int Duration;	//辦理業(yè)務(wù)的時間}QElemType;由于在實(shí)際的銀行中,客戶到達(dá)的時刻以及辦理事物所需時間都是隨機(jī)的,在模擬程序中可用隨機(jī)數(shù)來代替。假設(shè)第一個顧客進(jìn)門的時刻為0,即是模擬程序處理的第一個事件,之后每個客戶到達(dá)的時刻在前一個客戶到達(dá)時設(shè)定。因此在客戶達(dá)到事件發(fā)生時需先產(chǎn)生倆個隨機(jī)數(shù):其一為此時刻到達(dá)的客戶辦理事物所需時間durtime;其二為下一客戶到達(dá)時間間隔imtertime,假設(shè)事件發(fā)生的時刻為Occurtime,則下一個客戶到達(dá)的時刻為Occurtime+intertime。由此應(yīng)產(chǎn)生一個新的客戶到達(dá)事件插入事件表;剛到達(dá)的客戶則應(yīng)插入到當(dāng)前所含元素最少的隊列中;若插入前為空,則產(chǎn)生一個客戶立刻事件插入事件表。

客戶離開事件的處理比較簡單。首先計算該客戶在銀行逗留的時間,然后從隊列中刪除該客戶后查看隊列是否空,若空則設(shè)定一個新的隊頭客戶離開事件。

算法如下所示:

// 程序中用到的主要變量EventList  ev;                // 事件表Event      en;                // 事件LinkQueue  q[5];              // 4個客戶隊列,q[0]未用QElemType  customer;          // 客戶記錄int TotalTime, CustomerNum;   // 累計客戶逗留時間, 客戶數(shù)int CloseTime;//---------------- 算法 3.7 ------------------int cmp(Event a,  Event b) {  // 依事件a的發(fā)生時刻< 或= 或> 事件b的發(fā)生時刻分別返回-1或0或1  if (a.OccurTime < b.OccurTime) return -1;  if (a.OccurTime > b.OccurTime) return +1;  return 0;}void Random(int &durtime, int &intertime) { // 生成隨機(jī)數(shù)   durtime = random(2, 10);   intertime = random(10);}int Minimum(LinkQueue q[]) {  // 求長度最短隊列   int minlen = QueueLength(q[1]);   int i = 1;   for (int j=2; j<=4; j++)      if (QueueLength(q[j]) < minlen) {         minlen = QueueLength(q[j]);         i = j;      }   return i;}void OpenForDay() {   // 初始化操作   TotalTime = 0;  CustomerNum = 0;  // 初始化累計時間和客戶數(shù)為0   InitList(ev);                     // 初始化事件鏈表為空表   en.OccurTime = 0;  en.NType = 0;  // 設(shè)定第一個客戶到達(dá)事件   OrderInsert(ev, en, cmp);    // 按事件發(fā)生時刻的次序插入事件表   for (int i=1; i<=4; ++i) InitQueue(q[i]);   // 置空隊列} // OpenForDayvoid CustomerArrived() {  // 處理客戶到達(dá)事件,en.NType=0  int durtime, intertime, i, t;  ++CustomerNum;  PRintf("Customer %d arrived at %d and ", CustomerNum, en.OccurTime);  Random(durtime, intertime);            // 生成隨機(jī)數(shù)  t = en.OccurTime + intertime;          // 下一客戶到達(dá)時刻  if (t<CloseTime)                       // 銀行尚未關(guān)門,插入事件表    OrderInsert(ev, MakeElem(t, 0), cmp);  i = Minimum(q);                        // 求長度最短隊列  printf("enter the Queue %d/n", i);  EnQueue(q[i], MakeQElem(en.OccurTime, durtime));  if (QueueLength(q[i]) == 1) //設(shè)定第i隊列的一個離開事件并插入事件表    OrderInsert(ev, MakeElem(en.OccurTime+durtime, i), cmp);} // CustomerArrivedvoid CustomerDeparture() {  // 處理客戶離開事件,en.NType>0  printf("Customer departure at %d/n", en.OccurTime);  int i = en.NType;  DeQueue(q[i], customer); //刪除第i隊列的排頭客戶  TotalTime += en.OccurTime-customer.ArrivalTime; // 累計客戶逗留時間  if (!QueueEmpty(q[i])) {   // 設(shè)定第i隊列的一個離開事件并插入事件表    GetHead (q[i], customer);    OrderInsert(ev, MakeElem(en.OccurTime+customer.Duration, i), cmp);  }} // CustomerDeparturevoid Bank_Simulation(int closetime) {  int i = 0;  BLink p;  CloseTime = closetime;  printf("Bank_Simulation( %d ) ----- 銀行業(yè)務(wù)模擬/n", closetime);  OpenForDay();                     // 初始化  while (!ListEmpty(ev)) {    printList(ev);    if (DelFirst(GetHead(ev), p)) {      en = GetCurElem(p);      if (en.NType == 0)        CustomerArrived();       // 處理客戶到達(dá)事件      else CustomerDeparture();   // 處理客戶離開事件    }    if (++i % 9 == 0) {      printf("/n----- 按任意鍵,繼續(xù) -----");      getch();      printf("/n/n");    }  }  // 計算并輸出平均逗留時間  printf("/nThe Average Time is %f/n", (float)TotalTime/CustomerNum);} // Bank_Simulation


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 小金县| 北辰区| 汉源县| 迁西县| 临桂县| 景东| 江津市| 英德市| 柯坪县| 莱芜市| 开江县| 神农架林区| 布尔津县| 武陟县| 林州市| 上思县| 溧阳市| 张家界市| 那坡县| 安义县| 中卫市| 辽阳市| 剑河县| 屏东县| 巴彦淖尔市| 芜湖县| 阳山县| 大田县| 衡南县| 涪陵区| 渝中区| 宝丰县| 龙川县| 涟源市| 手游| 井冈山市| 红河县| 弥渡县| 梁平县| 张家界市| 麦盖提县|