亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C++數據結構學習:事件驅動模擬

2019-11-17 05:04:04
字體:
來源:轉載
供稿:網友
  我看的兩本教科書(《數據結構(C語言版)》還有這本黃皮書)都是以這個講解隊列應用的,而且都是銀行營業模擬(太沒新意了)。細比較,這兩本書模擬的銀行營業的方式還是不同的。
1997版的《數據結構(C語言版)》的銀行還是老式的營業模式(究竟是1997年的事了),現在的很多地方還是這種營業模式——幾個窗口同時排隊。

  這種方式其實不太合理,經常會出現先來的還沒有后來的先辦理業務(經常前面一個人磨磨蹭蹭,別的隊越來越短,讓你恨不得把前面那人干掉)。1999版的這本黃皮書的銀行改成了一種掛牌的營業方式,每個來到的顧客發一個號碼,假如哪個柜臺空閑了,就叫號碼最靠前的顧客來辦理業務;假如同時幾個柜臺空閑,就按照一種法則來決定這幾個柜臺叫號的順序(最簡單的是按柜臺號碼順序)。這樣,就能保證顧客按照先來后到的順序接受服務——因為大家排在一個隊里。這樣的營業模式我在北京的西直門工商銀行見過,應該說這是比較合理的一種營業模式。不過,在本文中最重要的是,這樣的營業模式比較好模擬(一個隊列總比N個隊列好操作)。

  原書的這部分太難看了,我看的暈暈的,我也不知道按照原書的方法能不能做出來,因為我沒看懂(旁白:靠,你小子這樣還來現眼)。我按照實際情況模擬,實現如下:

  #ifndefSimulation_H

  #defineSimulation_H

  #include

  #include

  #include

  classTeller

  {
更多文章 更多內容請看C/C++技術專題  linux驅動大全  數據結構專題,或   public:

  inttotalCustomerCount;

  inttotalServiceTime;

  intfinishServiceTime;

  Teller():totalCustomerCount(0),totalServiceTime(0),

  finishServiceTime(0){}

  };

  //#define>serviceHigh;

  arrivalRange=arrivalHigh-arrivalLow+1;

  serviceRange=serviceHigh-serviceLow+1;

  srand((unsigned)time(NULL));
  
  } 
更多文章 更多內容請看C/C++技術專題  Linux驅動大全  數據結構專題,或   Simulation(inttellerNum,intsimuTime,intarrivalLow,intarrivalHigh,intserviceLow,intserviceHigh)


  :tellerNum(tellerNum),simuTime(simuTime),arrivalLow(arrivalLow),arrivalHigh(arrivalHigh),

  serviceLow(serviceLow),serviceHigh(serviceHigh),

  arrivalRange(arrivalHigh-arrivalLow+1),serviceRange(serviceHigh-serviceLow+1)

  {srand((unsigned)time(NULL));}

  voidInitialize()

  {
  
  curTime=nextTime=0;
  
  customerNum=customerTime=0;

  for(inti=1;i<=tellerNum;i++)

  {

  tellers[i].totalCustomerCount=0;
  
  tellers[i].totalServiceTime=0;

  tellers[i].finishServiceTime=0;

  }

  customer.MakeEmpty();

  }

  voidRun()

  {

  Initialize();

  NextArrived();

  #ifdefPRINTPROCESS

  cout<
  cout<<"tellerID";

  for(intk=1;k<=tellerNum;k++)cout<<"/tTELLER"<
  cout<
  #endif

  for(curTime=0;curTime<=simuTime;curTime++)
  
  {
  
  if(curTime>=nextTime)
  
  {
  
  CustomerArrived();
  
  NextArrived();

  }

  #ifdefPRINTPROCESS

  cout<<"Time:"<
  #endif
更多文章 更多內容請看C/C++技術專題  Linux驅動大全  數據結構專題,或   for(inti=1;i<=tellerNum;i++)

  {

  if(tellers[i].finishServiceTime
  if(tellers[i].finishServiceTime==curTime&&!customer.IsEmpty())

  {

  intt=NextService();

  #ifdefPRINTPROCESS
  
  cout<<'/t'<
  #endif

  CustomerDeparture();

  tellers[i].totalCustomerCount++;

  tellers[i].totalServiceTime+=t;

  tellers[i].finishServiceTime+=t;
    
  }

  #ifdefPRINTPROCESS

  elsecout<<"/t";
  
  #endif
  
  }

  #ifdefPRINTPROCESS

  cout<
  #endif

  }

  PrintResult();

  }
  voidPtintSimuPara()

  {
更多文章 更多內容請看C/C++技術專題  Linux驅動大全  數據結構專題,或   cout<

  cout<<"柜臺數量:"<
  cout<<"兩個顧客來到的最小間隔時間:"<
  cout<<"兩個顧客來到的最大間隔時間:"<
  cout<<"柜臺服務最短時間:"<
  cout<<"柜臺服務最長時間:"<
  }

  voidPrintResult()

  {

  inttSN=0;

  longtST=0;

  cout<  
  cout<<"----模擬結果------";

  cout<
  for(inti=1;i<=tellerNum;i++)

  {

  cout<<"TELLER"<
  cout<<'/t'<
  cout<<'/t'<
  cout<<'/t';

  if(tellers[i].totalCustomerCount)

  cout<<(float)tellers[i].totalServiceTime/(float)tellers[i].totalCustomerCount;

  elsecout<<0;

  cout<<""<  
  }

  cout<<"TOTAL/t"<
  if(tSN)cout<<(float)tST/(float)tSN;elsecout<<0;

  cout<<""<
  cout<<"CustomerNumber:/t"<
  cout<<"CustomerWaitTime:/t"<
  if(tSN)cout<<(float)customerTime/(float)tSN;elsecout<<0;
  
  cout<  
  }
   
  private:
  
  inttellerNum;

  intsimuTime;
  
  intcurTime,nextTime;

  intcustomerNum;

  longcustomerTime;

  intarrivalLow,arrivalHigh,arrivalRange;

  intserviceLow,serviceHigh,serviceRange;

  Tellertellers[21];

  Queuecustomer;

  voidNextArrived()
  
  {

  nextTime+=arrivalLow+rand()%arrivalRange;

  }
更多文章 更多內容請看C/C++技術專題  Linux驅動大全  數據結構專題,或     intNextService()
  
  {
  
  returnserviceLow+rand()%serviceRange;

  }

  voidCustomerArrived()
  
  {

  customerNum++;

  customer.EnQueue(nextTime);
  
  }
 
  voidCustomerDeparture()

  {


  customerTime+=(long)curTime-(long)customer.DeQueue();
  
  }
  
  };
  
  
  
  #endif
  
  幾點說明
  lRun()的過程是這樣的:curTime是時鐘,從開始營業計時,自然流逝到停止營業。當顧客到的事件發生時(顧客到時間等于當前時間,小于判定是因為個別時候顧客同時到達——輸入arrivalLow=0的情況,而在同一時間,只給一個顧客發號碼),給這個顧客發號碼(用顧客到時間標示這個顧客,入隊,來到顧客數增1)。當柜臺服務完畢時(柜臺服務完時間等于當前時間),該柜臺服務人數增1,服務時間累加,顧客離開事件發生,下一個顧客到該柜臺。因為柜臺開始都是空閑的,所以實際代碼和這個有點出入。最后,停止營業的時候,停止發號碼,還在接受服務的顧客繼續到服務完,其他還在排隊的就散伙了。
  
  l模擬結果分別是:各個柜臺的服務人數、服務時間、平均服務時間,總的服務人數、服務時間、平均服務時間,來的顧客總數、沒被服務的數目(來的太晚了)、接受服務顧客總等待時間、平均等待時間。
  更多文章 更多內容請看C/C++技術專題  Linux驅動大全  數據結構專題,或  
  l這個算法效率是比較低的,實際上可以不用隊列完成這個模擬(用顧客到時間推動當前時鐘,柜臺直接公告服務完成時間),但這樣就和實際情況有很大差別了——出納員沒等看見人就知道什么時候完?雖然結果是一樣的,但是理解起來很莫名其妙,尤其是作為教學目的講解的時候。
當然了,實際中為了提高模擬效率,本文的這個算法是不值得提倡的。
  
l注釋掉的#definePRINTPROCESS,去掉注釋符后,在運行模擬的時候,能打印出每個時刻柜臺的服務情況(第幾個顧客,顧客到達時間,接受服務時間),但只限4個柜臺以下,多了的話屏幕就滿了(格式就亂了)。
  
  【后記】本來我沒打算寫這篇,后來,當我開始實現模擬的時候,竟欲罷不能了。這是數據結構這本書中第一個實際應用的例子,而且也有現實意義。你可以看出各個柜臺在不同的業務密度下的工作強度(要么給哪個柜臺出納員發獎金,要么輪換柜臺),各種情況下顧客的等待時間(人都是輪到自己就不著急了),還有各種情況下設立幾個柜臺合理(很少的空閑時間,很短的等待時間,幾乎為零的未服務人數)。例如這樣:
  
  for(inti=1;i<16;i++)
  
  {

  Simulationa(i,240,1,4,8,15);
  
  a.Run();
  
  }

  你模擬一下就會得出,在不太繁忙的銀行,4~5個柜臺是合適的——現在的銀行大部分都是這樣的。
  
      
