package nl.tudelft.simulation.dsol.jetty.test41; import nl.tudelft.simulation.dsol.DSOLModel; import nl.tudelft.simulation.dsol.SimRuntimeException; import nl.tudelft.simulation.dsol.formalisms.Resource; import nl.tudelft.simulation.dsol.formalisms.flow.Delay; import nl.tudelft.simulation.dsol.formalisms.flow.Generator; import nl.tudelft.simulation.dsol.formalisms.flow.Release; import nl.tudelft.simulation.dsol.formalisms.flow.Seize; import nl.tudelft.simulation.dsol.formalisms.flow.StationInterface; import nl.tudelft.simulation.dsol.formalisms.flow.statistics.Utilization; import nl.tudelft.simulation.dsol.simtime.SimTimeDouble; import nl.tudelft.simulation.dsol.simtime.dist.DistContinuousSimTime; import nl.tudelft.simulation.dsol.simtime.dist.DistContinuousTime; import nl.tudelft.simulation.dsol.simulators.DEVSSimulatorInterface; import nl.tudelft.simulation.dsol.simulators.SimulatorInterface; import nl.tudelft.simulation.dsol.statistics.Tally; import nl.tudelft.simulation.jstats.distributions.DistConstant; import nl.tudelft.simulation.jstats.distributions.DistDiscreteConstant; import nl.tudelft.simulation.jstats.distributions.DistExponential; import nl.tudelft.simulation.jstats.streams.MersenneTwister; import nl.tudelft.simulation.jstats.streams.StreamInterface; /** * The M/M/1 example as published in Simulation Modeling and Analysis by A.M. Law & W.D. Kelton section 1.4 and 2.4. *

* Copyright (c) 2002-2018 Delft University of Technology, Jaffalaan 5, 2628 BX Delft, the Netherlands. All rights * reserved. See for project information * https://simulation.tudelft.nl. The DSOL project is distributed under a three-clause BSD-style license, which can * be found at * https://simulation.tudelft.nl/dsol/3.0/license.html. *

* @author Peter Jacobs */ public class WebMM1Queue41Model implements DSOLModel.TimeDouble { /** The default serial version UID for serializable classes. */ private static final long serialVersionUID = 1L; /** the simulator. */ private DEVSSimulatorInterface.TimeDouble devsSimulator; /** tally dN. */ @SuppressWarnings("checkstyle:visibilitymodifier") Tally dN; /** tally qN. */ @SuppressWarnings("checkstyle:visibilitymodifier") Tally qN; /** utilization uN. */ @SuppressWarnings("checkstyle:visibilitymodifier") Utilization uN; /** {@inheritDoc} */ @Override public final void constructModel(final SimulatorInterface simulator) throws SimRuntimeException { this.devsSimulator = (DEVSSimulatorInterface.TimeDouble) simulator; StreamInterface defaultStream = new MersenneTwister(); // The Generator Generator.TimeDouble generator = new Generator.TimeDouble(this.devsSimulator, Object.class, null); generator.setInterval(new DistContinuousTime.TimeDouble(new DistExponential(defaultStream, 1.0))); generator.setStartTime(new DistContinuousSimTime.TimeDouble(new DistConstant(defaultStream, 0.0))); generator.setBatchSize(new DistDiscreteConstant(defaultStream, 1)); generator.setMaxNumber(1000); // The queue, the resource and the release Resource resource = new Resource<>(this.devsSimulator, 1.0); // created a resource StationInterface queue = new Seize.TimeDouble(this.devsSimulator, resource); StationInterface release = new Release.TimeDouble(this.devsSimulator, resource, 1.0); // The server DistContinuousTime.TimeDouble serviceTime = new DistContinuousTime.TimeDouble(new DistExponential(defaultStream, 0.5)); StationInterface server = new Delay.TimeDouble(this.devsSimulator, serviceTime); // The flow generator.setDestination(queue); queue.setDestination(server); server.setDestination(release); // Statistics try { this.dN = new Tally<>("d(n)", this.devsSimulator, queue, Seize.DELAY_TIME); this.qN = new Tally<>("q(n)", this.devsSimulator, queue, Seize.QUEUE_LENGTH_EVENT); this.uN = new Utilization<>("u(n)", this.devsSimulator, server); } catch (Exception exception) { throw new SimRuntimeException(exception); } } /** {@inheritDoc} */ @Override public final SimulatorInterface.TimeDouble getSimulator() { return this.devsSimulator; } }