@@ -21,36 +21,21 @@ You should have received a copy of the GNU General Public License
21
21
22
22
namespace SimSharp . Samples {
23
23
public class MM1Queueing {
24
- private Simulation env ;
25
- private Resource server ;
26
- private ContinuousStatistics wip , utilization ;
27
- private DiscreteStatistics waitingtime , leadtime ;
28
24
private static readonly TimeSpan OrderArrivalTime = TimeSpan . FromMinutes ( 3.33 ) ;
29
25
private static readonly TimeSpan ProcessingTime = TimeSpan . FromMinutes ( 2.5 ) ;
30
26
31
- private IEnumerable < Event > Source ( ) {
27
+ private IEnumerable < Event > Source ( Simulation env , Resource server ) {
32
28
while ( true ) {
33
29
yield return env . TimeoutExponential ( OrderArrivalTime ) ;
34
- env . Process ( Order ( ) ) ;
30
+ env . Process ( Order ( env , server ) ) ;
35
31
}
36
32
}
37
33
38
- private IEnumerable < Event > Order ( ) {
39
- var start = env . Now ;
40
- wip . Increase ( ) ;
41
- var req = server . Request ( ) ;
42
- yield return req ;
43
- utilization . UpdateTo ( server . InUse / ( double ) server . Capacity ) ;
44
- waitingtime . Add ( ( env . Now - start ) . TotalMinutes ) ;
45
- yield return env . Process ( Produce ( req ) ) ;
46
- wip . Decrease ( ) ;
47
- leadtime . Add ( ( env . Now - start ) . TotalMinutes ) ;
48
- }
49
-
50
- private IEnumerable < Event > Produce ( Request req ) {
51
- yield return env . TimeoutExponential ( ProcessingTime ) ;
52
- yield return server . Release ( req ) ;
53
- utilization . UpdateTo ( server . InUse / ( double ) server . Capacity ) ;
34
+ private IEnumerable < Event > Order ( Simulation env , Resource server ) {
35
+ using ( var req = server . Request ( ) ) {
36
+ yield return req ;
37
+ yield return env . TimeoutExponential ( ProcessingTime ) ;
38
+ }
54
39
}
55
40
56
41
public void Simulate ( ) {
@@ -61,12 +46,11 @@ public void Simulate() {
61
46
var analyticLeadtime = 1 / ( mu - lambda ) ;
62
47
var analyticWaitingtime = rho / ( mu - lambda ) ;
63
48
64
- env = new Simulation ( randomSeed : 1 ) ;
65
- server = new Resource ( env , capacity : 1 ) ;
66
- wip = new ContinuousStatistics ( env ) ;
67
- utilization = new ContinuousStatistics ( env ) ;
68
- leadtime = new DiscreteStatistics ( ) ;
69
- waitingtime = new DiscreteStatistics ( ) ;
49
+ var env = new Simulation ( randomSeed : 1 , defaultStep : TimeSpan . FromMinutes ( 1 ) ) ;
50
+ var utilization = new TimeSeriesMonitor ( env ) ;
51
+ var wip = new TimeSeriesMonitor ( env , collect : true ) ;
52
+ var leadtime = new SampleMonitor ( collect : true ) ;
53
+ var waitingtime = new SampleMonitor ( collect : true ) ;
70
54
71
55
env . Log ( "Analytical results of this system:" ) ;
72
56
env . Log ( "\t Utilization.Mean\t WIP.Mean\t Leadtime.Mean\t WaitingTime.Mean" ) ;
@@ -90,22 +74,37 @@ public void Simulate() {
90
74
. Add ( "WaitingTime" , waitingtime , Report . Measures . Mean )
91
75
. SetOutput ( env . Logger )
92
76
. SetSeparator ( "\t " )
93
- . SetFinalUpdate ( withHeaders : true ) // creates a summary of the means at the end
77
+ . SetFinalUpdate ( withHeaders : false ) // creates a summary of the means at the end
94
78
. Build ( ) ;
95
79
96
- env . Log ( "== m/m/1 queuing system (run 1) ==" ) ;
97
- env . Process ( Source ( ) ) ;
98
- env . Run ( TimeSpan . FromDays ( 365 ) ) ;
99
-
100
- env . Reset ( 2 ) ; // reset environment
101
- server = new Resource ( env , capacity : 1 ) ; // reset resources
102
- wip . Reset ( ) ; // reset statistics
103
- utilization . Reset ( ) ;
104
- leadtime . Reset ( ) ;
80
+ env . Log ( "Simulated results of this system:" ) ;
81
+ env . Log ( "" ) ;
82
+ summary . WriteHeader ( ) ; // write the header just once
83
+
84
+ for ( var i = 0 ; i < 5 ; i ++ ) {
85
+ env . Reset ( i + 1 ) ; // reset environment
86
+ utilization . Reset ( ) ; // reset monitors
87
+ wip . Reset ( ) ;
88
+ leadtime . Reset ( ) ;
89
+ waitingtime . Reset ( ) ;
90
+ var server = new Resource ( env , capacity : 1 ) {
91
+ Utilization = utilization ,
92
+ WIP = wip ,
93
+ LeadTime = leadtime ,
94
+ WaitingTime = waitingtime ,
95
+ } ;
96
+
97
+ env . Process ( Source ( env , server ) ) ;
98
+ env . Run ( TimeSpan . FromDays ( 365 ) ) ;
99
+ }
105
100
106
- env . Log ( "== m/m/1 queuing system (run 2) ==" ) ;
107
- env . Process ( Source ( ) ) ;
108
- env . Run ( TimeSpan . FromDays ( 365 ) ) ;
101
+ env . Log ( "" ) ;
102
+ env . Log ( "Detailed results from the last run:" ) ;
103
+ env . Log ( "" ) ;
104
+ env . Log ( utilization . Print ( "Utilization" ) ) ;
105
+ env . Log ( wip . Print ( "WIP" ) ) ;
106
+ env . Log ( leadtime . Print ( "Lead time" ) ) ;
107
+ env . Log ( waitingtime . Print ( "Waiting time" ) ) ;
109
108
}
110
109
}
111
110
}
0 commit comments