更多文章 更多內容請看C/C++技術專題  Linux驅動大全  數據結構專題,或

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
大伊人狠狠躁夜夜躁av一区| 中文字幕亚洲色图| 亚洲奶大毛多的老太婆| 欧美巨大黑人极品精男| 热久久免费国产视频| 日韩免费av片在线观看| 国产91露脸中文字幕在线| 日韩在线视频播放| 国产精自产拍久久久久久| 亚洲电影免费观看| 成人免费观看49www在线观看| 欧美日韩国产中文字幕| 久久久久久国产精品| 久久久久久久久久久国产| 久久久之久亚州精品露出| 欧美成人午夜剧场免费观看| 欧美精品国产精品日韩精品| 亚洲人成亚洲人成在线观看| 亚洲国产成人在线播放| 98精品国产高清在线xxxx天堂| 岛国精品视频在线播放| 欧美老女人性视频| 欧美性xxxxxx| 日韩精品在线免费| 亚洲一区999| 久久香蕉国产线看观看av| 久久6精品影院| 欧美在线视频一区二区| 日韩极品精品视频免费观看| 亚洲免费一级电影| 色av中文字幕一区| 国模gogo一区二区大胆私拍| 日韩国产欧美区| 午夜精品国产精品大乳美女| 欧美国产日韩二区| 亚洲欧美日韩国产中文| 亚洲女人天堂成人av在线| 日韩在线观看高清| 亚洲一级一级97网| 国产视频亚洲视频| 国产亚洲欧洲黄色| 欧美高清自拍一区| 久久在线精品视频| 欧美精品电影在线| 成人福利在线视频| 人妖精品videosex性欧美| 最近2019好看的中文字幕免费| 精品性高朝久久久久久久| 欧美国产极速在线| 欧美—级高清免费播放| 黑人巨大精品欧美一区二区免费| 欧美亚洲成人精品| 日韩av免费看| 欧美激情亚洲一区| 国产91免费看片| 国产精品视频久久久久| 亚洲成人精品av| 韩国19禁主播vip福利视频| 日韩精品在线免费| 91精品国产91久久久久久| 久久精品久久精品亚洲人| 成人www视频在线观看| 国产日韩精品电影| 成人在线精品视频| 在线播放国产一区二区三区| 国产精品人成电影在线观看| 97视频在线播放| 98午夜经典影视| 色悠久久久久综合先锋影音下载| 欧美激情久久久久久| 久久精品中文字幕一区| 亚洲欧美变态国产另类| 国产精品久久久久久亚洲调教| xxxx性欧美| 日韩欧美精品免费在线| 亚洲欧美综合另类中字| 91国偷自产一区二区三区的观看方式| 亚洲天堂男人的天堂| 欧美精品免费在线| 精品亚洲永久免费精品| 久久青草福利网站| 亚洲男人天堂网站| 激情成人在线视频| 午夜精品久久久久久久男人的天堂| 成人国产亚洲精品a区天堂华泰| 久久亚洲精品一区二区| 九九热在线精品视频| 成人夜晚看av| 国产成人高潮免费观看精品| 亚洲一区美女视频在线观看免费| 黄网动漫久久久| 激情久久av一区av二区av三区| 91精品国产九九九久久久亚洲| 久久久久久国产精品久久| 综合激情国产一区| 国产成人精品国内自产拍免费看| 亚洲成人av在线| 国产综合香蕉五月婷在线| 国产成人精品av在线| 欧美疯狂性受xxxxx另类| 1769国内精品视频在线播放| 日韩综合视频在线观看| 91av在线影院| 中文字幕精品一区久久久久| 欧美在线亚洲在线| 国产成人av网址| 国产脚交av在线一区二区| 另类色图亚洲色图| 久久99国产精品久久久久久久久| 亚洲欧美日韩中文在线制服| 亚洲综合日韩中文字幕v在线| 97视频在线观看播放| 欧美大片在线看免费观看| 亚洲精品在线视频| 欧美重口另类videos人妖| 亚洲天堂男人天堂| 国产成人综合精品在线| 国产精品视频午夜| 国产激情999| 欧美日韩免费网站| 欧美裸体男粗大视频在线观看| 成人性生交大片免费看视频直播| 91精品国产综合久久香蕉922| 欧美黑人国产人伦爽爽爽| 久久久久99精品久久久久| 国产97人人超碰caoprom| 日韩电影大全免费观看2023年上| 国外日韩电影在线观看| 精品国产一区二区三区在线观看| 欧美视频在线视频| 91性高湖久久久久久久久_久久99| 中文字幕亚洲欧美日韩高清| 欧美激情亚洲激情| 成人在线一区二区| 欧洲美女免费图片一区| 亚洲在线免费视频| 久久久免费电影| 久久亚洲影音av资源网| 亚洲国产精品va在线观看黑人| 欧美老肥婆性猛交视频| 欧美国产在线电影| 国产视频精品久久久| 精品中文字幕在线观看| 国产精品女人网站| 在线观看91久久久久久| 亚洲乱码国产乱码精品精天堂| 国产精品色悠悠| 91系列在线观看| 国产香蕉一区二区三区在线视频| 欧美极品美女视频网站在线观看免费| 国产精品高清在线观看| 中文字幕久久精品| 久久在线观看视频| 日韩美女视频免费在线观看| 欧美裸体xxxx极品少妇| 欧美激情啊啊啊| 亚洲一区第一页| 亚洲一区av在线播放| 国产一区玩具在线观看| 国产亚洲精品一区二区| 国内精品小视频在线观看| 午夜精品福利视频| 亚洲国产婷婷香蕉久久久久久| 丝袜亚洲另类欧美重口|