View
253
Download
6
Embed Size (px)
Citation preview
Simulation Software andSimulation in Java
Simulation languages & software
Simulation Model Development
General Purpose Languages
Simulation Programming Languages
C,C++, Fortran,
Java
Examples:
SIMAN, GPSS, SLAM
Examples:
Simulation Environments
Examples:
ARENA ,AUTOMOD
Simulation languages & software
• General Features– Orientation (general vs. manufacturing)
– Modeling approaches (event-scheduling based, activity-scanning based, process-interaction based)
– Input mode (batch mode, interactive mode, etc)
– On-line help
– Debugger
– Type of simulation (discrete vs. continuous)
– Integrated data-base
Simulation languages & software
• Statistical capability– Number of random number generators
– Standard distribution functions
– Empirical distribution functions
– User defined random number streams
– Warm-up period, steady state analysis
– Multiple replications, batching
Simulation languages & software
• Output – Standard reports
– Intermediate reports
– Quality of graphics
• Material handling– Conveyors
– Forklifts
– AGVs, robots
– AS/RS
Simulation languages & software
• Animation – 2 or 3 dimensional
– Multiple screen layout
– Zoom
– Speed up/down
– Playback
– Elements (programming, graphics, menu, etc)
Simulation languages & software
• Customer support– Training
– Free technical support
– Documentation (manuals, etc)
Selection of Simulation Software
1. Do not focus on a single issue, such as ease of use. Consider the accuracy and level of detail obtainable, ease of learning, vendor support, and suitability to your applications
2. Execution speed is important. Speed affects development time.
3. Beware of the advertising claims and demonstrations.
4. Ask the vendor to solve a small version of your problem
Selection of Simulation Software
5. Beware of “checklists” with “yes” and “no” as entries. Implementation and capability are what is important
6. Capability to link it with code written in general-purpose languages is good, but you should not be required to do it for basic modeling.
7. Although it is nice to be able to build the models with a GUI without actually writing to code, the software should give you the capability to write code when you need something that is not built-in.
Overall Structure of an Event-Scheduling Simulation Program
Overall Structure of Java Simulation of a Single-Server Queue
Java Main Programclass Sim {
// Class Sim variablespublic static double Clock, MeanInterArrivalTime, MeanServiceTime, SIGMA,
LastEventTime, TotalBusy, MaxQueueLength, SumResponseTime;public static long NumberOfCustomers, QueueLength, NumberInService, TotalCustomers, NumberOfDepartures, LongService;
public final static int arrival = 1;public final static int departure = 2;
public static EventList FutureEventList;public static Queue Customers;public static Random stream;
Java Main Program
public static void main(String argv[]) {
MeanInterArrivalTime = 4.5; MeanServiceTime = 3.2; SIGMA = 0.6; TotalCustomers = 1000; long seed = 1234567;
stream = new Random(seed); // initialize rng stream FutureEventList = new EventList(); Customers = new Queue(); Initialization();
Java Main Program
// Loop until first "TotalCustomers" have departed while(NumberOfDepartures < TotalCustomers ) { Event evt = (Event)FutureEventList.getMin(); // get
imminent event FutureEventList.dequeue(); // be rid of it Clock = evt.get_time(); // advance
simulation time if( evt.get_type() == arrival ) ProcessArrival(evt); else ProcessDeparture(evt); } ReportGeneration(); }
Initialization Method // seed the event list with TotalCustomers arrivals public static void Initialization() { Clock = 0.0; QueueLength = 0; NumberInService = 0; LastEventTime = 0.0; TotalBusy = 0 ; MaxQueueLength = 0; SumResponseTime = 0; NumberOfDepartures = 0; LongService = 0;
// create first arrival event Event evt = new Event(arrival, exponential( stream,
MeanInterArrivalTime)); FutureEventList.enqueue( evt ); }
Arrival Event Methodpublic static void ProcessArrival(Event evt) { Customers.enqueue(evt); QueueLength++; // if the server is idle, fetch the event, do statistics // and put into service if( NumberInService == 0) ScheduleDeparture(); else TotalBusy += (Clock - LastEventTime); // server is busy
// adjust max queue length statistics if (MaxQueueLength < QueueLength) MaxQueueLength = QueueLength;
// schedule the next arrival Event next_arrival = new Event(arrival, Clock+exponential(stream,
MeanInterArrivalTime)); FutureEventList.enqueue( next_arrival ); LastEventTime = Clock; }
Schedule Departure Method
public static void ScheduleDeparture() { double ServiceTime; // get the job at the head of the queue while (( ServiceTime = normal(stream, MeanServiceTime,
SIGMA)) < 0 ); Event depart = new
Event(departure,Clock+ServiceTime); FutureEventList.enqueue( depart ); NumberInService = 1; QueueLength--; }
Departure Event Methodpublic static void ProcessDeparture(Event e) { // get the customer description Event finished = (Event) Customers.dequeue(); // if there are customers in the queue then schedule // the departure of the next one if( QueueLength > 0 ) ScheduleDeparture(); else NumberInService = 0; // measure the response time and add to the sum double response = (Clock - finished.get_time()); SumResponseTime += response; if( response > 4.0 ) LongService++; // record long service TotalBusy += (Clock - LastEventTime ); NumberOfDepartures++; LastEventTime = Clock; }
Report Generation Methodpublic static void ReportGeneration() {double RHO = TotalBusy/Clock;double AVGR = SumResponseTime/TotalCustomers;double PC4 = ((double)LongService)/TotalCustomers;
System.out.println( "SINGLE SERVER QUEUE SIMULATION - GROCERY STORE CHECKOUT COUNTER ");
System.out.println( "\tMEAN INTERARRIVAL TIME " + MeanInterArrivalTime );
System.out.println( "\tMEAN SERVICE TIME " + MeanServiceTime );
System.out.println( "\tSTANDARD DEVIATION OF SERVICE TIMES " + SIGMA );
System.out.println( "\tNUMBER OF CUSTOMERS SERVED " + TotalCustomers );
Report Generation Method
System.out.println(); System.out.println( "\tSERVER UTILIZATION " +
RHO );System.out.println( "\tMAXIMUM LINE LENGTH "
+ MaxQueueLength );System.out.println( "\tAVERAGE RESPONSE TIME "
+ AVGR + " MINUTES" );System.out.println( "\tPROPORTION WHO SPEND FOUR "); System.out.println( "\t MINUTES OR MORE IN SYSTEM
" + PC4 );System.out.println( "\tSIMULATION RUNLENGTH "
+ Clock + " MINUTES" );System.out.println( "\tNUMBER OF DEPARTURES
" + TotalCustomers );}
Random Variate Generatorspublic static double exponential(Random rng, double mean) { return -mean*Math.log( rng.nextDouble() );}public static double SaveNormal;public static int NumNormals = 0;public static final double PI = 3.1415927 ;public static double normal(Random rng, double mean, double sigma) { double ReturnNormal; // should we generate two normals? if(NumNormals == 0 ) { double r1 = rng.nextDouble(); double r2 = rng.nextDouble(); ReturnNormal = Math.sqrt( 2*Math.log(r1))*Math.cos(2*PI*r2); SaveNormal = Math.sqrt(-2*Math.log(r1))*Math.sin(2*PI*r2); NumNormals = 1; }
else { NumNormals = 0; ReturnNormal = SaveNormal; } return ReturnNormal*sigma + mean ; }}