//Time_keeper.cpp #include "stdio.h" #include "iostream.h" #include "math.h" #include "string.h" #include "stdlib.h" #include "assert.h" #include "SetDef.h" #include "rankedSetDef.h" #include "subsetHolder.h" #include "Accumulated_Tallied_Variables.h" #include "Events.h" #include "JobShop.h" time_keeper::time_keeper(){} time_keeper::~time_keeper() { Calendar.destroyInstructionNE = OKtoDestroyIfNotEmpty; Calendar.destroyInstructionCC = DestroyWithoutRemovingCursors; } fileReturnCode time_keeper::Cause(long eventNoticePtr, double time) { if(time < SimTime) { printf("\n\nAttempting to cause at %f less than Simtime() %f\n\n", time, SimTime); _exit(-1); } return Calendar.fileMemberIntoSet(time, (long)eventNoticePtr); } void time_keeper::Simulate() { RAandMID RM; event * eventPtr; Sale * SalePtr; EndProcess * EPPtr; double announceDay; //Schedule end of simulation eventPtr = new event; eventPtr->event_type = endSim; eventPtr->time = LengthOfRun; Timer.Cause((long)eventPtr, LengthOfRun); announceDay = 10.0; //MAIN TIMING LOOP while(Timer.Calendar.NrInSet() > 0) { RM = Timer.Calendar.removeFirstFromSet(); assert(RM.RM_rankingAtt>=SimTime); SimTime = RM.RM_rankingAtt; eventPtr = (event *)RM.RM_memberID; //Report passage of time. if (SimTime>=announceDay) { printf("\nDay number %5.0f \n", announceDay); announceDay += 10.0; } //Call appropriate event routine. switch (eventPtr->event_type) { case (endSim): EndSimulation(); return; case (sale): SalePtr = (Sale *)eventPtr; SalePtr->SJTPtr->NewSale((Sale*)eventPtr); break; case (endProcess): EPPtr = (EndProcess *)eventPtr; EPPtr->endOfProcessing(); break; default: printf("Failed to identify type of event"); _exit(-2); } } assert (0 == 1); //Shouldn't be able to get here return; } double exponential() { double denominator = (double)RAND_MAX; double numerator = (double)rand(); double uniform = numerator/denominator; return -log(uniform); } void time_keeper::EndSimulation() { int i; Machine_group * MGPtr; Std_job_type *SJT; printf("\n\nEND OF SIMULATION\n\nSee the JobShopOutput.txt file for results.\n\n"); fprintf(fpOut, " JOB SHOP \n"); fprintf(fpOut, " UTILIIZATION AND PERFORMANCE REPORTs\n\n"); fprintf(fpOut,"\nMachine Group Activity\n\n"); fprintf(fpOut," Number in Queue Idle Machines \n"); fprintf(fpOut," Machine ---------------------- -----------------------\n"); fprintf(fpOut," Group Mean StdDev Max Mean StdDev Max \n"); for (i=0; iQueue_size.Mean(), MGPtr->Queue_size.StdDev(), MGPtr->Queue_size.Max()); fprintf(fpOut," %7.3f %7.3f %4.0f \n", MGPtr->Free_machines.Mean(), MGPtr->Free_machines.StdDev(), MGPtr->Free_machines.Max()); } fprintf(fpOut,"\n\nShop Performance\n\n"); fprintf(fpOut," Standard Time in Shop(days) \n"); fprintf(fpOut," Job ---------------------- \n"); fprintf(fpOut," Type Mean StdDev Max \n"); for (i=0; iTime_in_shop.Mean(), SJT->Time_in_shop.StdDev(), SJT->Time_in_shop.Max()); } fprintf(fpOut,"\n\n"); }