double runSimulation(double arrivalRate, double serviceTime, double simTime) { struct Simulation sim; struct Data temp; int e; sim = initSimulation(arrivalRate, serviceTime, simTime); while (sim.timeForNextDeparture < simTime) { if (sim.timeForNextArrival > sim.timeForNextDeparture && sim.buffer.currSize != 0) { sim.e = 1; } else { sim.e = 0; } e = sim.e; switch (e) { /*Packet arriving*/ case ARRIVAL: temp.arrivalTime = sim.timeForNextArrival; enqueue(&(sim.buffer), temp); sim.currTime = sim.timeForNextArrival; sim.timeForNextArrival += getRandTime(arrivalRate); break; /*Packet departing*/ case DEPARTURE: temp = dequeue(&(sim.buffer)); temp.departureTime = sim.timeForNextDeparture; sim.currTime = sim.timeForNextDeparture; if (sim.buffer.currSize != 0) { sim.timeForNextDeparture += serviceTime; } else { sim.timeForNextDeparture = sim.timeForNextArrival + serviceTime; } enqueue(&(sim.eventQueue), temp); break; } } /*Freeing what was not departed from the queue*/ while(sim.buffer.currSize > 0) { temp = dequeue(&(sim.buffer)); } /*Return average wait time*/ return calcAverageWaitingTime(&sim); }
double runSimulation(double arrivalRate, double serviceTime, double simTime) { struct Simulation sim = initSimulation(arrivalRate, serviceTime, simTime); //int i = 0; while(sim.currTime < sim.totalSimTime) { if(sim.timeForNextArrival < sim.timeForNextDeparture) { sim.currTime = sim.timeForNextArrival; struct Data pktdata; pktdata.arrivalTime = sim.currTime; /* pktdata.departureTime = -1; */ enqueue(&sim.buffer, pktdata); //printf("%d, arrival: %f \n", ++i, sim.currTime); sim.timeForNextArrival = sim.currTime + getRandTime(sim.arrivalRate); } else if(sim.buffer.currSize == 0) { sim.currTime = sim.timeForNextArrival; //printf("%d, skip: %f \n", i, sim.currTime); sim.timeForNextDeparture = sim.currTime + sim.serviceTime; } else if(sim.timeForNextArrival >= sim.timeForNextDeparture) { sim.currTime = sim.timeForNextDeparture; struct Data tempdata = dequeue(&sim.buffer); tempdata.departureTime = sim.currTime; enqueue(&sim.eventQueue, tempdata); //printf("%d, departure: %f \n", i, sim.currTime); if(sim.buffer.currSize == 0) sim.timeForNextDeparture = sim.timeForNextArrival + sim.serviceTime; else if(sim.buffer.currSize != 0) sim.timeForNextDeparture = sim.currTime + sim.serviceTime; } } double res = calcAverageWaitingTime(&sim); freeQueue(&sim.buffer); return res; }
double runSimulation(double arrivalRate, double serviceTime, double simTime) { struct Simulation sim = initSimulation(arrivalRate, serviceTime, simTime); while(sim.currTime < sim.totalSimTime){ if((sim.timeForNextArrival < sim.timeForNextDeparture) || (sim.buffer.currSize == 0)){ sim.e = ARRIVAL; } else{ sim.e = DEPARTURE; } //printf("Curr: %lf\n",sim.currTime); if(sim.e == ARRIVAL){ sim.currTime = sim.timeForNextArrival; struct Data d; d.arrivalTime = sim.currTime; enqueue(&(sim.buffer), d); sim.timeForNextArrival = sim.currTime + getRandTime(sim.arrivalRate); if(sim.buffer.currSize == 1){ sim.timeForNextDeparture = sim.currTime + serviceTime; //printf("ok"); } } else if(sim.e == DEPARTURE){ sim.currTime = sim.timeForNextDeparture; struct Data packet = dequeue(&(sim.buffer)); //printf("Depart: %lf\n", packet.arrivalTime); packet.departureTime = sim.currTime; //printf("Arrival: %lf\n", packet.arrivalTime); //printf("Depart: %lf\n", packet.departureTime); sim.timeForNextDeparture = sim.currTime + serviceTime; enqueue(&(sim.eventQueue), packet); } } return calcAverageWaitingTime(&sim); }