Skip to content
Snippets Groups Projects
RunTransferLineComponent.java 5.62 KiB
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Main.java to edit this template
 */
package mv3302.run;

import mv3302.PartArrivalProcess;
import mv3302.TransferLineComponent;
import simkit.Schedule;
import simkit.random.RandomVariate;
import simkit.random.RandomVariateFactory;
import simkit.stat.MultipleCollectionSizeTimeVarying;
import simkit.stat.MultipleSimpleStatsTally;
import simkit.util.SimplePropertyDumper;

/**
 *
 * @author dansl
 */
public class RunTransferLineComponent {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        //        Instantiate PartArrivalProcess
        RandomVariate interarrivalTimeGenerator = RandomVariateFactory.getInstance("Exponential", 1.7);
        PartArrivalProcess arrivalProcess = new PartArrivalProcess(interarrivalTimeGenerator);
        System.out.println(arrivalProcess);

//        Instantiate TransferLineComponent
        int[] totalNumberMachines = new int[3];
        totalNumberMachines[0] = 5;
        totalNumberMachines[1] = 4;
        totalNumberMachines[2] = 2;
        RandomVariate[] processingTimeGenerator = {RandomVariateFactory.getInstance("Gamma", 3.2, 2.3),
            RandomVariateFactory.getInstance("Uniform", 4.5, 6.7),
            RandomVariateFactory.getInstance("Exponential", 3.0)};
        TransferLineComponent transferLineComponent = new TransferLineComponent(processingTimeGenerator, totalNumberMachines);
        System.out.println(transferLineComponent);

//        The transferLineComponent will "hear" Arrival(part) events
        arrivalProcess.addSimEventListener(transferLineComponent);

        //        This was used for debugging model
//        SimplePropertyDumper simplePropertyDumper = new SimplePropertyDumper(true);
//        This listener computes time-varying statistics for multiple Collection states
        MultipleCollectionSizeTimeVarying numberInQueueStat
                = new MultipleCollectionSizeTimeVarying("queue");
        transferLineComponent.addPropertyChangeListener("queue", numberInQueueStat);

        MultipleCollectionSizeTimeVarying numberAvailableMachinesStat
                = new MultipleCollectionSizeTimeVarying("numberAvailableMachines");
        transferLineComponent.addPropertyChangeListener("numberAvailableMachines", numberAvailableMachinesStat);

//        Tally statistics are computed in the same way by "listening" 
        MultipleSimpleStatsTally timeAtStationStat
                = new MultipleSimpleStatsTally("timeAtStation");
        transferLineComponent.addPropertyChangeListener("timeAtStation",
                timeAtStationStat);

        MultipleSimpleStatsTally delayInQueueStat
                = new MultipleSimpleStatsTally("delayInQueue");
        transferLineComponent.addPropertyChangeListener("delayInQueue",
                delayInQueueStat);

//        arrivalProcess.addPropertyChangeListener(simplePropertyDumper);
//        transferLineComponent.addPropertyChangeListener(simplePropertyDumper);
//        Was "true" when debugging model
        Schedule.setVerbose(false);

//        Run for 500,000 time units        
        double stopTime = 500.0;
        Schedule.stopAtTime(stopTime);

//      Initialized and Run
        Schedule.reset();
//Start Running of Simulation
        Schedule.startSimulation(); //Commented out because I couldn't get the code to run past the doArrival() method.
        System.out.printf("%nSimulation ended at time %,.2f%n%n", Schedule.getSimTime());

        System.out.printf("Number arrivals: %5s%n", arrivalProcess.getNumberArrivals());
        System.out.printf("Number Completed: %4s%n%n", timeAtStationStat.getCount());

        System.out.printf("%15s%15s%15s%15s%15s%n", "", "Avg", "Avg #", "Avg Delay", "Avg Time");
        System.out.printf("%15s%15s%15s%15s%15s%n", "station", "util", "in Queue", "in Queue", "at Station");
        for (int i = 0; i < totalNumberMachines.length; i++) {
            double utilization = 1.0 - numberAvailableMachinesStat.getMean(i) / transferLineComponent.getTotalNumberMachines(i);
            double avgNumberInQueue = numberInQueueStat.getMean(i);
            double avgDelayInQueue = delayInQueueStat.getMean(i);
            double avgTimeAtStation = timeAtStationStat.getMean(i);
            System.out.printf("%15d%15.4f%15.4f%15.4f%15.4f%n", i, utilization, avgNumberInQueue, avgDelayInQueue, avgTimeAtStation);
        }
        System.out.println();
        System.out.println("Using Little's Formula");
        System.out.println();
        System.out.printf("%15s%15s%15s%n", "", "Avg Delay", "Avg Time");
        System.out.printf("%15s%15s%15s%n", "station", "in Queue", "at Station");
        for (int i = 0; i < totalNumberMachines.length; i++) {
            double avgDelayInQueue = delayInQueueStat.getMean(i);
            double avgTimeAtStation = avgDelayInQueue + timeAtStationStat.getMean() / transferLineComponent.getNumberComplete();
            System.out.printf("%15s%15.4f%15.4f%n", i, avgDelayInQueue, avgTimeAtStation);
        }
        System.out.println();
        System.out.printf("Avg Time in System: %.4f (Using Little: %.4f)%n", timeAtStationStat.getMean() + delayInQueueStat.getMean(),
                timeAtStationStat.getMean() + delayInQueueStat.getMean() - transferLineComponent.getTotalTimeInSystem());
        System.out.printf("Avg total delay in queue: %.4f (Using Little: %.4f)%n", delayInQueueStat.getMean(),
                delayInQueueStat.getMean() - transferLineComponent.getTotalTimeInSystem() * (1.0 - numberAvailableMachinesStat.getMean() / totalNumberMachines.length));
    }
}