1 package org.sim0mq.demo.mm1;
2
3 import java.rmi.RemoteException;
4
5 import nl.tudelft.simulation.dsol.DSOLModel;
6 import nl.tudelft.simulation.dsol.SimRuntimeException;
7 import nl.tudelft.simulation.dsol.formalisms.Resource;
8 import nl.tudelft.simulation.dsol.formalisms.flow.Delay;
9 import nl.tudelft.simulation.dsol.formalisms.flow.Generator;
10 import nl.tudelft.simulation.dsol.formalisms.flow.Release;
11 import nl.tudelft.simulation.dsol.formalisms.flow.Seize;
12 import nl.tudelft.simulation.dsol.formalisms.flow.StationInterface;
13 import nl.tudelft.simulation.dsol.formalisms.flow.statistics.Utilization;
14 import nl.tudelft.simulation.dsol.simtime.SimTimeDouble;
15 import nl.tudelft.simulation.dsol.simtime.dist.DistContinuousSimTime;
16 import nl.tudelft.simulation.dsol.simtime.dist.DistContinuousTime;
17 import nl.tudelft.simulation.dsol.simulators.DEVSSimulatorInterface;
18 import nl.tudelft.simulation.dsol.simulators.SimulatorInterface;
19 import nl.tudelft.simulation.dsol.statistics.Tally;
20 import nl.tudelft.simulation.jstats.distributions.DistConstant;
21 import nl.tudelft.simulation.jstats.distributions.DistDiscreteConstant;
22 import nl.tudelft.simulation.jstats.distributions.DistExponential;
23 import nl.tudelft.simulation.jstats.streams.MersenneTwister;
24 import nl.tudelft.simulation.jstats.streams.StreamInterface;
25
26
27
28
29
30
31
32
33
34
35 public class MM1Queue41Model implements DSOLModel.TimeDouble
36 {
37
38 private static final long serialVersionUID = 1L;
39
40
41 private DEVSSimulatorInterface.TimeDouble devsSimulator;
42
43
44 @SuppressWarnings("checkstyle:visibilitymodifier")
45 Tally<Double, Double, SimTimeDouble> dN;
46
47
48 @SuppressWarnings("checkstyle:visibilitymodifier")
49 Tally<Double, Double, SimTimeDouble> qN;
50
51
52 @SuppressWarnings("checkstyle:visibilitymodifier")
53 Utilization uN;
54
55
56 public double iat = Double.NaN;
57
58
59 public double serviceTime = Double.NaN;
60
61
62 public long seed = 1;
63
64
65
66 @Override
67 public final void constructModel(final SimulatorInterface<Double, Double, SimTimeDouble> simulator)
68 throws SimRuntimeException, RemoteException
69 {
70 if (Double.isNaN(this.iat))
71 {
72 throw new SimRuntimeException("Parameter iat not defined for model");
73 }
74 if (Double.isNaN(this.serviceTime))
75 {
76 throw new SimRuntimeException("Parameter servicetime not defined for model");
77 }
78
79 this.devsSimulator = (DEVSSimulatorInterface.TimeDouble) simulator;
80 StreamInterface defaultStream = new MersenneTwister(this.seed);
81
82
83 Generator.TimeDouble generator = new Generator.TimeDouble(this.devsSimulator, Object.class, null);
84 generator.setInterval(new DistContinuousTime.TimeDouble(new DistExponential(defaultStream, this.iat)));
85 generator.setStartTime(new DistContinuousSimTime.TimeDouble(new DistConstant(defaultStream, 0.0)));
86 generator.setBatchSize(new DistDiscreteConstant(defaultStream, 1));
87 generator.setMaxNumber(1000);
88
89
90 Resource<Double, Double, SimTimeDouble> resource = new Resource<>(this.devsSimulator, 1.0);
91
92
93 StationInterface queue = new Seize.TimeDouble(this.devsSimulator, resource);
94 StationInterface release = new Release.TimeDouble(this.devsSimulator, resource, 1.0);
95
96
97 DistContinuousTime.TimeDouble serviceTimeDistribution =
98 new DistContinuousTime.TimeDouble(new DistExponential(defaultStream, this.serviceTime));
99 StationInterface server = new Delay.TimeDouble(this.devsSimulator, serviceTimeDistribution);
100
101
102 generator.setDestination(queue);
103 queue.setDestination(server);
104 server.setDestination(release);
105
106
107 this.dN = new Tally<>("d(n)", this.devsSimulator, queue, Seize.DELAY_TIME);
108 this.qN = new Tally<>("q(n)", this.devsSimulator, queue, Seize.QUEUE_LENGTH_EVENT);
109 this.uN = new Utilization("u(n)", this.devsSimulator, server);
110 }
111
112
113 @Override
114 public final SimulatorInterface.TimeDouble getSimulator()
115 {
116 return this.devsSimulator;
117 }
118 }