Advertisement
Guest User

Untitled

a guest
Apr 29th, 2016
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.80 KB | None | 0 0
  1. #include "simulator.h"
  2. #include <stdlib.h>
  3.  
  4. #include <iostream>
  5. #include <limits>
  6.  
  7.  
  8. #include <stdint.h>
  9.  
  10. #define meanarriveTime 1.0000
  11. #define meanServiceTime 4.5
  12. #define tellerNumber 5
  13. #define MAX 9999999
  14. #define MIN -9999999
  15.  
  16. double randomGenerator(double rn){
  17. double u = (rand() / (double) (RAND_MAX + 1) );
  18. double lnU = log(1-u);
  19. return (lnU * (-rn));
  20. }
  21.  
  22. void jockey(int tellerSerial,Simulator *sim){
  23. int i,jumper,ni,nj,otherTeller,minDistance,distance;
  24. jumper = 0;
  25. minDistance = 1000;
  26. ni = sim->teller[tellerSerial].queueCustomer.size();
  27.  
  28. for (otherTeller=0;otherTeller<sim->noOfTeller;otherTeller++){
  29. nj = sim->teller[otherTeller].queueCustomer.size();
  30. distance = abs(tellerSerial - otherTeller);
  31. if ( otherTeller!=tellerSerial && nj > ni+1 && distance < minDistance){
  32. jumper = otherTeller;
  33. minDistance = distance;
  34. }
  35. }
  36. if (jumper > 0 ){
  37. Customer customer = sim->teller[jumper].queueCustomer.back();
  38. sim->teller[jumper].queueCustomer.pop_back();
  39. //sim->teller[tellerSerial].queueCustomer.push_back(c);
  40.  
  41. nj=sim->teller[tellerSerial].queueCustomer.size();
  42.  
  43. if (nj==0){
  44. customer.serviceStartTime = sim->now();
  45. sim->teller[tellerSerial].queueCustomer.push_front(customer);
  46. sim->scheduleEvent(new DepartureEvent((sim->now() + randomGenerator(meanServiceTime)),tellerSerial));
  47. }
  48.  
  49. else if (nj>0){
  50. sim->teller[tellerSerial].queueCustomer.push_back(customer);
  51. }
  52.  
  53. }
  54.  
  55. }
  56.  
  57. Simulator::Simulator() {
  58. eventQueue = new priority_queue<Event*, vector<Event*>, CompareEvent>();
  59.  
  60. noOfCustomer=0;
  61. lock = 0;
  62. noOfTeller = tellerNumber;
  63. teller = new Teller[noOfTeller];
  64. }
  65.  
  66.  
  67. t_simtime Simulator::now() {
  68. return this->simclock;
  69. }
  70.  
  71.  
  72. void Simulator::scheduleEvent(Event *event) {
  73. this->eventQueue->push(event);
  74. }
  75.  
  76. void Simulator::run() {
  77.  
  78.  
  79. while (eventQueue->empty() == false) {
  80. Event *event = this->eventQueue->top();
  81. this->eventQueue->pop();
  82.  
  83. this->simclock = event->getEventTime();
  84. event->processEvent(this);
  85. delete event;
  86. }
  87. }
  88.  
  89. void Simulator::setSimulationEndTime(t_simtime endTime) {
  90. Event *endEvent = new EndEvent(endTime);
  91. this->scheduleEvent(endEvent);
  92. }
  93.  
  94. Simulator::~Simulator() {
  95. if (eventQueue) {
  96. while (!eventQueue->empty()) {
  97. Event *event = eventQueue->top();
  98. eventQueue->pop();
  99. delete event;
  100. }
  101. delete eventQueue;
  102. }
  103.  
  104. }
  105.  
  106. // Event classes
  107.  
  108. EndEvent::EndEvent(t_simtime time, EventType type, string name): Event (time, type, name) { }
  109. EndEvent::EndEvent(t_simtime time): Event (time, EXIT, string("EXIT")) { }
  110. void EndEvent::processEvent(Simulator *sim) {
  111. sim->lock = 1;
  112. }
  113.  
  114.  
  115. DepartureEvent::DepartureEvent(t_simtime time, EventType type, string name,int serial): Event (time, type, name) {
  116. tellerSerial = serial;
  117. }
  118. DepartureEvent::DepartureEvent(t_simtime time,int serial): Event (time, DEPARTURE, string("DEPARTURE")){
  119. tellerSerial = serial;
  120. }
  121.  
  122. void DepartureEvent::processEvent(Simulator *sim) {
  123.  
  124. if (sim->teller[tellerSerial].queueCustomer.size()>0){
  125. Customer customer = sim->teller[tellerSerial].queueCustomer.front();
  126. sim->teller[tellerSerial].queueCustomer.pop_front();
  127.  
  128. if (sim->teller[tellerSerial].queueCustomer.size()>0){
  129. sim->teller[tellerSerial].queueCustomer.front().serviceStartTime = sim->now();
  130. sim->scheduleEvent(new DepartureEvent((sim->now() + randomGenerator(meanServiceTime)),tellerSerial));
  131. }
  132.  
  133. customer.exitTime = sim->now();
  134. CustomerDq.push_back(customer);
  135.  
  136. jockey(tellerSerial,sim);
  137. }
  138. if(sim->teller[tellerSerial].queueCustomer.size() == 0){
  139. sim->teller[tellerSerial].idle = 1;
  140. jockey(tellerSerial,sim);
  141. }
  142.  
  143. }
  144.  
  145.  
  146. ArrivalEvent::ArrivalEvent(t_simtime time, EventType type, string name): Event (time, type, name) { }
  147. ArrivalEvent::ArrivalEvent(t_simtime time): Event (time, ARRIVAL, string("ARRIVAL")) { }
  148.  
  149. void ArrivalEvent::processEvent(Simulator *sim) {
  150. int serial,minQSize,i;
  151. if (sim->lock == 0){
  152. sim->noOfCustomer++;
  153. Customer customer(sim->noOfCustomer,getEventTime(),0,0);
  154.  
  155. serial = 0;
  156. minQSize = sim->teller[serial].queueCustomer.size();
  157.  
  158. for (int i=1;i<sim->noOfTeller;i++){
  159. if (minQSize > sim->teller[i].queueCustomer.size()){
  160. minQSize = sim->teller[i].queueCustomer.size();
  161. serial = i;
  162. }
  163. }
  164. if (sim->teller[serial].queueCustomer.size()==0){
  165. sim->scheduleEvent(new DepartureEvent((sim->now()+randomGenerator(meanServiceTime)),serial));
  166. customer.serviceStartTime=customer.arriveTime;
  167. sim->teller[serial].idle = 0;
  168. }
  169. sim->teller[serial].queueCustomer.push_back(customer);
  170. sim->scheduleEvent(new ArrivalEvent(sim->now() + randomGenerator(meanarriveTime)));
  171.  
  172.  
  173. }
  174. }
  175.  
  176.  
  177. int main(int argc, char **argv) {
  178.  
  179.  
  180. ofstream report;
  181. report.open ("report.txt",ios::out);
  182. double countDelay[100];
  183. int countDelayserial=0;
  184.  
  185. report<<"Number of Teller:\t"<<tellerNumber<<endl;
  186. report<<"Mean interarrival Time:\t"<<meanarriveTime<<endl;
  187. report<<"Mean Service Time:\t"<<meanServiceTime<<endl;
  188. report<<"Bank Closes after:\t 8.000 hours"<<endl;
  189. for (int i=0;i<100;i++){
  190.  
  191. Simulator *sim = new Simulator();
  192. sim->scheduleEvent(new ArrivalEvent(randomGenerator(meanarriveTime)));
  193. sim->scheduleEvent(new EndEvent(480));
  194. sim->setSimulationEndTime(1000);
  195. sim->run();
  196.  
  197. double delayMax = MIN;
  198. double delayMin = MAX;
  199. double qMax = MIN;
  200. double qMin = MAX;
  201.  
  202. int dqSize = CustomerDq.size();
  203. double sizeArray[dqSize];
  204. double qTimeArray[dqSize];
  205. int j=0;
  206. double avgQueue,avgDelay,delay,qTime;
  207.  
  208. for (deque<Customer>::iterator it = CustomerDq.begin(); it!=CustomerDq.end(); ++it){
  209. delay = (*it).serviceStartTime - (*it).arriveTime;
  210. qTime = (*it).exitTime - (*it).arriveTime;
  211. sizeArray[j] = delay;
  212. qTimeArray[j] = qTime;
  213. j++;
  214. avgDelay+=delay;
  215. avgQueue+=qTime;
  216. }
  217.  
  218. for(int k = 0 ; k<dqSize; k++){
  219. if(delayMax < sizeArray[k]){
  220. delayMax = sizeArray[k];
  221. }
  222. if(delayMin > sizeArray[k]){
  223. delayMin = sizeArray[k];
  224. }
  225. if(qMax < qTimeArray[k]){
  226. qMax = qTimeArray[k];
  227. }
  228. if(qMin > qTimeArray[k]){
  229. qMin = qTimeArray[k];
  230. }
  231. }
  232.  
  233.  
  234. avgDelay = avgDelay/dqSize;
  235. avgQueue = avgQueue/dqSize;
  236.  
  237.  
  238. countDelay[countDelayserial] = avgDelay;
  239. countDelayserial++;
  240.  
  241. report<<"Simulation no. "<<i<<endl;
  242. report<<"With "<<sim->noOfTeller<<" tellers, average number in queue =\t "<<avgQueue<<endl;
  243. report<<"Delays in queues,in minutes:\n\n";
  244. report<<"Average\t No. of customers\t Maximum\t Minimum"<<endl;
  245. report<<"\n";
  246. report<<avgDelay<<" "<<dqSize<<" "<<delayMax<<" "<<delayMin<<endl;
  247. report<<"\n";
  248.  
  249. delete sim;
  250. CustomerDq.clear();
  251.  
  252.  
  253. }
  254.  
  255. double I,left,right,diff;
  256. double avgX=0;
  257. double square=0;
  258. for (int i=0;i<100;i++)
  259. avgX+=countDelay[i];
  260. avgX=avgX/100;
  261. for (int i=0;i<100;i++){
  262.  
  263.  
  264. diff = countDelay[i] - avgX;
  265. square += pow(diff,2);
  266. }
  267.  
  268. square = square/99;
  269. I = 1.65*sqrt(square/100);
  270. left = avgX-I;
  271. right = avgX+I;
  272.  
  273.  
  274. report<<endl<<"Average\t Left Boundary\t Right Boundary"<<endl;
  275. report<<"\n";
  276. report<<avgX<<" "<<left<<" "<<right<<endl;
  277. report<<"\n";
  278.  
  279. report.close();
  280.  
  281. return 0;
  282. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement