diff --git a/MV3302ClassCode/src/mv3302/StoppedPartArrivalProcess.java b/MV3302ClassCode/src/mv3302/StoppedPartArrivalProcess.java index 78767c0917a0b8486cf409e1bac40971db2800b7..5daa5d407c6ee1397975fa899df67e69d815b2a5 100644 --- a/MV3302ClassCode/src/mv3302/StoppedPartArrivalProcess.java +++ b/MV3302ClassCode/src/mv3302/StoppedPartArrivalProcess.java @@ -1,21 +1,18 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Beans/Bean.java to edit this template - */ package mv3302; -import simkit.random.RandomVariate; - - /** + * The StoppedPartArrivalProcess class extends the PartArrivalProcess class and + * represents a process that stops the arrival of parts for a specified + * duration. It overrides the doRun() method to wait for a specified stop time + * before resuming the arrival of parts. It also provides methods to schedule + * the next arrival and get/set the stop time. * * @author dansl */ public final class StoppedPartArrivalProcess extends PartArrivalProcess { - //private RandomVariate interarrivalTimeGenerator; -public int stopTime; - //int stopTime = 480; + private int stopTime; + /** * Zero-argument constructor */ @@ -24,22 +21,27 @@ public int stopTime; } /** - * Instantiate with the given parameters + * Constructs a StoppedPartArrivalProcess object with the given stop time. * - * @param interarrivalTimes Given inter arrival times + * @param stopTime The duration for which the arrival of parts should be + * stopped. */ public StoppedPartArrivalProcess(int stopTime) { this.stopTime = stopTime; } + /** + * Overrides the doRun() method from the parent class. Pauses the arrival of + * parts for the specified stop time. + */ @Override public void doRun() { waitDelay("StopArrivals", getStopTime()); } /** - * Schedule next Arrival<br> - * Schedule Arrival(index) + * Schedule the next arrival after stopping. This method schedules the + * Arrival(index) process. */ public void doStopArrivals() { interrupt("Arrival"); diff --git a/MV3302ClassCode/src/mv3302/run/RunSteadyStateAnalysis.java b/MV3302ClassCode/src/mv3302/run/RunSteadyStateAnalysis.java index ab7af7fd325102870b37a8fb5d8bb1c0004157d1..51a6b72b76e6c6d1e0a64c432ba3c017257f980f 100644 --- a/MV3302ClassCode/src/mv3302/run/RunSteadyStateAnalysis.java +++ b/MV3302ClassCode/src/mv3302/run/RunSteadyStateAnalysis.java @@ -1,7 +1,5 @@ - package mv3302.run; - import static java.lang.Math.sqrt; import mv3302.PartArrivalProcess; import mv3302.TransferLineComponent; @@ -13,58 +11,63 @@ import simkit.stat.StudentT; import simkit.stat.TruncatingSimpleStatsTally; /** + * The main class for running steady state analysis. * * @author dansl */ public class RunSteadyStateAnalysis { /** + * The main method for executing the steady state analysis. + * * @param args the command line arguments */ public static void main(String args[]) { + // Create a random variate generator for interarrival times with an exponential distribution and mean of 2.5 RandomVariate interarrivalTimeGenerator = RandomVariateFactory.getInstance( "Exponential", 2.5); + // Create a part arrival process with the interarrival time generator PartArrivalProcess arrivalProcess = new PartArrivalProcess(interarrivalTimeGenerator); - - RandomVariate[] processingTimeGenerator = - {RandomVariateFactory.getInstance("Exponential", 2.4), RandomVariateFactory.getInstance("Gamma", 3.2, 3.3), RandomVariateFactory.getInstance("Uniform", 4.5, 6.7), RandomVariateFactory.getInstance("Exponential", 3.0)}; - + // Create an array of random variate generators for processing times + RandomVariate[] processingTimeGenerator + = {RandomVariateFactory.getInstance("Exponential", 2.4), + RandomVariateFactory.getInstance("Gamma", 3.2, 3.3), + RandomVariateFactory.getInstance("Uniform", 4.5, 6.7), + RandomVariateFactory.getInstance("Exponential", 3.0)}; + // Create an array of total number of workstations int[] totalNumberWorkstations = new int[4]; totalNumberWorkstations[0] = 1; totalNumberWorkstations[1] = 5; totalNumberWorkstations[2] = 4; totalNumberWorkstations[3] = 2; - + // Create a transfer line component with the processing time generators and total number of workstations TransferLineComponent transferLineComponent = new TransferLineComponent(processingTimeGenerator, totalNumberWorkstations); - + // Add the transfer line component as a listener to the arrival process arrivalProcess.addSimEventListener(transferLineComponent); - int warmup = 1000; int observations = 10000; - + // Create a statistical tally for tracking delay in queue SimpleStatsTally delayInQueueStat = new TruncatingSimpleStatsTally("delayInQueue", 2000); - + // Add the delay in queue stat as a property change listener to the transfer line component transferLineComponent.addPropertyChangeListener(delayInQueueStat); - System.out.println(arrivalProcess); System.out.println(transferLineComponent); - + // Create a statistical tally for tracking delay in queue in the outer loop SimpleStatsTally outerDelayInQueueStat = new SimpleStatsTally("outerDelayInQueue"); - + // Stop the simulation after warmup + observations arrivals Schedule.stopOnEvent(warmup + observations, "Arrival"); - - int numberReplications = 15; + int numberReplications = 50; double alpha = 0.05; - + // Outer loop for multiple replications System.out.println("Avg Delay In Queue"); for (int replication = 1; replication <= numberReplications; ++replication) { - + // Reset the simulation schedule and delay in queue stat for each replication Schedule.reset(); delayInQueueStat.reset(); - Schedule.startSimulation(); + // Record the mean delay in queue for the replication in the outer tally outerDelayInQueueStat.newObservation(delayInQueueStat.getMean()); - + // Print the replication number, average delay, and confidence interval System.out.printf("%d %.3f ± %.3f%n", replication, outerDelayInQueueStat.getMean(), @@ -72,6 +75,5 @@ public class RunSteadyStateAnalysis { * StudentT.getQuantile(1.0 - 0.5 * alpha, outerDelayInQueueStat.getCount() - 1) / sqrt(outerDelayInQueueStat.getCount()) ); } - } -} \ No newline at end of file +} diff --git a/MV3302ClassCode/src/mv3302/run/RunTransientAnalysis.java b/MV3302ClassCode/src/mv3302/run/RunTransientAnalysis.java index 9c566be25b588523e5a472e144e300aa15b91bb0..156fce31bfaabbe8aeab1d3e322eeb7c2a499f38 100644 --- a/MV3302ClassCode/src/mv3302/run/RunTransientAnalysis.java +++ b/MV3302ClassCode/src/mv3302/run/RunTransientAnalysis.java @@ -4,7 +4,6 @@ import static java.lang.Math.sqrt; import mv3302.PartArrivalProcess; import mv3302.StoppedPartArrivalProcess; import mv3302.TransferLineComponent; -import mv3302.TransientStats; import simkit.Schedule; import simkit.random.RandomVariate; import simkit.random.RandomVariateFactory; @@ -21,50 +20,57 @@ public class RunTransientAnalysis { * @param args the command line arguments */ public static void main(String args[]) { + // Create an exponential random variate generator with a mean of 2.5 RandomVariate interarrivalTimeGenerator = RandomVariateFactory.getInstance( "Exponential", 2.5); + // Define the stop time for the simulation (in minutes) int stopTime = 480; + // Create a part arrival process using the interarrival time generator PartArrivalProcess partArrivalProcess = new PartArrivalProcess(interarrivalTimeGenerator); + // Create a stopped part arrival process with the given stop time StoppedPartArrivalProcess stoppedArrivalProcess = new StoppedPartArrivalProcess(stopTime); - + // Create an array of random variate generators for processing times RandomVariate[] processingTimeGenerator - = {RandomVariateFactory.getInstance("Exponential", 2.4), RandomVariateFactory.getInstance("Gamma", 3.2, 3.3), RandomVariateFactory.getInstance("Uniform", 4.5, 6.7), RandomVariateFactory.getInstance("Exponential", 3.0)}; - + = {RandomVariateFactory.getInstance("Exponential", 2.4), + RandomVariateFactory.getInstance("Gamma", 3.2, 3.3), + RandomVariateFactory.getInstance("Uniform", 4.5, 6.7), + RandomVariateFactory.getInstance("Exponential", 3.0)}; + // Define the total number of workstations for each type of processing time int[] totalNumberWorkstations = new int[4]; totalNumberWorkstations[0] = 1; totalNumberWorkstations[1] = 5; totalNumberWorkstations[2] = 4; totalNumberWorkstations[3] = 2; - + // Create a transfer line component with the processing time generators and workstation numbers TransferLineComponent transferLineComponent = new TransferLineComponent(processingTimeGenerator, totalNumberWorkstations); - + // Add the transfer line component as a listener to the part arrival processes partArrivalProcess.addSimEventListener(transferLineComponent); stoppedArrivalProcess.addSimEventListener(transferLineComponent); - -// SimpleStatsTally delayInQueueTransient = new SimpleStatsTally("delayInQueue"); -// + // Create a statistics tally for total time in the system SimpleStatsTally totalTimeInSystemStat = new SimpleStatsTally("totalTimeInSystem"); - + // Add the statistics tally as a property change listener to the transfer line component transferLineComponent.addPropertyChangeListener(totalTimeInSystemStat); System.out.println(partArrivalProcess); System.out.println(stoppedArrivalProcess); System.out.println(transferLineComponent); - + // Create a statistics tally for outer time in the system SimpleStatsTally outerTimeInSystemStat = new SimpleStatsTally("outerTimeInSystem"); - - int numberReplications = 200; + // Define the confidence level (alpha) double alpha = 0.05; + // Stop the simulation after 10,000 events with the name "Arrival" Schedule.stopOnEvent(10000, "Arrival"); System.out.println("Avg Delay In Queue"); + // Run the replications for (int replication = 1; replication <= stopTime; ++replication) { Schedule.reset(); + // Reset the statistics tally for total time in the system totalTimeInSystemStat.reset(); Schedule.startSimulation(); - + // Record the outer time in the system using the mean of the total time in the system outerTimeInSystemStat.newObservation(totalTimeInSystemStat.getMean()); - + // Print the replication number, mean, and confidence interval System.out.printf("%d %.3f ± %.3f%n", replication, outerTimeInSystemStat.getMean(), @@ -72,6 +78,5 @@ public class RunTransientAnalysis { * StudentT.getQuantile(1.0 - 0.5 * alpha, outerTimeInSystemStat.getCount() - 1) / sqrt(outerTimeInSystemStat.getCount()) ); } - } }