Computer Simulation Techniques: The Definitive Introduction!
Computer Simulation Techniques: The Definitive Introduction!
2
=
!
k
n
( f
i
"
n
k
)
2
i=1
k
# ,
and it has k-1 degrees of freedom. The null hypothesis is that the generated random
numbers are uniformly distributed in [0,1]. This hypothesis is rejected if the computed
value of
2
is greater than the one obtained from the chi-square tables for k-1 degrees of
freedom and level of significance.
The chi-square tables can be found in any introductory statistics book, and of
course, the function to generate
2
values can be found in software packages.
46 Computer Simulation Techniques
Problems
1. Consider the multiplicative congruential method for generating random digits.
Assuming that m=10, determine the length of the cycle for each set of values of a
and x
0
given below.
(a) a = 2, x
0
=1, 3, 5.
(b) a = 3, x
0
= 1, 2, 5.
Computer Assignments
1. Use the statistical tests described in section 2.7, to test a random number generator
available on your computer.
2. This is a more involved exercise! Implement the random number generators described
in this chapter, and then test them using the statistical tests described in section 2.7.
Measure the execution time for each generator for the same output size. Present your
results in a table that gives the execution speed of each generator and whether it has
failed or passed each statistical test. Discuss your results. What is your favorite
generator for your simulation assignments?
CHAPTER 3:
GENERATING STOCHASTIC VARIATES
3.1 Introduction
In the previous Chapter we examined techniques for generating random numbers. In this
Chapter, we discuss techniques for generating random numbers with a specific
distribution. Random numbers following a specific distribution are called random
variates or stochastic variates. Pseudo-random numbers which are uniformly distributed
are normally referred to as random numbers. Random numbers play a major role in the
generation of stochastic variates.
There are many techniques for generating random variates. The inverse
transformation method is one of the most commonly used techniques. This is discussed
below. Sections 3.3 and 3.4 give methods for generating stochastic variates from known
continuous and discrete theoretical distributions. Section 3.5 discusses methods for
obtaining stochastic variates from empirical distributions. Section 3.6 describes an
alternative method for stochastic variates generation known as the rejection method.
3.2 The inverse transformation method
This method is applicable only to cases where the cumulative density function can be
inversed analytically. Assume that we wish to generate stochastic variates from a
probability density function (pdf) f(x). Let F(x) be its cumulative density function. We
note that F(x) is defined in the region [0,1]. We explore this property of the cumulative
density function to obtain the following simple stochastic variates generator.
48 Computer Simulation Techniques
We first generate a random number r which we set equal to F(x). That is, F(x) =
r. The quantity x is then obtained by inverting F. That is, x = F
-1
(r), where F
-1
(r)
indicates the inverse transformation of F.
As an example, let us assume that we want to generate random variates with
probability density function
f(x) = 2x, 0 <_ x <_ 1.
A graphical representation of this probability density function is given in figure 3.1a. We
first calculate the cumulative density function F(x). We have
F(x) =
0
x
2tdt
= x
2
, 0 <_ x <_ 1.
Let r be a random number. We have
r = x
2,
or
x = r .
2
f(x)
0
x
1
F(x)
r
0
x
1
1
Figure 3.1a: pdf f(x).
Figure 3.1b: Inversion of F(x).
Generating stochastic variates 49
This inversion is shown graphically in figure 3.1b.
In sections 3 and 4 we employ the inverse transformation method to generate
random variates from various well-known continuous and discrete probability
distributions.
3.3 Sampling from continuous-time probability distributions
In this section, we use the inverse transformation method to generate variates from a
uniform distribution, an exponential distribution, and an Erlang distribution. We also
describe two techniques for generating variates from the normal distribution.
3.3.1 Sampling from a uniform distribution
The probability density function of the uniform distribution is defined as follows:
f(x) =
|
|
|
| 1
b-a
a < x < b
0 otherwise
,
and it is shown graphically in figure 3.2.
f(x)
a b
1
b-a
Figure 3.2: The uniform distribution.
The cumulative density function is:
50 Computer Simulation Techniques
F(x) =
a
x
1
b-a
dt =
!
x " a
b " a
.
The expectation and variance are given by the following expressions:
E(X) =
!
f(x)xdx
a
b
"
=
!
1
b "a
xdx
a
b
#
=
b+a
2
Var(X) =
!
(x - E(X))
2
F(x)dx
a
b
"
=
(b-a)
2
12
.
The inverse transformation method for generating random variates is as follows.
r = F(x) =
x-a
b-a
or
x = a + (b - a)r.
3.3.2 Sampling from an exponential distribution
The probability density function of the exponential distribution is defined as follows:
f(x) = ae
-ax
, a > 0, x >_ 0.
The cumulative density function is:
F(x) =
!
f(t)dt
0
x
"
=
!
ae
"at
tdt
0
x
#
= 1 - e
-ax
.
The expectation and variance are given by the following expressions:
Generating stochastic variates 51
E(X) =
!
aet
"at
dt
0
#
$
dt =
1
a
Var(X) =
!
(t "E(X))
2
e
"at
tdt
0
#
$
dt =
1
a
2
.
The inverse transformation method for generating random variates is as follows:
r = F(x) = 1 - e
-ax
or
1 - r = e
-ax
or
x = -
1
a
log(1-r) = - E(x)log(l-r).
Since 1-F(x) is uniformly distributed in [0,1], we can use the following short-cut
procedure
r = e
-ax
,
and therefore,
x = -
1
a
log r.
3.3.3 Sampling from an Erlang distribution
In many occasions an exponential distribution may not represent a real life situation. For
example, the execution time of a computer program, or the time it takes to manufacture
an item, may not be exponentially distributed. It can be seen, however, as a number of
exponentially distributed services which take place successively. If the mean of each of
52 Computer Simulation Techniques
these individual services is the same, then the total service time follows an Erlang
distribution, as shown in figure 3.3.
!! 1/a 1/a 1/a
Figure 3.3 : The Erlang distribution.
The Erlang distribution is the convolution of k exponential distributions having
the same mean 1/a. An Erlang distribution consisting of k exponential distributions is
referred to as E
k
. The expected value and the variance of a random variable X that
follows the Erlang distribution are:
E(X) =
k
a
and
Var(X) =
k
a
2
.
Erlang variates may be generated by simply reproducing the random process on
which the Erlang distribution is based. This can be accomplished by taking the sum of k
exponential variates, x
1
, x
2
, ..., x
k
with identical mean 1/a. We have
x =
i=1
k
x
i
= -
1
a
i=1
k
log r
i
=
-1
a
\
|
|
[
)
j
j
log
i=1
k
r
i
.
Generating stochastic variates 53
3.3.4 Sampling from a normal distribution
A random variable X with probability density function
f(x) =
1
2
e
-
1
2
(x-)
2
2
, - < x < +,
where is positive, is said to have a normal distribution with parameters and . The
expectation and variance of X are and
2
respectively. If =0 and =1, then the normal
distribution is known as the standard normal distribution and its probability density
function is
f(x) =
1
2
e
-
1
2
x
2
, - < x < + .
If a random variable X follows a normal distribution with mean and variance
2
, then
the random variable Z defined as follows
Z =
X -
follows the standard normal distribution.
In order to generate variates from a normal distribution with parameters and ,
we employ the central limit theorem. (This approach is named after this particular
theorem.) The central limit theorem briefly states that if x
1
, x
2
, ... ,x
n
are n independent
random variates, each having the same probability distribution with E(X
i
)= and
Var(X
i
)=
2
, then the sum X
i
= X
1
+X
2
+...+X
n
approaches a normal distribution as n
becomes large. The mean and variance of this normal distribution are:
E(X
i
) = n
54 Computer Simulation Techniques
Var (X
i
) = n
2
.
The procedure for generating normal variates requires k random numbers r
1
, r
2
,...
,r
k
. Since each r
i
is a uniformly distributed random number over the interval [0 ,1], we
have that
E(r
i
) =
a+b
2
=
1
2
Var(r
i
) =
(b-a)
2
12
=
1
12
.
Using the Central Limit theorem, we have that the sum r
i
of these k random numbers
approaches the normal distribution. That is
r
i
~ N
\
|
[
)
j
k
2
,
k
12
,
or
r
i
- k/2
k/ 12
~ N(0, 1). (3.1)
Now, let us consider the normal distribution with parameters and from which we
want to generate normal variates. Let x be such a normal variate. Then
x -
~ N(0,1). (3.2)
Equating (3.1) and (3.2) gives
Generating stochastic variates 55
x -
=
r
i
- k/2
k/ 12
,
or
x =
12
k
\
[
)
r
i
-
k
2
+ .
This equation provides us with a simple formula for generating normal variates
with a mean and standard deviation . The value of k has to be very large, since the
larger it is the better the accuracy. Usually, one has to balance accuracy against
efficiency. The smallest value recommended is k=10. (In fact, one can observe that k=12
has computational advantages).
An alternative approach to generating normal variates (known as the direct
approach) is the following. Let r
1
and r
2
be two uniformly distributed independent
random numbers. Then
x
1
= (-2 log
e
r
1
)
1
2
cos 2r
2
x
2
= (-2 log
e
r
1
)
1
2
sin 2r
2
are two random variates from the standard normal distribution. This method produces
exact results and the speed of calculations compares well with the Central Limit approach
subject to the efficiency of the special function subroutines.
3.4 Sampling from discrete-time probability distributions
In this section, we use the inverse transformation method to generate variates from a
geometric distribution. Also, we describe a technique for sampling from a binomial
distribution, and a technique for sampling from a Poisson distribution.
56 Computer Simulation Techniques
3.4.1 Sampling from a geometric distribution
Consider a sequence of independent trials, where the outcome of each trial is either a
failure or a success. Let p and q be the probability of a success and failure respectively.
We have that p+q=1. The random variable that gives the number of successive failures
that occur before a success occurs follows the geometric distribution. The probability
density function of the geometric distribution is
p(n) = pq
n
, n = 0,1,2, . . .,
and its cumulative probability density function is
F(n) =
s=0
n
pq
s
, n = 0, 1, 2, . . .
The expectation and the variance of a random variable following the geometric
distribution are:
E(X) =
p
q
Var(X) =
p
q
2
.
The generation of geometric variates using the inverse transformation method can
be accomplished as follows.
F(n) =
s=0
n
pq
s
Generating stochastic variates 57
= p
s=0
n
q
s
= p
!
1"q
n+1
1"q
.
Since p = 1 - q, we have that F(n) = 1-q
n+1
. From this expression we obtain that 1-F(n)
= q
n+1
. We observe that 1-F(n) varies between 0 and 1. Therefore, let r be a random
number, then we have
r = q
n+1
or
log r = (n+1) log q
or
n =
log r
log q
- 1.
Alternatively, since (1-F(n))/q=q
n
, and (1-F(n))/q varies between 0 and 1, we have
r = q
n
or
n =
log r
log q
.
3.4.2 Sampling from a binomial distribution
Consider a sequence of independent trials (Bernoulli trials). Let p be the probability of
success and q=1-p the probability of a failure. Let X be a random variable indicating the
number of successes in n trials. Then, this random variable follows the Binomial
distribution. The probability density function of X is
58 Computer Simulation Techniques
p (k) =
\
[
)
n
k
p
k
q
n-k
, k = 0, 1, 2, . . .
The expectation and variance of the binomial distribution are:
E(X) = np
Var(X) = npq.
We can generate variates from a binomial distribution with a given p and n as
follows. We generate n random numbers, after setting a variable k
0
equal to zero. For
each random number r
i
, i=1, 2, ..., n, a check is made, and the variable k
i
is incremented
as follows:
k
i
=
|
|k
i-1
+ 1 if r
i
< p
k
i-1
if r
i
> p
The final quantity k
n
is the binomial variate. This method for generating variates is
known as the rejection method. This method is discussed in detail below in section 6.
3.4.3 Sampling from a Poisson distribution
The Poisson distribution models the occurrence of a particular event over a time period.
Let be the average number of occurrences during a unit time period. Then, the number
of occurrence x during a unit period has the following probability density function
p(n) = e
-
(
n
/n!), n = 0, 1, 2, . . .
It can be demonstrated that the time elapsing between two successive occurrences
of the event is exponentially distributed with mean 1/, i.e., f(t) = e
-t
. One method for
Generating stochastic variates 59
generating Poisson variates involves the generation of exponentially distributed time
intervals t
1
, t
2
, t
3
,... with an expected value equal to 1/. These intervals are accumulated
until they exceed 1, the unit time period. That is,
!
t
i
i=1
n
"
< 1 <
!
t
i
i=1
n+1
"
.
The stochastic variate n is simply the number of events occurred during a unit time
period. Now, since t
i
= -
1
logr
i
, n can be obtained by simply summing up random
numbers until the sum for n+1 exceeds the quantity e
-
. That is, n is given by the
following expression:
i=0
n
r
i
> e
-
>
i=0
n+1
r
i
.
3.5 Sampling from an empirical probability distribution
Quite often an empirical probability distribution may not be approximated satisfactorily
by one of the well-known theoretical distributions. In such a case, one is obliged to
generate variates which follow this particular empirical probability distribution. In this
section, we show how one can sample from a discrete or a continuous empirical
distribution.
3.5.1 Sampling from a discrete-time probability distribution
Let X be a discrete random variable, and let p(X = i) = p
i
, where p
i
is calculated from
empirical data. Let p(Xi) = P
i
be the cumulative probability. Random variates from this
probability distribution can be easily generated as follows. Now let r be a random
number. Let us assume that r falls between P
2
and P
3
(see figure 3.4). Then, the random
variate x is equal to 3. In general, if P
i-1
<r<P
i
then x=i. This method is based on the fact
60 Computer Simulation Techniques
that p
i
=P
i
-P
i-1
and that since r is a random number, it will fall in the interval (P
i
, P
i-1
)
p
i
% of the time.
0 1 2 3 ! n
r
P
1
2
P
3
P
1
x
Figure 3.4: Sampling from an empirical discrete probability distribution.
As an example, let us consider the well-known newsboy problem. Let X be the
number of newspapers sold by a newsboy per day. From historical data we have the
following distribution for X.
X 1 2 3 4 5
f(x) 0.20 0.20 0.30 0.15 0.15
The cumulative probability distribution is:
X 1 2 3 4 5
f(x) 0.20 0.40 0.70 0.85 1
The random variate generator can be summarized as follows:
1. Sample a random number r.
Generating stochastic variates 61
2. Locate the interval within which r falls in order to determine the random
variate x.
If 0.85 < r 1.00 then x = 5
If 0.70 < r 0.85 then x = 4
If 0.40 < r 0.70 then x = 3
If 0.20 < r 0.40 then x = 2
Otherwise then x = 1
3.5.2 Sampling from a continuous-time probability distribution
Let us assume that the empirical observations of a random variable X can be summarized
into the histogram shown in figure 3.5. From this histogram, a set of values (x
i
, f(x
i
)) can
be obtained,
f(x )
x
1
f(x )
f(x )
2
3
f(x )
4
f(x )
5
f(x )
6
f(x )
7
1 2 3 4 5 6 7
x x x x x x
Figure 3.5: Histogram of a random variable X.
where x
i
is the midpoint of the ith interval, and f(x
i
) is the length of the ith rectangle.
Using this set of values we can approximately construct the cumulative probability
distribution shown in figure 3..6, where F(x
i
) =
1k1
f(x
k
). The cumulative distribution
is assumed to be monotonically increasing within each interval [F(x
i-1
), F(x
i
)].
62 Computer Simulation Techniques
x
F(x )
1
F(x )
2
F(x )
3
F(x )
4
F(x )
5
F(x )
6
F(x )
7
1 2 3 4 5 6 7
x x x x x x
Figure 3.6: The cumulative distribution.
Now, let r be a random number and let us assume that F(x
i-1
)<r<F(x
i
). Then, using linear
interpolation, the random variate x can be obtained as follows:
x = x
i-1
+ (x
i
- x
i-1
)
r - F(x
i-1
)
F(x
i
) - F(x
i-1
)
,
where x
i
is the extreme right point of the ith interval.
x
1 2 3 4 n
x x x x !!
f(x)
f(x )
1
2
f(x )
3
f(x )
4
f(x )
n
f(x )
Figure 3.7: "Discretizing" the probability density function.
Generating stochastic variates 63
This approach can be also used to generate stochastic variates from a known
continuous probability distribution f(x). We first obtain a set of values (x
i
, f(x
i
)) as shown
in figure 3.7. This set of values is then used in place of the exact probability density
function. (This is known as "discretizing" the probability density function.) Using this set
of values we can proceed to construct the cumulative probability distribution and then
obtain random variates as described above. The accuracy of this approach depends on
how close the successive x
i
points are.
c
a b
f(x)
1
Figure 3.8: Normalized f(x)
3.6 The Rejection method
The rejection technique can be used to generate random variates, if f(x) is bounded and x
has a finite range, say a x b. The following steps are involved:
Normalize the range of f(x) by a scale factor c so that cf(x) 1, a x b. (See
figure 3.8)
Define x as a linear function of r, i.e. x = a + (b-a) r, where r is a random number.
Generate pairs of random numbers (r
1
, r
2
).
Accept the pair and use x = a + (b-a)r
1
as a random variate whenever the pair
satisfies the relationship r
2
cf(a + (b-a)r
1
), i.e. the pair (x,r
2
) falls under the
curve in figure 3.8.
The idea behind this approach is that the probability of r
2
being less than or equal to
cf(x) is p[r
2
cf(x)] = cf(x). Consequently, if x is chosen at random from the range (a,b)
64 Computer Simulation Techniques
and then rejected if r
2
>cf(x), the probability density function of the accepted x's will be
exact.
We demonstrate the rejection method by giving two different examples. The first
example deals with random variate generation, and the second example deals with a
numerical integration problem.
Example 1:
Use the rejection method to generate random variates with probability density function
f(x)=2x, 0x1.
This can be accomplished using the following procedure:
1. Select c such that df(x)1, i.e. c = 1/2.
2. Generate r
1
, and set x = r
1
.
3. Generate r
2
. If r
2
< cf(r
1
) = (1/2)2r
1
= r
1
then accept r
2
, otherwise, go back
to step 2.
Example 2:
Use the rejection method to compute the area of the first quadrant of a unit circle.
We first note that any pair of uniform numbers (r
1
, r
2
) defined over the unit
interval corresponds to a point within the unit square. A pair (r
1
, r
2
) lies on the
circumference if
r
2
1
+r
2
2 = 1.
The numerical integration can be accomplished by carrying out the following two steps
for a large number of times:
1. Generate a pair of random numbers (r
1
, r
2
).
2. If r
2
< f(r
1
), , where f(r
1
) =
!
1" r
1
2
, then r
2
is under (or on) the curve and
hence the pair (r
1
, r
2
) is accepted. Otherwise, it is rejected.
Generating stochastic variates 65
The area under the curve can be obtained as the ratio
area =
total number of acceptable pairs
total number of generated pairs
.
The rejection method is not very efficient when c(b-a) becomes very large. The
method of mixtures can be used, whereby the distribution is broken into pieces and the
pieces are then sampled in proportion to the amount of distribution area each contains.
This process is identical to the rejection method for each piece of the distribution, plus a
straightforward sampling of data.
3.7 Monte Carlo methods
Monte Carlo methods comprise that branch of experimental mathematics which is
concerned with experiments on random numbers. Monte Carlo methods are usually
associated with problems of theoretical interest, as opposed to the simulation methods
described in this book, otherwise known as direct simulation. Unlike direct simulation
techniques, Monte Carlo methods are not concerned with the passage of time. Every
Monte Carlo computation that leads to quantitative results may be regarded as estimating
the value of a multiple integral.
The previously demonstrated rejection method for calculating the integral of a
function is an example of Monte Carlo, known as hit-or-miss Monte Carlo. An alternative
method for calculating an integral of a function is the crude Monte Carlo method. Let us
assume that we wish to calculate the one-dimensional integral
=
0
1
f(x)dx .
Let
1
,
2
,...
n
, be random numbers between 0 and 1. Then, the quantities f
i
= f(
i
) are
independent random variates with expectation . Therefore,
66 Computer Simulation Techniques
f
_
=
1
n
i=1
n
f
i
is an unbiased estimator of . Its variance can be estimated using the expression
s
2
=
1
n-1
i=1
n
(f
i
- f
_
)
2
.
Thus, the standard error of f
_
is s/ n .
The above technique of evaluating is based on the following idea. In general, if
X is a random variable that takes values in [0,1] and f(x) is a function of this random
variable, then
E(f(x) =
0
1
f(x)g(x)dx
where g(x) is the density function of X. Assuming that X is uniformly distributed in (0,1),
i.e. g(X) = 1, we obtain
E(f(x)) =
0
1
f(x)dx .
Thus, f
_
is an unbiased estimate of E(f(X)).
This technique is more efficient than the technique mentioned in the previous
section.
Problems
1. Use the inverse transformation method to generate random variates with
probability density function
Generating stochastic variates 67
f(x) =
|
|
3x
2
, 0 x 1
0 , otherwise
2. Apply the inverse transformation method and devise specific formulae that yield
the value of variate x given a random number r. (Note that f(x) below needs to be
normalized.)
f(x) =
!
5x 0 " x " 4
x #2 4 < x "10
$
%
&
3. Set up a procedure to generate stochastic variates from
f(x) =
!
x 0 " x "1/2
1# x 1/2 < x "1
$
%
&
4. A customer in a bank may receive service which has an Erlang distribution E
3
(each phase with mean 10) or an Erlang distribution E
4
(each phase with mean 5)
with probability 0.4 and 0.6 respectively. Set-up a procedure to generate random
variates of a customer's service.
5. Use the rejection method to generate stochastic variates from
f(x) = (x-3)
4
, 0 x 10
6. Modify the procedure for generating stochastic variates from an Erlang
distribution, in order to generate variates from a Coxian distribution. A Coxian
distribution consists of a series of exponential distributions, each with a different
mean, and it has the following structure:
68 Computer Simulation Techniques
b
1
2 n
b
a
1
a
2
1
2
...
After receiving an exponential service time with parameter
1
, there is a
probability b
1
(=1-a
1
)
of departing, or a probability a
1
of receiving another
exponential service time with parameter
2
, and so on until the kth exponential
service is received.
Computer Assignments
1. Test statistically one of the stochastic variates generator discussed in this Chapter.
2. Consider the machine interference problem. Change your simulation program so
that the operational time and the repair time of a machine are exponentially
distributed with the same means as before. Make sure that your clocks are defined
as real variables. Run your simulation model as before. Each time an event
occurs, print out a line of output to show the new value of the clocks and the other
relevant parameters.
3. Consider the token-based access scheme. Change your simulation program so that
the inter-arrival times are exponentially distributed with the same means as
before. The switch over time and the time period T remain constant as before. The
packet transmission time is calculated as follows. We assume that 80% of the
transmitted packets are due to interactive traffic (i.e. computer/terminal type of
traffic), and 20% of the transmitted packets are due to file transfer. Packets due to
interactive traffic tend to be short, whereas packets due to file transfers tend to be
large. Consequently, we will assume that the time to transmit an interactive packet
is exponentially distributed with mean 2.5, and the time to transmit a file transfer
packet is exponentially distributed with mean 20.
Generating stochastic variates 69
Make sure that your clocks are defined as real variables. Run your simulation
model as before. Each time an event occurs, print out a line of output to show the
new value of the clocks and the other relevant parameters
4. Consider the two-stage manufacturing system. Change your simulation program
so that the inter-arrival, service, operational, and repair times are all exponentially
distributed. Make sure that your clocks are defined as real variables. Run your
simulation model as before. Each time an event occurs, print out a line of output
to show the new value of the clocks and the other relevant parameters.
Solutions to the above problems
1.
0
1
f(x) dx =
0
1
3x dx = 3
x
3
3
|
|
|1
0
= 3
1
3
= 1
F(x) =
0
x
3t
2
dt = 3
t
3
3
|
|
|x
0
=
3x
3
3
= x
3
Hence, r = x
3
or x =
3
r .
2. F(x) =
0
x
stdt ,x < 4
= 5
t
2
2
|
|
|x
0
=
5
2
x
2
F(x) =
0
4
5tdt =
4
x
(t - 2)dt ,x > 4
= 5
t
2
2
|
|
|4
0
+
t
2
2
- 2t
|
|
|x
4
= 40 +
x
2
2
- 2x - \
[
)
16
2
- 8
70 Computer Simulation Techniques
F(x) =
|
|
|
|
5
2
x
2
0 x 4
40 +
x
2
2
- 2x 4 < x 10
In order to normalize f(x), we have
0
4
5xdx + =
4
10
(x - 2)dx
or
=
5
2
x
2
|
|
|4
0
+
x
2
2
- 2x
|
|
|10
4
=
5
2
16 +
100
2
= 2 x 10 -
42
2
+ 2 - 4
Thus,
F(x) =
|
|
|
|
1
70
5
2
x
2
0 x 4
1
70
\
|
[
)
j
40 +
x
2
2
- 2x 4 < x 10
Procedure:
Draw a random number r.
If r <
40
70
then r =
5
140
x
2
or x =
140
5
xr .
Otherwise, r =
1
70
\
|
[
)
j
40 +
x
2
2
- 2x , from which one can solve for x.
5. Step 1. Use calculus to establish the bounds of f(x)
3
1 2 3
7
10
4
4
Generating stochastic variates 71
Thus c = 1/7
4
Step 2:
2.1 generate r
1
. Then 10r
1
.
2.2 generate r
2
.
if r
2
<
1
7
4
f(10r
1
) then accept 10r
1
as a stochastic variate.
Otherwise go back to 2.1.
CHAPTER 4:
SIMULATION DESIGNS
4.1 Introduction
In this Chapter, we examine three different designs for building simulation models. The
first two designs are: a) event-advance and b) unit-time advance. Both these designs are
event-based but utilize different ways of advancing the time. The third design is activity-
based. The event-advance design is probably the most popular simulation design.
4.2 Event-advance design
This is the design employed in the three examples described in Chapter 1. The basic idea
behind this design is that the status of the system changes each time an event occurs.
During the time that elapses between two successive events, the system's status remains
unchanged. In view of this, it suffices to monitor the changes in the system's status. In
order to implement this idea, each event is associated with a clock. The value of this
clock gives the time instance in the future that this event will occur. The simulation
model, upon completion of processing an event, say at time t
1
, regroups all the possible
events that will occur in the future and finds the one with the smallest clock value. It then
advances the time, i.e., the master clock, to this particular time when the next event will
occur, say at time t
2
. It takes appropriate action as dictated by the occurrence of this
event, and then repeats the process of finding the next event (say at time t
3
). The
simulation model, therefore, moves through time by simply visiting the time instances at
which events occur. In view of this it is known as event-advance design.
74 Computer Simulation Techniques
In the machine interference problem, described in section 3.1 of Chapter 1, there
are two types of events. That is, the event of an arrival at the repairman's queue, and the
event of a departure from the repairman's queue. These events are known as primary
events. Quite often the occurrence of a primary event may trigger off the creation of a
new event. For instance, the occurrence of an arrival at the repairman's queue may trigger
off the creation of a departure event if this arrival occurs at a time when the repairman is
idle. Such triggered events are known as conditional events. The basic approach of the
event-based design is shown in the flow chart in figure 4.1.
A
Find next
event
Advance
time
Take appropriate
action depending
on the type
of event
Any
conditional
events
?
A
no
yes
Create a new
event(s)
Future
event
list
A
Future
event
list
Figure 4.1: The event-advance simulation design.
Simulation designs 75
4.3 Future event list
Let us assume that a simulation model is currently at time t. The collection of all events
scheduled to occur in the future, i.e., events with clock greater than t, is known as the
future event list. For each event scheduled to occur in the future, the list contains the
following information:
Time of occurrence (i.e., value of the event's clock)
Type of event
The event type is used in order to determine what action should be taken when the event
occurs. For instance, using the event type the program can determine which procedure to
call.
In the simulation examples described in section 3 of Chapter 1, there were only a
few events. For instance, in the case of the machine interference problem there were only
two: an arrival to the repairman's queue and a service-ending (departure) event. However,
when simulating complex systems, the number of events may be very large. In such
cases, finding the next event might require more than a few comparisons. Naturally, it is
important to have an efficient algorithm for finding the next event since this operation
may well account for a large percentage of the total computations involved in a
simulation program. The efficiency of this algorithm depends on how the event list is
stored in the computer. An event list should be stored in such a way so as to lend itself to
an efficient execution of the following operations.
Locating the next future event time and the associated event type.
Deleting an event from the list after it has occurred.
Inserting newly scheduled events in the event list.
Below we examine two different schemes for storing an event list. In the first
scheme, the event list is stored in a sequential array. In the second scheme, it is stored as
a linked list.
76 Computer Simulation Techniques
4.4 Sequential arrays
In this scheme, all future event times are stored sequentially in an array. The simplest
way to implement this, is to associate each event type with an integer number i. The clock
associated with this event is always stored in the ith location of the array. For instance, in
figure 4.2, the clock CL
1
for event type 1 is kept in the first location of the array, the
clock CL
2
for the event type 2 is kept in the second position of the array, and so on.
CL CL CL CL
1 2 3 n
! !
Figure 4.2: Future event list stored sequentially in an array.
Finding the next event is reduced to the problem of locating the smallest value in
an array. The following simple algorithm can be used to find the smallest value in an
array A.
1. minIndex 1
2. minValue A(1)
3. for i 1,n
4. if minValue A(i)
5. continue
6. else
4. minValue A(i)
5. minIndex i
Variable minIndex will eventually contain the location of the array with the smallest
value. If minIndex = i, then the next event is of type i and it will occur at time A(i).
An event is not deleted from the array after it has occurred. If an event is not valid
at a particular time, then its clock can be set to a very large value so that the above
Simulation designs 77
algorithm will never select it. A newly-scheduled event j is inserted in the list by simply
updating its clock given by A(j).
The advantage of storing an event list in a sequential array is that insertions of
new events and deletions of caused events can be done very easily (i.e., in constant time).
The time it takes to find the smallest number in the array depends, in general, on the
length of the array n (i.e., its complexity is linear in time). Locating the smallest number
in an array does not take much time if the array is small. However, if the array is large, it
becomes time consuming. To overcome these problems, one should store the future event
list in a linked list.
Figure 4.3: A linked list.
4.5 Linked lists
A linked list representation of data allows us to store each data element of the list in a
different part of the memory. Thus, we no longer need contiguous memory locations and
data can be dynamically added at runtime. In order to access the data elements in the list
in their correct order, we store along with a data element the address of the next data
element. This is a pointer that points to the location of the next data element. This pointer
is often referred to as a link. The data element and the link (or links) is generally referred
to as a node. In general, a node may consist of a number of data elements and links.
Linked lists are drawn graphically as shown in figure 4.3. Each node is represented by a
box consisting of as many compartments as the number of data elements and links stored
in the node. In the example given in figure 4.3, each node consists of two compartments,
one for storing a data element and the other for storing the pointer to the next node. The
pointer called head points to the first node in the list. If the linked list is empty, i.e., it
contains no nodes, then head is set to a special value called NULL indicating that it does
not point to any node and that the list ends there. The pointer of the last node is always
NULL
head
78 Computer Simulation Techniques
set to NULL indicating that this is the last node in the linked list structure. Due to the fact
that two successive nodes are connected by a single pointer, this data structure is known
as a singly linked list.
Figure 4.4: Future event list stored sequentially in a linked list.
A single linked list can be used to store a future event list as shown in figure 4.4.
Each node will consist of two data elements, namely a clock CL
i
showing the future time
of an event, and a value i indicating the type of event. The nodes are arranged in an
ascending order so that CL
i
CL
j
. . . CL
n
.
4.5.1 Implementation of a future event list as a linked list
The following basic operations are required in order to manipulate the future event list
Organize information such as data elements and pointers into a node.
Access a node through the means of a pointer.
Create a new node(s) or delete an existing unused node(s).
Add a node to the linked list.
Remove a node from the linked list.
a. Creating and deleting nodes
Let us first see how we can organize the data elements and pointers in a node. We shall
use the C programming language syntax to explain the implementation. A simple node
which saves event type, event clock and pointer to the next node can be represented as
follows:
head
NULL
CL
i
i CL
j
j
CL
n
n
Simulation designs 79
1. struct node {
2. int type;
3. float clock;
4. struct node* next;
5. }
The above structure is an example of a self referential structure since it contains a
pointer to a structure of the same type as itself which would be the next node. In addition
to the data elements (i.e. type and clock) shown above the structure can contain other
satellite data which may be specific to each event.
A new node must be dynamically allocated each time a new event is created.
Dynamic allocation of memory refers to reserving a number of bytes in the memory and
setting up a pointer to the first memory location of the reserved space. In C, the system
call malloc() is used to return such a pointer. Thus, a node can be dynamically allocated
as follows:
struct node* nodePtr = (struct node*) malloc (sizeof (struct node));
and the above call can be visualized as shown in figure 4.5:
Figure 4.5: Allocating memory for a node using malloc().
sizeof(struct node)
bytes
Memory
nodePtr
80 Computer Simulation Techniques
We use the cast (struct node*) to explicitly tell the compiler that the memory
location returned by this call will be pointed to by a variable which is a pointer to the
node structure that we have defined. Some C compilers may give warnings if such a cast
is not applied. We can modify the fields of the structure any time in the program as
follows:
nodePtr->type = ARRIVAL;
nodePtr->next = NULL;
A simple function can be written which creates a new node and set its fields using
the parameters passed to it.
b. Function to create a new node
Consider the following function that creates a new node and returns a pointer to it:
1. struct node* createNode(int type, float clock) {
2. struct node* nodePtr = (struct node*) malloc (sizeof (struct node));
3. nodePtr->type = type;
4. nodePtr->clock = clock;
5. nodePtr->next = NULL;
6.
7. return nodePtr;
8. }
In the above function we allocate memory for the node and assign values to the
node passed into the function as parameters. The last line returns a pointer to the created
node. The function can be called from the program as follows:
newNodePtr = createNode(ARRIVAL, MCL+5.5);
Simulation designs 81
where ARRIVAL is one of the predefined event types and MCL is be the master clock.
Thus, we are creating a new ARRIVAL event 5.5 units of time in the future. This
function can be visualized as shown in figure 4.6.
Figure 4.6: Result of calling createNode().
c. Deletion of a node
When a node is deleted the memory allocated from it must be returned to the system.
This can be easily done with the system call free() as follows:
free(nodePtr);
After the above call, nodePtr points to NULL.
d. Creating linked lists, inserting and removing nodes
Now comes the interesting part of creating a linked list, add nodes and removing nodes.
To access a linked list we need the pointer to the first node of the list, called a head of the
linked list. In C, the head can be defined as follows
struct node* head = NULL;
and the assignment can be visualized as shown in figure 4.7.
newNodePtr
type clock NULL
Node whose pointer
is returned by
createNode()
82 Computer Simulation Techniques
Figure 4.7: Result of calling createNode().
The linked list is initially empty and the head does not point to any node. Thus the
head must be explicitly initialized to point to NULL. After inserting nodes the list can be
traversed using the head and the pointer to next node in each member node of the list.
e. Inserting a node in a linked list
In order to insert a node into the linked list the pointer to the head of the list and the
pointer to the new node must be provided. The node can then be inserted into the list in
an appropriate position such that the nodes are ordered according to a specified field. For
the purpose of simulation this field will be the event clock.
1. struct node* insertNode(struct node* head, struct node* newNodePtr) {
2. if (head == NULL) { // Case 1
3. return newNodePtr;
4. } else if (head->clock > newNodePtr->clock) { // Case 2
5. newNodePtr->next = head;
6. return newNodePtr;
7. } else { // Case 3
8. struct node* prev = NULL;
9. struct node* curr = head;
10.
11. while ( (curr!=NULL) && (curr->clock <= newNodePtr->clock) ) {
12. prev = curr;
13. curr = curr->next;
14. }
15.
16. prev->next = newNodePtr;
head
NULL
Simulation designs 83
17. newNodePtr->next = curr;
18.
19. return head;
20. }
21. }
The above function can be called from a program as follows:
newNodePtr = createNode(ARRIVAL, MCL+5.5);
head = insertNode(head, newNodePtr);
As commented in the code above there are three separate cases that we must
handle, examined below.
Case 1: head is NULL
In this case, the head is currently pointing to NULL, which means that the list is empty
and the node being inserted will be the first element in the list. Thus, after the call to
insertNode(), head must point to the node that is being inserted. This can be visualized as
shown in figures 4.8 and 4.9.
Figure 4.8: Case 1- head and newNodePtr before the call to insertNode().
head
NULL
newNodePtr
ARR 8.93 NULL
84 Computer Simulation Techniques
Figure 4.9: Case 1 - head after the call to insertNode().
Case 2: head->clock > newNodePtr->clock
In the second case, the head in not pointing to NULL and the clock value of the head is
greater than the clock value of the new node. Thus, the new node must be inserted before
the head and the pointer to the new head node must be returned. This can be visualized as
shown in figures 4.10 and 4.1.
Figure 4.10: Case 2 - head and newNodePtr before the call to insertNode()
Figure 4.11: Case 2 - head after the call to insertNode()
head
ARR 8.93 NULL
DEP 15.86 NULL
head
ARR 8.93
OTH 6.7 NULL
newNodePtr
DEP 15.86
NULL
ARR
8.93
OTH
6.7
head
Simulation designs 85
Notice that in cases 1 and 2 the pointer to the head changes. Thus, the pointer
returned by insertNode() must be assigned to the head.
Case 3: Insertion between head and last node of the list
In the third case, the head in not pointing to NULL and the clock value of head is less
than the clock value of the new node. Thus the new node must be inserted after the head.
This can be visualized as shown in figures 4.12 and 4.3.
Figure 4.12: Case 3 - head and newNodePtr before the call to insertNode() .
Figure 4.13: Case 3 - head after the call to insertNode().
f. Removing a node from the linked list
The linked list is always maintained in an ascending order of the clock value. Therefore,
the next event to occur is the first node of the linked list. The node can be obtained from
the linked list as follows:
DEP 15.86 NULL
head
ARR 8.93
OTH 10.77 NULL
newNodePtr
DEP 15.86
NULL
OTH
10.77
head
ARR
8.93
86 Computer Simulation Techniques
1. struct node* removeNode(struct node* head, struct node** nextRef) {
2. *nextRef = head;
3.
4. if (head != NULL) {
5. head = head->next;
6. }
7. (*nextRef)->next = NULL;
8.
9. return head;
10. }
After the node is removed, all that needs to be done is to return the node that was
pointed to by the head and make the head to point to the next node. This can be done as
follows:
struct node* nextNodePtr = NULL;
head = removeNode(head, &nextNodePtr);
Figure 4.14: head and nextNodePtr before the call to removeNode().
The first parameter passed to removeNode is the head of the linked list. The
second parameter (struct node** nextRef) may look different from what we have seen so
far. This parameter is of the type pointer to a pointer to a struct node. Such variables are
sometimes called reference pointers. We need a reference pointer in this function to
return to the calling function the memory location of the next node. Also, note that in the
DEP 15.86 NULL
head
ARR 8.93
nextNodePtr
NULL
Simulation designs 87
function call, the address of the nextNodePtr (&nextNodePtr) is passed. This can be
visualized as shown in figure 4.14.
It is interesting to see what goes on inside the function removeNode(). When the
function gets called, the address of the variable nextNodePtr is passed to it, as shown in
figure 4.15.
Figure 4.15: nextRef points to nextNodePtr since address of nextNodePtr (&nextNodePtr)
is passed to removeNode().
After line 2 of the function above, this changes as shown in figure 4.16:
Figure 4.16: nextNodePtr now points to head node of the list.
After line 6, as shown in figure 4.17, the head points to the next node after the
head. This new head is returned by the function removedNode() as its return value. And
after line 7, the node that will be removed will point to NULL.
nextNodePtr
NULL
nextRef
nextNodePtr
DEP 15.86 NULL
head
ARR 8.93
nextRef
88 Computer Simulation Techniques
Figure 4.17: The previous head node of the list is now removed from the list and head points to the
second node.
Finally, let us take a look at the calling function. As shown in figure 4.18, the
head of the list returned by the function removeNode() is assigned to the head variable in
the calling function. The nextNodePtr is returned at the address (&nextNodePtr) passed
while calling the function.
Figure 4.18: Result of calling function removeNode().
4.5.2 Time complexity of linked lists
Let us try to analyze the time complexity of the insert and remove operations on the
linked list. In order to insert a node in the linked list we have to traverse the linked list
and compare each node until we find the correct insertion position. The maximum
number of nodes compared in the worst case will be the total number of nodes in the list.
Thus the complexity of the insert operation is linear on n.
head
nextRef
DEP 15.86 NULL
ARR 8.93
NULL
nextNodePtr
nextNodePtr
ARR 8.93 NULL
head
DEP 15.86 NULL
Simulation designs 89
Searching a linked list might be time consuming if n is very large. In this case,
one can employ better searching procedures. For example, a simple solution is to
maintain a pointer B to a node which is in the middle of the linked list. This node
logically separates the list into two sublists. By comparing clock value of the node to be
inserted with the clock stored in this node, we can easily establish in which sublist the
insertion is to take place. The actual insertion can then be located by sequentially
searching the nodes of the sublist.
Other data structures like heaps have a much better time complexity for these
operations.
4.5.3 Doubly linked lists
So far we have examined singly linked lists. The main disadvantage of these lists is that
they can be only traversed in one direction, namely from the first node to the last one.
Doubly linked lists allow traversing a linked list in both directions. This is possible
because any two successive nodes are linked with two pointers, as shown in figure 4.19.
Depending upon the application, a doubly-linked list may be more advantageous than a
singly-linked list. A doubly-linked list can be processed using procedures similar to those
described above in section 4.5.1.
Figure 4.9: A doubly linked list.
4.6 Unit-time advance design
In the event-advance simulation, the master clock is advanced from event to event.
Alternatively, the master clock can be advanced in fixed increments of time, each
increment being equal to one unit of time. In view of this particular mode of advancing
NULL
n
head
i j
90 Computer Simulation Techniques
the master clock, this simulation design is known as the unit-time advance design. Each
time the master clock is advanced by a unit time, all future event clocks are compared
with the current value of the master clock. If any of these clocks is equal to the current
E E E
n 2 1
time
Figure 4.20: The unit-time advance design.
A
Master clock
is increased
by a unit-time
Is
any future
event clock
= MC
?
An event has
occurred
Take appropriate
action
Any
conditional
event(s)
?
Schedule new
event (j)
A
A
A
no
yes
no
yes
Figure 4.21: The unit-time advance design.
Simulation designs 91
value of the master clock, then the associated event has just occurred and appropriate
action has to take place. If no clock is equal to the current value of the master clock, then
no event has occurred and no action has to take place. In either case, the master clock is
again increased by unit time and the cycle is repeated. This mode of advancing the
simulation through time is depicted in figure 4.20. The basic approach of the unit-time
design is summarized in the flow-chart given in figure 4.21.
A
MCL = MCL + 1
ST
End of service
Take appropriate
action
AT
A
ST = ST - 1 ST = ST - 1
> 1 = 1
An arrival has
occurred. Take
appropriate action
AT = AT - 1 AT = AT - 1
> 1 = 1
Figure 4.22: A unit-time advance design of a single server queue.
In the flow-chart of the unit-time simulation design, given in figure 4.21, it was
implicitly assumed that a future event clock is a variable which, as in the case of the
92 Computer Simulation Techniques
event-advance design, contains a future time with respect to the origin. That is, it contains
the time at which the associated event will occur. Alternatively, a future clock can simply
reflect the duration of a particular activity. For instances, in the machine interference
problem, the departure clock will simply contain the duration of a service, rather than the
future time at which the service will be completed. In this case, the unit-time design can
be modified as follows. Each time the master clock is advanced by a unit of time, the
value of each future clock is decreased by a unit time. If any of these clocks becomes
equal to zero, then the associated event has occurred and appropriate action has to take
place. Obviously, the way one defines the future event clock does not affect the unit-time
simulation design.
In order to demonstrate the unit-time advance design, we simulate a single queue
served by one server. The population of customers is assumed to be infinite. Figure 4.22
gives the flow-chart of the unit-time design. Variable AT contains the inter-arrival time
between two successive arrivals. Variable ST contains the service time of the customer in
service. Finally, variable MCL contains the master clock of the simulation model.
t
E
E
i j
time
t + 1 t + 2 t + 4 t + 3
Figure 4.23: Events occurring in between two successive values of the master clock.
4.6.1 Selecting a unit time
The unit time is readily obtained in the case where all future event clocks are represented
by integer variables. For, each event clock is simply a multiple of the unit time. However,
quite frequently future event clocks are represented by real variables. In this case, it is
quite likely that an event may occur in between two successive time instants of the master
clock as shown in figure 4.23. Obviously, the exact time of occurrence of an event E is
not known to the master clock. In fact, as far as the simulation is concerned, event E
Simulation designs 93
occurs at time t+1 (or t+2 depending upon how the program is set-up to monitor the
occurrence of events). This introduces inaccuracies when estimating time parameters
related to the occurrence of events. Another complication that might arise is due to the
possibility of having multiple events occurring during the same unit of time.
In general, a unit time should be small enough so that at most one event occurs
during the period of a unit of time. However, if it is too small, the simulation program
will spend most of its time in non-productive mode, i.e. advancing the master clock and
checking whether an event has occurred or not. Several heuristic and analytic methods
have been proposed for choosing a unit time. One can use a simple heuristic rule such as
setting the unit time equal to one-half of the smallest variate generated. Alternatively,
one can carry out several simulation runs, each with a different unit time, in order to
observe its impact on the computed results. For instance, one can start with a small unit
time. Then, it can be slightly increased. If it is found to have no effect on the computed
results, then it can be further increased, and so on.
4.6.2 Implementation
The main operation related to the processing of the future event list is to compare all the
future event clocks against the master clock each time the master clock is increased by a
unit time. An implementation using a sequential array as described in section 4.3.1 would
suffice in this case.
4.6.3 Event-advance vs. unit-time advance
The unit-time advance method is advantageous in cases where there are many events
which occur at times close to each other. In this case, the next event can be selected fairly
rapidly provided that an appropriate value for the unit time has been selected. The best
case, in fact, would occur when the events are about a unit time from each other.
The worst case for the unit-time advance method is when there are few events and
they are far apart from each other. In this case, the unit-time advance design will spend a
94 Computer Simulation Techniques
lot of non-productive time simply advancing the time and checking if an event has
occurred. In such cases, the event-advance design is obviously preferable.
4.7 Activity-based simulation design
This particular type of simulation design is activity based rather than event based. In an
event oriented simulation, the system is viewed as a world in which events occur that
trigger changes in the system. For instance, in the simulation model of the single server
queue described in section 4.6, an arrival or a departure will change the status of the
system. In an activity oriented simulation, the system modelled is viewed as a collection
of activities or processes. For instance, a single server queueing system can be seen as a
collection of the following activities: a) inter arriving, b) being served, and c) waiting for
service. In an activity based design, one mainly concentrates on the set of conditions that
determine when activities start or stop. This design is useful when simulating systems
with complex interactive processing patterns, sometimes referred to as machine-oriented
models.
a s + ST
i
i
s
i
a
i+1 i
AT
i+1
ST
i
WT
i
ith
arrival
ith arrival
begins its
service
(i+1)st
arrival
ith arrival
ends its
service
Figure 4.24: Time components related to the ith arrival.
We demonstrate this design by setting up an activity-based simulation model of
the single server queue problem studied in section 4.6. Let ST
i
and WT
i
be the service
Simulation designs 95
time respectively the waiting time of the ith arrival. Also, let AT
i+1
be the interarrival
time between the ith and (i+1)st arrival. Finally, let us assume that the ith arrival occurs at
time a
i
, starts its service at time s
i
and ends its service at time s
i
+ ST
i
, as shown in figure
4.24. Let us assume now that we know the waiting time WT
i
and the service time ST
i
of
the ith customer. Let AT
i+1
be the inter-arrival time of the (i+1)st customer. Then, one
the following three situations may occur.
a. The (i+1)st arrival occurs during the time that the ith arrival is waiting.
b. The (i+1)st arrival occurs when the ith arrival is in service
c. The (i+1)st arrival occurs after the ith arrival has departed from the queue
For each of these three cases, the waiting time WT
i+1
of the (i+1)st customer can be
easily determined as follows:
a) WT
i+1
= (WT
i
-AT
i+1
) + ST
i
= (WT
i
+ ST
i
) - AT
i+1
= TW
i
- AT
i+1
,
where TW
i
is the total waiting time in the system of customer i.
b) WT
i+1
= (WT
i
+ ST
i
) - AT
i+1
= TW
i
- AT
i+1
c) WT
i+1
= 0
Having calculated WT
i+1
, we generate a service time ST
i+1
for the (i+1)st arrival, and
an inter-arrival time AT
i+2
for the (i+2)nd arrival. The waiting time of the (i+2)nd arival
can be obtained using the above expressions. The basic mechanism of this activity-based
simulation model is depicted in figure 4.25.
96 Computer Simulation Techniques
A
Generate
AT
Compare
TW with
AT
TW = ST
A
Generate
ST
TW > AT
TW ! AT
Initial
conditions
Next arrival
occurs when
server is idle
TW = ST + (TW - AT)
A
Generate
ST
Empty system
WT = ST = 0, TW = 0
Next arrival occurs
when current arrival
is either waiting or
is in service
Figure 4.25: An activity-based simulation design for a single server queue.
4.8 Examples
In this section, we further highlight the simulation designs discussed in this Chapter by
presenting two different simulation models.
4.8.1 An inventory system
In an inventory system, one is mainly concerned with making decisions in order to
minimize the total cost of the operation. These decisions are mainly related to the
quantity of inventory to be acquired (or produced) and the frequency of acquisitions. The
total cost of running an inventory system is made up of different types of costs. Here, we
Simulation designs 97
will consider the following three costs: a) holding cost, b) setup cost, and c) shortage
cost. The holding cost is related to the cost of keeping one item of inventory over a period
of time. One of the most important components of this cost is that of the invested capital.
The setup cost is related to the cost in placing a new order or changes to production.
Finally, the shortage cost is associated with the cost of not having available a unit of
inventory when demanded. This cost may be in the form of transportation charges (i.e.,
expediting deliveries), increased overtime, and loss of future business.
Let It be the inventory at time t. Let S be the quantity added in the system
between time t and t. Also, let D be the demand between these time instances. Then, the
inventory at time t is
I
t
= I
t
+ S - D.
If I
t
is below a certain value, then an order is placed. The time it takes for the ordered
stock to arrive is known as the lead time. We assume that the daily demand and the lead
time follow known arbitrary distributions. The inventory level is checked at the end of
each day. If it is less than or equal to the re-ordering level, an order is placed. The lead
time for the order begins to count from the following day. Orders arrive in the morning
and they can be disposed of during the same day. During stockout days, orders are
backlogged. They are satisfied on the day the order arrives. The fluctuation in the
inventory level is shown in figure 4.26.
t t t t
1 2 3 4
Reorder
point
time
Stock
level
Figure 4.26: An inventory system.
98 Computer Simulation Techniques
The simulation model is described in the flow chart given in figures 4.27 and
4.28. The model estimates the total cost of the inventory system for specific values of the
reordering point and the quantity ordered. The model keeps track of I
t
on a daily basis. In
view of this, the model was developed using the unit-time advance design. We note that
this design arises naturally in this case. A unit of time is simply equal to one day. The
lead time is expressed in the same unit time. The basic input parameters to the simulation
model are the following. a) ROP, reordering point, b) Q, quantity ordered, c) BI, the
a
Generate
AT
t > T
b
Initialization
Generate
daily demand D
LT = 0
I = I + Q
End
Print
results
no order
outstanding
LT
LT = LT - 1
> 1
= 1
= 0
I = I - D
order has
arrived
no
yes
Figure 4.27: A unit-time simulation design of an inventory system.
Simulation designs 99
beginning inventory, d) probability distributions for variables D and LT representing the
daily demand and lead time, respectively, e) T, the total simulation time, and f) C1, C2,
C3, representing the holding cost per unit per unit time, the setup cost per order, and the
shortage cost per unit per unit time, respectively. The output parameters are TC1, TC2,
TC3 representing the total holding, setup and shortage costs respectively.
b
I < ROP
?
LT = 0
Generate
LT
TC1 = TC1 + I*C1
TC2 = TC2+ C2
no
yes
a
yes
no
I < 0
no
TC1 = TC1 + I*C1
a
TC3 = TC3 + I*C3
a
yes
Figure 4.28: A unit time simulation design of an inventory system.
100 Computer Simulation Techniques
4.6.2 A round-robin queue
We consider a client-server system where a number of clients send requests to a
particular server. For simplicity, we assume that a client is a computer operated by a user,
and it is connected to a server over the Internet. Each time a user sends a request, the
computer gets blocked, that is, the user cannot do any more processing nor can it send
another request, until it gets an answer back from the server. (These requests are often
referred to in the client-server parlance as synchronous requests). The requests are
executed by the server in a round-robin fashion, as will be explained below.
We assume that each user has always work to do. That is, it never becomes idle.
A user spends sometime thinking (i.e., typing a line or thinking what to do next), upon
completion of which it creates a request that is executed at the CPU. Since the user never
becomes idle, it continuously cycles through a think time and a CPU time, as shown in
figure 4.29.
think CPU think CPU think CPU
. . .
Figure 4.29: Cycling through a think time and a CPU time
The requests are executed by the CPU in a round robin manner. That is, each
request is allowed to use the CPU for a small quantum of time. If the request is done at
the end of this quantum (or during the quantum), then it departs from the CPU.
Otherwise, it is simply placed at the end of the CPU queue. In this manner, each request
in the CPU queue gets a chance to use the CPU. Furthermore, short requests get done
faster than long ones. A request that leaves the CPU simply goes back to the originating
computer. At that instance the user at the computer goes into a think state. The think time
is typically significantly longer than the duration of a quantum. For instance, the mean
think time could be 30 seconds, whereas a quantum could be less than 1 msec. A request,
in general, would require many CPU quanta. If a request requires 5 seconds of CPU time,
and a quantum is 1 msec, then it would cycle through the CPU queue 5000 times.
Simulation designs 101
We model this client-server scheme using the queueing system shown in figure
4.30. (We note that we only model the users think time and the CPU queue, which
operates under the round-robin scheme.) This system is similar to the machine
interference problem. The clients are the machines and the CPU is the repairman. A client
in the think state is like a machine being operational. The main difference from the
machine interference problem is that the CPU queue is served in a round robin fashion
rather in a FIF0 manner.
CPU
Terminals
Figure 4.30: A round-robin queue
The basic events associated with this system are: a) arrival of a request at the CPU
queue, and b) service completion at the CPU. A request arriving at the CPU queue may
be either a new arrival (i.e., a user sends a request, thus ending the think state), or it may
be a request that has just received a quantum of CPU time and it requires further
processing. A departing request from the CPU may either go back to the originating
client, or it may simply join the end of the CPU queue for further execution. We observe
that during the time that the CPU is busy, departure events occur every quantum of time.
However, new arrivals of requests at the CPU queue occur at time instances which may
be a few hundreds of quanta apart.
Following the same approach as in the machine interference problem, described in
section 1.3.1 of Chapter 1, we can easily develop an event-advance simulation model. We
observe that in this case, the event-advance design is quite efficient. The future event list
will contain one event associated with a departure from the CPU and the remaining
Clients
102 Computer Simulation Techniques
events will be associated with future new arrivals of requests. When a departure occurs,
most likely a new departure event will be scheduled to occur in the next quantum of time.
This new event will more likely be the next event to occur. In view of this, most of the
time, a newly created event will be simply inserted at the top of the future event list. Such
insertions can be done in 0(1) time.
We now give an alternative simulation design of the round-robin queue which
utilizes both the event-advance and unit-time advance designs! Specifically, all the events
related to new arrivals at the CPU queue are kept in a linked list as shown in figure 4.31.
Each node contains a future event time and a client identification number. The event time
simply shows the time at which the user will stop thinking and will access the CPU.
Nodes are ordered in an ascending order of the data element that contains the future event
time. Thus, the next new arrival event is given by the first node of the linked list.
t
i1
i
i
F
t
i2
i
2
t
in
i
n
0
Figure 4.31: Future event list of all new arrivals to the CPU queue.
All the information regarding the requests in the CPU queue, including the one in
service, is maintained in the separate linked shown in figure 4.32. This linked list is
known as a circular singly linked list, since it is singly linked and the last node is linked
to the first node. Each node contains the number of quanta required by a request and its
terminal identification number. Pointers B and E point to the beginning and end of the list
respectively. The nodes are ordered in the same way that the requests are kept in the CPU
queue. Thus, the first node corresponds to the request currently in service. When a new
request arrives at the CPU queue, a new node is created which is attached after node E. If
a request requires further service upon completion of its quantum, then its node is simply
placed at the end of the list. This is achieved by simply setting EB and BLINK(B).
Simulation designs 103
t
j1
j
1
B
t
j2
j
2
t
jk
j
k
E
Figure 4.32: Future event list of all new arrivals to the CPU queue.
b
Is
CPU
queue
empty
?
A departure
event occurs
MCL = MCL + 1
no
b
b
yes
Is
MCL=tarr
?
no
yes
A new arrival
event occurs
b
A new arrival
event occurs
MCL = tarr
Figure 4.33: Hybrid simulation design of the round-robin queue.
The simulation model operates under the unit-time advance design during the
period of time that the CPU is busy. During the time that CPU is idle, the simulation
model switches to an event-advance design. This hybrid design is summarized in figure
4.33. Note that tarr gives the time of the next new arrival at the CPU queue. The
remaining details of this program. are left up to the reader as an exercise!
104 Computer Simulation Techniques
Problems
Consider the following systems:
1. Checkout stands at a supermarket
2. Teller's window at a bank
3. Elevators serving an office building
4. Traffic lights in a configuration of 8 city blocks
5. Outpatient clinic
6. Pumps at a gasoline station
7. Parking lot
8. Runways at an airport
9. A telecommunication system with 5 nodes (virtual HDLC three linked lists)
10. Solar heating of a house
Choose any of the above systems. First, describe how the system operates. (Make
your own assumptions whenever necessary. Make sure that these assumptions do not
render the system trivial!) Then, set up a simulation model to represent the operations of
the system. If you choose an event-based simulation design, then state clearly which are
the state variables and what are the events. For each caused event, state clearly what
action the simulation model will take. If you choose an activity-based design, state
clearly which are the activities and under what conditions they are initiated and
terminated.
Computer assignments
1. Implement the hybrid simulation model of the round-robin queue discussed in
section 4.6.2.
2. Consider the machine interference problem. Modify your simulation model so
that the event list is maintained in the form of a linked list. Assume that the queue
Simulation designs 105
of broken-down machines can be repaired by more than one server (i.e., there are
more than one repairman repairing machines off the same queue). Parametrize
your program so that it can run for any number of machines and repairmen
(maximum 20 and 10, respectively). Run your simulation model until 20 repairs
have been completed. As before, each time an event occurs, print out the usual
line of output and also additional information pertaining to the event list. Check
by hand that your linked list implementation is correct.
3. Consider the token-based access scheme problem. Assume that transmissions are
not error-free. That is, when a packet arrives at the destination node, it may
contain errors. In this case, the packet will have to be re-transmitted. The
procedure is as follows:
Upon completion of the transmission of a packet, the host will wait to hear from
the receiving host whether the packet has been received correctly or not. The time
for the receiver to notify the sender may be assumed to be constant. If the packet
has been correctly received, the host will proceed with the next transmission. If
the packet has been erroneously transmitted, the sender will re-transmit the
packet. There is 0.01 probability that the packet has been transmitted erroneously.
The sender will re-transmit the packet immediately. This procedure will be
repeated until the packet is correctly transmitted. No more than 5 re-transmissions
will be attempted. After the 5th re-transmission, the packet will be discarded, and
the sender will proceed to transmit another packet. All these re-transmissions take
place while the host has the token. When the token's time-out occurs, the host will
carry on re-transmitting until either the packet is transmitted correctly, or the
packet is discarded.
Describe how you will modify your simulation model in order to
accommodate the above acknowledgement scheme. Can this additional structure
be accommodated without introducing more events? If yes, how? If no, what
additional events need to be introduced? Describe what action will be taken each
106 Computer Simulation Techniques
time one of these additional events takes place. Also, describe how these new
events will interact with the existing events (i.e., triggering-off each other).
4. Consider the token-based access scheme problem. Modify the simulation design
in order to take advantage of the structure of the system. Specifically, do not
generate arrivals to each of the nodes. Store the residual inter-arrival time when
the node surrenders the token. Then, when the token comes back to the station,
continue to generate arrivals until the token times-out or it is surrendered by the
node. This change leads to a considerably simpler simulation model.
Appendix A: Implementing a priority queue using a heap
A priority queue is an interesting data structure used for storing events and it can be used to
implement a future event list. It supports two important operations: insertion of a new event and
removal of an event. The highest priority event can be obtained from a priority queue without
performing a time intensive search as is done in arrays and linked lists. This is because the events
in the priority queue are organized in such a way so that the highest priority event will always be
stored at a specific location in its internal data structure. Whenever an event is added to the
priority queue certain operations are performed in order to maintain this property. These
operations are done much faster than when we use arrays or linked lists. Thus, simulations with
large number of events will run much faster if the future event list is implemented as a priority
queue.
A priority queue is a binary tree called heap with functions to insert a new event and
remove the highest priority event. In the next section we explain the heap data structure. (We
note that the heap algorithms were taken from Chapter 6 of Introduction to Algorithms by T.
H. Cormen et al. )
A.1 A heap
A heap is a binary tree data structure with the following important properties:
Simulation designs 107
1. The binary tree is filled completely at each level, except possibly the last level. At the last
level the elements are filled from left to right. Such trees are called complete binary trees.
2. The value of a child element is always greater than or equal to the value of its parent. This
ensures that the value of the root element is the smallest. This property is also called the heap
property. Also, such heaps are called min-heaps. Alternatively, a max-heap is a structure
where the value of child node is always smaller than or equal to its parent. Thus for a max-
heap the root element will always be the one with the largest value.
In this section we will only deal with min-heaps. Three different examples of such heaps
are shown in figure A.1, of which only (a) satisfies both the properties of a heap. The data
structure (b) does not satisfy the heap property since the element containing 6 has a value greater
than its right child, which has value 3. The data structure (c) does not satisfy the property of
complete binary trees either since the second level is not completely filled. In order for (c) to be
a heap either the element with value 9 or 6 must be the child of the root element which has value
2.
(a) Valid (b) Invalid (c) Invalid
Figure A1: Examples of valid and invalid heaps
A.1.1 Implementing a heap using an array
The binary tree of a heap can be efficiently stored using an array of n sequential locations. If we
number the nodes from 1 at the root and place:
left child of node i at 2i
7
5
9
2
6
3
2
7
5
9
2
3
6
2
9
2
6
3
2
108 Computer Simulation Techniques
right child of node i at 2i +1 in the array
then the elements of the heap can be stored in consecutive locations of an array. An example of
this is shown in figure A2. The indices 1 through 6 represent the six consecutive array locations
and the values 2, 5, 3, 9, 6 and 7 are the data elements stored in the nodes of the tree. Observe
that the root element is stored at location 1 of the array. The left child of the root element is at
location 2, i.e., 2 x 1, and the right child at location 3, i.e., 2 x 1 + 1. Each node shares this
relationship with its left and right child.
(a) Heap (b) Array representation
Figure A2: Storing a heap in an array
The indices of the parent, left child and right child of node with index i can be computed
as follows:
PARENT(i)
return (floor (i/2))
LEFT(i)
return (2i)
RIGHT(i)
return (2i + 1)
a. Maintaining the heap property
In order to maintain the heap property the elements of a heap must be rearranged by calling the
HEAPIFY routine. This is a recursive routine called on a node that violates the heap property,
1 2 3 4 5 6
2 3 5 9 6 7
5
4
2
1
3
6
7
5
9
2
6
3
2
Simulation designs 109
i.e. its value is bigger than one of its childs value. The violating element moves down in the tree
in each of the recursive calls until it finds a place so that the heap property is satisfied.
When HEAPIFY is called on a node, it is assumed that the trees sub-rooted at its left and
right children already satisfy the heap property. All through our discussion our first call to
HEAPIFY will be to the root node of the heap. However the recursive calls will be made to
nodes at lower levels.
In order to understand how HEAPIFY works, we consider the example given in figures
A.3, A.4 and A.5. In figure A.3, the violating node is the root node (array index 1). Observe that
the trees sub-rooted at its left and right children are satisfying the heap property. Let A be the
name of the array representing the heap, then the first call to HEAPIFY will be HEAPIFY(A,1).
In this call A[1] is swapped with min(A[2],A[3]) which in this example is A[3]. The violating
element with value 7 moves to A[3], as shown in figure A.4, but it still violates the heap property
in its new location. Thus, HEAPIFY(A,3) is called recursively and A[3] is swapped with A[6],
and, as shown in figure A.5, the element with value 7 no longer violates the heap property.
A.3: The violating node is the root
1 2 3 4 5 6
7 3 2 9 6 5
5
4
2
1
3
6
5
2
9
2
6
3
7
A.4: The node with value 7 still violates the heap property.
1 2 3 4 5 6
2 3 7 9 6 5
5
4
2
1
3
6
5
7
9
2
6
3
2
110 Computer Simulation Techniques
The HEAPIFY algorithm
HEAPIFY (A, i)
1. left LEFT(i)
2. right RIGHT(i)
3.
if (left heap-size[A]) and (A[left] < A[i])
4. smallest left
5. else
6. smallest i
7. if (right heap-size[A]) and (A[right] < A[smallest])
8. smallest right
9.
if (smallest i)
10. SWAP(A[i], A[smallest])
11. HEAPIFY (A, smallest)
In lines 1 and 2 LEFT(i) and RIGHT(i) are obtained using the method described above. In lines 3
to 8 the index of smallest of A[left], A[right] and A[i] is stored in the variable smallest. In line 9
to 11 if i was not the smallest then the values A[i] and A[smallest] are swapped and HEAPIFY is
called recursively on the node to which the violating element was moved.
A5: The node with value 7 no longer violates the heap property.
1 2 3 4 5 6
2 3 5 9 6 7
5
4
2
1
3
6
7
5
9
2
6
3
2
Simulation designs 111
A.2 A priority queue using a heap
As mentioned earlier, a priority queue is a heap with sub-routines to insert a new event and
remove the highest priority event. HEAP-INSERT is used to insert a new event and EXTRACT-
MIN is used to remove the event with the highest priority from the heap. Below, we describe
each sub-routine and highlight its operation through an example.
HEAP-INSERT (A, key)
1. heap-size[A] heap-size[A] + 1
2. A[heap-size[A]] key
3. i heap-size[A]
4. while (i > 1) and (A[PARENT(i)] > A[i])
5. SWAP(A[i], A[PARENT(i)])
6. i PARENT(i)
As an example, let us consider a heap with six nodes numbered 1 through 6. Again let A
be the array representing the heap. The heap and its array representation are shown in figure A6.
Now, if want to insert a new element with value 4 into this heap we would call HEAP-INSERT
with key equal to 4. Figure A7 shows the result of this operation. The newly inserted node is
compared with its parent, and since the parent has a greater value than the new node, the parent
will move down while the new node moves into the place of its parent, as shown in figure A8.
A6: The heap and its array representation
7
5
4
2
1
3
6
7
5
9
2
6
3
2
4
1 2 3 4 5 6 7
2 3 5 9 6 7 4
112 Computer Simulation Techniques
EXTRACT-MIN (A)
1. if (heap-size[A] < 1)
2. error No elements in the heap
3. min A[1]
4. A[1] A[heap-size[A]]
5. heap-size[A] heap-size[A] 1
6. HEAPIFY (A, 1)
7. return (min)
Let us perform EXTRACT_MIN on the heap obtained after the insert operation in
previous example. The call will be made as EXTRACT-MIN(A). The minimum is always the
root element of the heap. As shown in figure A9, the root element has a value of 2. The last
7
5
4
2
1
3
6
7
5
9
2
6
3
2
4
1 2 3 4 5 6 7
2 3 5 9 6 7
4
A7: The new node is inserted in the heap and it is compared to its parent
A8: The parent node and the new node switch places
7
5
4
2
1
3
6
7
4
9
2
6
3
2
5
1 2 3 4 5 6 7
2 3 4 9 6 7 5
Simulation designs 113
element A[heap-size[A]] is moved to the root node A[1] and the heap-size is reduced by one, see
figure A10. HEAPIFY(A,1) is now called, and the final result is shown in figure A11.
7
5
4
2
1
3
6
7
4
9
2
6
3
2
5
1 2 3 4 5 6 7
2 3 4 9 6 7 5
A9: The minimum is always the root element
7
5
4
2
1
3
6
7
4
9
2
6
3
5
5
1 2 3 4 5 6 7
5
3 4 9 6 7 5
A10: The last element A[heap-size[A]] is moved to the root node A[1]
1 2 3 4 5 6
3 5 4 9 6 7
5
4
2
1
3
6
7
4
9
2
6
5
3
A11: The heap now satisfies the heap property.
114 Computer Simulation Techniques
A.3 Time complexity of priority queues
So far we have discussed how to implement a priority queue as a heap and how to insert a new
event and remove the highest priority event. In this section, we show that a priority queue runs
much faster than arrays and linked lists. The running time (called the algorithmic time
complexity) of an algorithm is proportional to the number of comparisons performed by the
algorithm in order to achieve its objective. The efficiency of various algorithms is compared
based on their time complexity.
The two basic operations performed on arrays, linked lists and priority queues are: insert
a new event and remove the next event. In table A.1, we approximate the maximum number of
comparisons done when these two operations are performed using each of the three data
structures. We assume that we already have n events in the data structure before either operation
is performed.
Insert new event Get/Remove next event
Array Store the new event at the first available
location.
Maximum Comparisons = 0
Search the entire array to get the event
whose execution time is least.
Maximum comparisons = n
Linked list Search for the correct position where the
new event must be inserted.
Maximum comparisons = n
Remove the first event.
Maximum comparisons = 0
Priority
queue
Use HEAP-INSERT which searches for
the correct position to insert the event
from the lowest level up to the root level
in the worst case.
Maximum comparisons=
height of the tree* = log
2
(n)
*If a heap has n elements, then its height
is equal to log
2
(n).
Use EXTRACT-MIN which removes the
root element, moves the last element to the
root and runs HEAPIFY on the root node.
HEAPIFY performs two comparisons (one
with the left and one with the right child)
and calls itself recursively until the correct
position for the violating element is found.
The maximum number of times this
procedure will be called recursively equals
the height of the binary tree.
Maximum comparisons = 2 x height of the
tree = 2 log
2
(n)
Table A.1: Time complexity comparisons
Simulation designs 115
A.4 Implementing a future event list as a priority queue
An event should be defined as a structure or an object with one of its attributes being the clock
associated with the occurrence of this event. An array of such objects can then be declared to
hold all the events. The size of the array must be big enough to hold the maximum number of
events at any point during the simulation. In the examples above, the values used in the nodes of
the binary trees or in the arrays can be seen as the clock attribute of the event objects. All
comparisons between the events of the heap should be made by comparing this attribute, but
whenever an element is be moved to another location in the array, the entire event object must be
moved.
The size of the array must be declared at the beginning of the simulation, which means
that the maximum required size of the array must be determined in advance. Alternatively, one
can allocate memory for events dynamically. For instance, in C one can use the malloc and
realloc functions whereas in Java one can use an ArrayList or a Vector. Also, almost all high
level programming languages have a library class for the priority queue. Thus, you can directly
use the library without implementing them on your own.
CHAPTER 5:
ESTIMATION TECHNIQUES FOR ANALYZING
ENDOGENOUSLY CREATED DATA
5.1 Introduction
So far we have examined techniques for building a simulation model. These techniques
were centered around the topics of random number generation and simulation design. The
reason why one develops a simulation model is because one needs to estimate various
performance measures. These measures are obtained by collecting and analyzing
endogenously created data. In this Chapter, we will examine various estimation
techniques that are commonly used in simulation. Before we proceed to discuss these
techniques, we will first discuss briefly how one can collect data generated by a
simulation program.
5.2 Collecting endogenously created data
A simulation model can be seen as a reconstruction of the system under investigation.
Within this reconstructed environment, one can collect data pertaining to parameters of
interest. This is similar to collecting actual data pertaining to parameters of interest in a
real-life system. Using the techniques outlined in the previous Chapters, one can
construct, say, an event simulation model of a system. This model simply keeps track of
the state of the system as it changes through time. Now, one can incorporate additional
logic to the simulation program in order to collect various statistics of interest such as the
frequency of occurrence of a particular activity, and the duration of an activity. These
118 Computer Simulation Techniques
statistics are obtained using data generated from within the simulation programs, known
as endogenous data.
Endogenous data can sometimes be collected by simply introducing in the
simulation program single variables, acting as counters. However, quite frequently one is
interested in the duration of an activity. For instance, in the machine interference problem
one may be interested in the down time of a machine. This is equal to the time the
machine spends queueing up for the repairman plus the duration of its repair. In such
cases, one needs to introduce a storage scheme where the relevant endogenously created
data can be stored. The form of the storage scheme depends, of course, upon the nature of
the problem.
In the machine interference problem, the down time of a machine can be obtained
by keeping the following information: a) time of arrival at the repairman's queue, and b)
time at which the repair was completed. This information can be kept in an array. At the
end of the simulation run, the array will simply contain arrival and departure times for all
the simulated breakdowns. The down time for each breakdown can be easily calculated.
Using this information one can then obtain various statistics such as the mean, the
standard deviation, and percentiles of the down time.
! ! B
t i t j t k
i j a
F
Figure 5.1: The linked list for the repairman's queue.
A more efficient method would be to maintain a linked list representing those
machines which are in the repairman's queue. This linked list is shown in figure 5.1. Each
node contains the following two data elements: a) time of arrival at the repairman's
queue, and b) index number of the machine. The nodes are linked so that to represent the
FIFO manner in which the machines are served. Thus, the first node, pointed by F,
represents the machine currently in service. If a machine arrives at the repairman's queue,
a new node will be appended after the last node, pointed to by B. The total down time of
a machine is calculated at the instance when the machine departs from the repairman.
Estimation Techniques 119
This is equal to the master clock's value at that instance minus its arrival time. In this
fashion we can obtain a sample of observations. Each observation is the duration of a
down time. Such a sample of observations can be analyzed statistically.
Another statistic of interest in is the probability distribution of the number of
broken down machines. In this case, the maximum number of broken down machines
will not exceed m, the total number of machines. In view of this, it suffices to maintain an
array with m + l locations. Location i will contain the total time during which there were i
broken down machines. Each time an arrival or a departure occurs, the appropriate
location of the array is updated. At the end of the simulation run, the probability p(n) that
there are n machines down is obtained by dividing the contents of the nth location by T,
the total simulation time.
As another example on how to collect endogenously created data, let us consider
the simulation model of the token-based access scheme. The simulation program can be
enhanced so that each node is associated with a two-dimensional array, as shown in
figure 5.2. In each array, the first column contains the arrival times of packets, and the
second column contains their departure time. When a packet arrives at the node, its
arrival time is stored in the next available location in the first column. When the packet
departs from the node, its departure time is stored in the corresponding location of the
second column. Thus, each array contains the arrival and departure times of all packets
that have been through the node. Also, it contains the arrival times of all the packets
currently waiting in the queue. Instead of keeping two columns per node, one can keep
one column. When a packet arrives, its arrival time is stored in the next available
location. Upon departure of the packet, its arrival time is substituted by its total time in
the system. These arrays can be processed later in order to obtain various statistics per
node.
An alternative approach is to maintain a linked list per node, as described above
for the machine interference problem. Each time a packet is transmitted, its total time is
calculated by subtracting the current master clock value from it arrival time stored in the
linked list. This value is then stored into a single array containing all durations of the
packets in the order in which they departed.
120 Computer Simulation Techniques
Node 1 Node 2 Node 3
Arr Dep Arr Dep Arr Dep
Top of
queue
Bottom
of queue
Current
queue
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
Figure 5.2: Data structure for the token-based access scheme simulation model.
5.3 Transient state vs. steady-state simulation
In general, a simulation model can be used to estimate a parameter of interest during the
transient state or the steady state.
Let us consider the machine interference problem. Let us assume that one is
interested in obtaining statistics pertaining to the number of broken down machines. The
simulation starts by assuming that the system at time zero is at a given state. This is
known as the initial condition. Evidently, the behaviour of the system will be affected by
the particular initial condition. However, if we let the simulation run for a long period, its
statistical behaviour will eventually become independent of the particular initial
condition. In general, the initial condition will affect the behavior of the system for an
initial period of time, say T. Thereafter, the simulation will behave statistically in the
same way whatever the initial condition. During this initial period T, the simulated
system is said to be in a transient state. After period T is over, the simulated system is
said to be in a steady state.
5.3.1 Transient-state simulation
One may be interested in studying the behavior of a system during its transient state. In
Estimation Techniques 121
this case, one is mostly interested in analyzing problems associated with a specific initial
starting condition. This arises, for example, if we want to study the initial operation of a
new plant. Also, one may be forced to study the transient state of a system, if this system
does not have a steady state. Such a case may arise when the system under study is
constantly changing.
5.3.2 Steady-state simulation
Typically, a simulation model is used to study the steady-state behaviour of a system. In
this case, the simulation model has to run long enough so that to get away from the
transient state. There are two basic strategies for choosing the initial conditions. The first
strategy is to begin with an empty system. That is, we assume that there are no activities
going on in the system at the beginning of the simulation. The second strategy is to make
the initial condition to be as representative as possible of the typical states the system
might find itself in. This reduces the duration of the transient period. However, in order to
set the initial conditions properly, an a priori knowledge of the system is required.
One should be careful about the effects of the transient period when collecting
endogenously created data. For, the data created during the transient period are dependent
on the initial condition. Two methods are commonly used to remove the effects of the
transient period. The first one requires a very long simulation run, so that the amount of
data collected during the transient period is insignificant relative to the amount of data
collected during the steady state period. The second method simply requires that no data
collection is carried out during the transient period. This can be easily implemented as
follows. Run the simulation model until it reaches its steady state, and then clear all
statistical accumulations (while leaving the state of the simulated system intact!).
Continue to simulate until a sufficient number of observations have been obtained. These
observations have all been collected during the steady-state. The second method is easy
to implement and it is quite popular.
The problem of determining when the simulation system has reached its steady
state is a difficult one. A simple method involves trying out different transient periods
T
1
,T
2
,T
3
,...,T
k
, where T
1
<T
2
<T
3
<...<T
k
. Compile steady-state statistics for each
122 Computer Simulation Techniques
simulation run. Choose T
i
so that for all the other intervals greater than T
i
, the steady-
state statistics do not change significantly. Another similar method requires to compute a
moving average of the output and to assume steady-state when the average no longer
changes significantly over time.
5.4 Estimation techniques for steady-state simulation
Most of the performance measures that one would like to estimate through simulation are
related to the probability distribution of an endogenously created random variable. The
most commonly sought measures are the mean and the standard deviation of a random
variable. Also, of importance is the estimation of percentiles of the probability
distribution of an endogenously created random variable.
For instance, in the machine interference problem one may be interested in the
distribution of the down time. In particular, one may settle for the mean and standard
deviation of the down time. However, percentiles can be very useful too. From the
management point of view, one may be interested in the 95% percentile of the down
time. This
is the down time such that only 5% of down times are greater than it.
Percentiles often are more meaningful to the management than the mean down time.
5.4.1 Estimation of the confidence interval of the mean of a random variable
Let x
1
, x
2
,..., x
n
be n consecutive endogenously obtained observations of a random
variable. Then
x
_
=
1
n
i=1
n
x
i
(5.1)
is an unbiased estimate of the true population mean, i.e., the expectation of the random
variable. In order to obtain the confidence interval for the sample mean we have to first
Estimation Techniques 123
estimate the standard deviation. If the observations x
1
, x
2
,... ,x
n
are independent of each
other, then
s
2
=
1
n - 1
i=1
n
(x
i
-x
_
)
2
(5.2)
or, using the short-cut formula
s
2
=
1
n - 1
\
|
[
)
j
i=1
n
x
2
i
-
(x
i
)
2
n
and, therefore, we obtain the confidence interval
(x
_
- 1.96
s
n
, x
_
+ 1.96
s
n
)
at 95% confidence. The confidence interval provides an indication of the error associated
with the sample mean . It is a very useful statistical tool and it should be always
computed. Unfortunately, quite frequently it is ignored. The confidence interval tells us
that the true population mean lies within the interval 95% of the time. That is, if we
repeat the above experiment 100 times, 95% of these times, on the average, the true
population mean will be within the interval.
The theory behind the confidence interval is very simple indeed. Observations x
1
,
x
2
, x
n
are assumed to come from a population known as the parent population whose
mean we are trying to estimate. Let
2
be the variance of the parent population. The
distribution that
!
x follows is known as the sampling distribution. Using the Central Limit
Theorem we have that
!
x follows the normal distribution N(, /
!
n ), as shown in figure
5.3. Now, let us fix points a and b in this distribution so that 95% of the observations (an
observation here is a sample mean
!
x ) fall in-between the two points. Points a and b are
124 Computer Simulation Techniques
symmetrical around . The areas (-, a) and (b, +) account for 5% of the total
distribution. Using the table of the standard normal distribution, we have that a is 1.96
standard deviation below , i.e., a=-1.96/
!
n . Likewise, b=+1.96/
!
n . Now, if we
consider an arbitrary observation
!
x , this observation will lie in the interval [a,b] 95% of
the time. That is, its distance from will be less than 1.96/
!
n 95% of the time.
Therefore, will lie in the interval
(
!
x - 1.96
!
n ,
!
x + 1.96
!
n )
95% of the time. If is not known, one can use in its place the sample standard deviation
s.
a
b
Figure 5.3: The normal distribution.
The value 95% is known as the confidence. In general, a confidence interval can
be calculated for any value of confidence. Most typical confidence values are 99%, 95%
and 90%. For each value, points a and b are calculated from the table of the standard
normal distribution. If the sample size is small (less than 30), then we can construct
similar confidence intervals, but points a and b will be obtained using the t distribution,
i.e.,
(
!
x - t
.95
s
n
,
!
x + t
.95
s
n
)
Estimation Techniques 125
with (n-1) degrees of freedom.
In general, the observations x
1
, x
2
,..., x
n
that one obtains endogenously from a
simulation model are correlated. For instance, the down time of a machine depends on the
down time of another machine that was ahead of it in the repairman's queue. In the
presence of correlated observations, the above expression (5.2) for the variance does not
hold. Expression (5.1) for the mean holds for correlated or uncorrelated observations. The
correct procedure, therefore, for obtaining the confidence interval of the sample mean is
to first check if the observations x
1
, x
2
,..., x
n
are correlated. If they are not, one can
proceed as described above. If the observations are correlated, then one has to use a
special procedure to get around this problem. Below, we discuss the following four
procedures for estimating the variance of correlated observations:
a. Estimation of the autocorrelation function.
b. Batch means.
c. Replications.
d. Regenerative method.
a. Estimation of the autocorrelation coefficients
Let X and Y be two random variables. Let
X
and
Y
be the expectation of X and Y
respectively. Also, let
!
"
X
2
and
!
"
Y
2
be the variance of X and Y respectively. We define the
covariance between X and Y to be
Cov (X,Y) = E[(X-
X
) (Y-
Y
)]
= E(XY) -
X
Y
This statistic reflects the dependency between X and Y. If X and Y are uncorrelated, then
Cov(X,Y) = 0. If Cov (X,Y) > 0, then X and Y are positively correlated, and if Cov (X,Y)
<0, then they are negatively correlated. If Y is identical to X, then Cov(X,X)=
!
"
X
2
.
126 Computer Simulation Techniques
(i) uncorrelated, i.e. Cov(X,Y) = 0.
(ii) positive correlation, i.e. Cov (X,Y) > 0.
(iii) negative correlation, i.e. Cov (X,Y) <0.
Figure 5.4: The three cases of correlation.
Estimation Techniques 127
Let us assume that we have obtained actual observations of the random variables
X and Y in the form of (x,y). Then, the scatter diagram can be plotted out. The scatter
diagrams given in figure 5.4 shows the three cases of correlation between X and Y
mentioned above.
The Cov (X,Y) may take values in the region (-, +). Also, it is not
dimensionless, which makes its interpretation troublesome. In view of this, the
correlation
xy
defined by
XY
=
Cov(X,Y)
x
y
is typically used as the measure of dependency between X and Y. It can be shown that -
1
XY
1. If
XY
is close to 1, then X and Y are highly positively correlated. If
XY
is
close to -1, then they are highly negatively correlated. Finally, if
XY
=0, then they are
independent from each other.
Now, let us assume we have n observations x
1
, x
2
, ..., x
n
. We form the following
n-1 pairs of observations: (x
1
,x
2
), (x
2
,x
3
), (x
3
,x
4
), ..., (x
i
,x
i+1
), ..., (x
n-1
,x
n
). Now, let us
regard the first observation in each pair as coming from a variable X and the second
observation as coming from a variable Y. Then, in this case
XY
is called the
autocorrelation or the serial correlation coefficient. It can be estimated as follows:
r
1
=
!
i=1
n"1
# (x
i
"X )(x
i+1
"Y )
i=1
n"1
# (x
i
"X)
2
i=1
n"1
# (x
i+1
"Y )
2
,
where X
_
=
!
1
n "1
x
i
i=1
n"1
# and Y
_
=
1
n-1
i=2
n
x
i
. For n reasonably large,
XY
can be
approximated by
128 Computer Simulation Techniques
r
1
=
!
i=1
n"1
# (x
i
"X )(x
i+1
"X )
i=1
n"1
# (x
i
"X )
2
where X
_
=
1
n
i=1
n
x
i
is the overall mean.
We refer to the above estimate of
XY
as r
1
in order to remind ourselves that this
is the correlation between observations which are a distance of 1 apart. This auto-
correlation is often referred to as lag 1 autocorrelation. In a similar fashion, we can
obtain the lag k autocorrelation, that is the correlation between observations which are a
distance k apart. This can be calculated using the expression:
r
k
=
!
i=1
n"k
# (x
i
"X )(x
i+k
"X )
i=1
n"1
# (x
i
"X )
2
)
In practice, the autocorrelation coefficients are usually calculated by computing the series
of autocovariances R
0
, R
1
, ..., where R
k
is given by the formula
R
k
=
!
1
n
i=1
n"k
# (x
i
"X )(x
i+k
"X ) (5.3)
We then compute r
k
as the ratio
r
k
=
R
k
R
0
, (5.4)
where R
0
=
2
. Typically, r
k
is not calculated for values of k greater than about n/4.
Estimation Techniques 129
lag k
+1
r
k
0
Figure 5.5: A correlogram with short-term correlation.
A useful aid in interpreting the autocorrelation coefficients is the correlogram.
This is a graph in which r
k
is plotted against lag k. If the time series exhibits a short-term
correlation, then its correlogram will be similar to the one shown in figure 5.5. This is
characterized by a fairly large value of r
1
followed by 2 or 3 more coefficients which,
while significantly greater than zero, tend to get successively smaller. Values of r
k
for
longer lags tend to be approximately zero. If the time series has a tendency to alternate,
with successive observations on different sides of the overall mean, then the correlogram
also tends to alternate as shown in figure 5.6.
lag k
+1
r
k
0
Figure 5.6: An alternating correlogram.
130 Computer Simulation Techniques
Let us now return to our estimation problem. Having obtained a sample of n
observations x
1
,x
2
,...,x
n
, we calculate the autocorrelation coefficients using the
expressions (5.3) and (5.4). Then, the variance can be estimated using the expression
s
2
=
!
s
X
2
[1 + 2
!
(1"
k
n
r
k
)
k=1
n / 4
# ]
where
!
s
X
2
is the standard deviation given by
!
s
X
2
=
!
1
n "1
i=1
n
# (x
i
"X )
2
and X
_
=
!
1
n
x
i
i=1
n
" .
b. Batch means
This is a fairly popular technique. It involves dividing successive observations into
batches as shown in figure 5.7. Each batch contains the same number of observations. Let
the batch size be equal to b. Then batch 1 contains observations x
1
, x
2
, ..., x
b
, batch 2
contains x
b+1
, x
b+2
, ...,
| x
1
, x
2
, ..., x
b
| x
b+1
, x
b+2
, ..., x
2b
| . . . | x
kb+1
, x
kb+2
, ..., x
(k+1)b
|
batch 1 batch 2 batch k
Figure 5.7: The batch means method.
x
2b
, and so on. The observations close to batch 2 are likely to be correlated with the
observations in batch 2 which are close to batch 1. Also, the observations in batch 2
which are close to batch 3 are likely to be correlated with those in batch 3 which are close
Estimation Techniques 131
to batch 2, and so on. Let
!
X
i
be the sample mean of the observations in batch i. If we
choose b to be large enough, then the sequence
!
X
1
,
!
X
2
, ...,
!
X
k
can be shown that it is
approximately uncorrelated. Therefore, we can treat these means as a sample of
independent observations and calculate their mean and standard deviation. We have
X
_
_
=
1
k
i=1
k
X
_
i
s
2
=
!
1
k "1
(X
i
i=1
k
# "X )
2
.
Therefore, for large k (i.e. k 30), we obtain the confidence interval
(X
_
_
- 1.96
s
k
, X
_
_
+ 1.96
s
k
).
For small k, we can construct our confidence interval using the t distribution.
In general, the batch size b has to be large enough so that the successive batch
means are not correlated. If b is not large, then the successive batch means will be
correlated, and the above estimation procedure will yield severely biased estimates. An
estimate of b can be obtained by plotting out the correlogram of the observations
x
1
,x
2
,...,x
n
, which can be obtained from a preliminary simulation run. We can fix b so
that it is 5 times the smallest value b' for which r
b'
is approximately zero.
c. Replications
Another approach to constructing a confidence interval for a mean is to replicate the
simulation run several times. Suppose we make n replications, each resulting to n
observations as follows:
replication 1: x
11
, x
12
, ..., x
1m
132 Computer Simulation Techniques
replication 2: x
21
, x
22
, ..., x
2m
.
.
.
replication n: x
nm
, x
n2
, ..., x
nm
For each sample, we can construct the sample mean
X
_
i
=
1
m
j=1
n
x
ij
.
We can then treat the sample means X
_
1
, X
_
2
, ..., X
_
n
as a sample of independent
observations, thus obtaining
X
_
_
=
1
n
i=1
n
X
_
i
s
2
=
!
1
n
(X
i
" X
i=1
n
#
)
2
.
Using the above statistics we can construct our confidence interval.
The problems that arise with this approach are: a) decide on the length of each
simulation run, i.e., the value m, and b) decide on the length of the transient period. One
of the following two approaches can be employed:
Start each simulation run with different values for the seeds of the random
number generators. Allow the simulation to reach its steady state and then collect the
sample observations. Repeat this procedure n times. In order to obtain n samples,
therefore, we have to run n independent simulations, each time having to allow the
simulation to reach its steady state.
Estimation Techniques 133
Alternatively, we can run one very long simulation. Allow first the simulation to
reach its steady state, and then collect the first sample of observations. Subsequently,
instead of terminating the simulation and starting all over again, we extend the simulation
run in order to collect the second sample of observations, then the third sample and so on.
The advantage of this method is that it does not require the simulation to go through a
transient period for each sampling period. However, some of the observations that will be
collected at the beginning of a sampling period will be correlated with observations that
will be collected towards the end of the previous sampling period.
The replication method appears to be similar to the batch means approach.
However, in the batch means method, the batch size is relatively small and, in general,
one collects a large number of batches. In the above case, each sampling period is very
large and one collects only a few samples.
d. Regenerative method
The last two methods described above can be used to obtain independent or
approximately independent sequences of observations. The method of independent
replications generates independent sequences through independent runs. The batch means
method generates approximately independent sequences by breaking up the output
generated in one run into successive subsequences which are approximately independent.
The regenerative method produces independent subsequences from a single run. Its
applicability, however, is limited to cases which exhibit a particular probabilistic
behaviour.
Let us consider a single server queue. Let t
0
, t
1
, t
2
,... be points at which the
simulation model enters the state where the system is empty. Such time instances occur
when a customer departs and leaves an empty system behind. Let t
0
be the instance when
the simulation run starts assuming an empty system. The first customer that will arrive
will see an empty system. During its service, other customers may arive thus forming a
queue. Let t
1
be the point at which the last customer departs and leaves an empty system.
That is, t
1
is the time instance where the server becomes idle. This will repeat itself as
shown in figure 5.8. It is important to note that the activity of the queue in the interval (t
i
,
134 Computer Simulation Techniques
t
i+1
) is independent of its activity during the previous interval (t
i-1
,t
i
). That is to say, the
probability of finding customer n in the interval (t
i
, t
i+1
) does not depend on the number
of customers in the system during the previous interval. These time instances are known
as regeneration points. The time between two such points is known as the regeneration
cycle or tour. The queue-length distribution observed during a cycle is independent of the
distribution observed during the previous cycles. The same applies for the density
probability distribution of the total time a customer spends in the system.
Number
in system
t
0
Time
1
t
2
t
3
t
Figure 5.8: Regeneration points.
The regeneration points identified above in relation with the queue-length (or
waiting time) probability distribution are the time points when the system enters the
empty state. Regeneration points identified with time instances when the system enters
another state, can be also obtained if the service time is exponentially distributed. For
instance, the time instances when the system contains 5 customers are regeneration
points. Due to the memoryless property of the service time, the process repeats itself
probabilistically.
In the case of the machine interference problem, regeneration points related to the
repairman's queue-length probability, or waiting time in the queue, can be identified with
the time instances when the repairman is idle. Such time instances occur when the last
machine is repaired and the system enters the state where all machines are operational.
Due to the assumption that operational times are exponentially distributed, the process
Estimation Techniques 135
repeats itself probabilistically following the occurrence of this state. Other states can be
used to identify regeneration points, assuming exponentially distributed repair times.
Now, let us assume that we are interested in estimating the mean value of a
random variable X. Let (x
i1
, x
i2
, ..., x
in
i
) be a sequence of realizations of X during the ith
regeneration cycle occurring between t
i
and t
i+1
regeneration points. Let n
i
be the total
number of observations. This sequence of observations will be independent from the one
obtained during the (i+1)st cycle. Thus, the output is partitioned into independent
sequences. In the batch means case, the output was partitioned into approximately
independent sequences. However, the number of observations in each batch was constant
equal to batch size. In this case, the number of observations in each cycle is a random
variable.
Due to the nature of the regeneration method, there is no need to discard
observations at the beginning of the simulation run. The simulation starts by initially
setting the model to the regeneration state. Then the simulation is run for several cycles,
say M cycles. Let
Z
i
=
j=1
n
i
x
ij
be the sum of all realizations of X in the ith cycle. Then a point estimate of E(X) can be
obtained using the expression:
X
_
=
1
M
i=1
M
Z
i
1
M
i=1
M
n
i
.
That is, E(X) is estimated using the ratio E(Z)/E(N), where Z is a random variable
indicating the sum of all observations of
!
X in a cycle, and N is a random variable
indicating the number of observations in a cycle.
136 Computer Simulation Techniques
!
X is not an unbiased estimator of E(X). That is E(
!
X ) E(X). However, it is
consistent. That is,
!
X E(X) as M . Now, in order to construct a confidence
interval of
!
X , we note that
!
X is obtained as the ratio of two random variables. The
following two methods can be used to construct confidence intervals for a ratio of two
random variables: the central limit theorem, and the jackknife method.
The central limit theorem
Let
12
= Cov (Z, N),
!
"
11
2
= Var(Z), and
!
"
22
2
= Var(N). Also, let V=Z-NE(X). That is, for
cycle i we have V
i
=Z
i
-n
i
E(X). Then, the V
i
's are independent and identically distributed
with a mean E(V) = 0. This because
E(V) = E(Z - NE(X))
= E(Z) - E(N)E(X)
= 0.
The variance
v
2
of the V
i
's is as follows:
E(V - E(V))
2
= E(V
2
)
= E(Z - NE(X))
2
= E(Z
2
- 2ZNE(X) + N
2
E(X)
2
)
= E(Z
2
) - 2E(X)E(ZN) + E(N
2
)E(X)
2
.
Since Var(Y) = E(Y
2
) - E(Y)
2
we have that
v
2
=
11
2
+ E(Z)
2
- 2E(X)E(ZN) + E(X)
2
22
2
+ E(N)
2
E(X)
2
=
11
2
+ E(X)
2
22
2
- 2(E(X)E(ZN) + E(Z)
2
+ E(N)
2
E(X)
2
.
Estimation Techniques 137
Given that E(Z) = E(N)E(X) we have
v
2
=
11
2
+ E(X)
2
22
2
- 2E(X)E(ZN) + 2E(N)
2
E(X)
2
=
11
2
+ E(X)
2
22
2
- 2E(X)[E(ZN) - E(X)E(N)
2
=
11
2
+ E(X)
2
22
2
- 2E(X)[E(ZN) - E(Z)E(N)]
or
v
2
=
11
2
+ E(X)
2
22
2
- 2E(X)
12
since
Cov(Y
1
, Y
2
) = E(Y
1
- E(Y
1
))(Y
2
- E(Y
2
))
= E(Y
1
Y
2
- E(Y
1
)Y
2
- E(Y
2
)Y
1
+ E(Y
1
)E(Y
2
))
= E(Y
1
Y
2
) - E(Y
1
)E(Y
2
) - E(Y
2
)E(Y
1
) + E(Y
1
)E(Y
2
)
= E(Y
1
Y
2
) - E(Y
1
)E(Y
2
).
By the central limit theorem, we have that as M increases V
_
becomes normally
distributed with a mean equal to 0 and a standard deviation equal to
!
"
v
2
/ M , where
V
_
=
1
M
i=1
M
V
i
=
1
M
i=1
M
(Z
i
- n
i
E(X))
138 Computer Simulation Techniques
=
1
M
i=1
M
Z
i
- E(X)
1
M
i=1
M
n
i
= Z
_
- E(X)N
_
.
Hence,
Z
_
- E(X)N
_
~ N(0,
v
2
M
)
or
Z
_
- E(X)N
_
v
2
M
~ N(0, 1)
Dividing by N we obtain that
Z
_
/N
_
- E(X)
(1/N
_
)
v
2
M
~ N(0, 1).
Therefore, we obtain the confidence interval
Z
_
N
_
1.96
v
2
/ M
N
_
.
Estimation Techniques 139
Now, it can be shown that s
v
2
= s
Z
2
- 2X
_
R
Z,N
+ X
_
2
s
N
2
is an estimate of
2
. Therefore, it
can be used in place of
v
2
in the above confidence interval.
The above method can be summarized as follows:
1. Run the simulation for M cycles and obtain
Z
1
, Z
2
, Z
3
, ..., Z
M
n
1
, n
2
, n
3
, ..., n
M.
2. Estimate Z
_
, N
_
and set X
_
= Z
_
/ N
_
.
3. Estimate
s
Z
2
=
!
1
M "1
i=1
M
#
(z
i
"Z
2
)
s
N
2
=
!
1
M "1
i=1
M
#
(n
i
"N
2
)
s
Z,N
2
=
!
1
M "1
i=1
M
#
(z
i
"Z)(n
i
"N) .
The jacknife method
This method constitutes an alternative method to obtaining a confidence interval of a
ratio of two random variables. It also provides a means of obtaining a less biased point
estimator of the mean of the ratio of two random variables, sine the classical point
estimator is usually biased.
Let X,Y be two random variables. Suppose we want to estimate =E(Y)/E(X)
from the data y
1
, y
2
, ..., y
n
and x
1
, x
2
, ..., x
n
, where the y
i
's are i.i.d., the x
i
's are i.i.d. and
Cov(y
i
,x
j
)0 for ij. The classical point estimator of is
c
=
!
Y /
!
X and its confidence
interval can be obtained as shown above. The jacknife point and interval estimator can be
constructed as follows. Let
140 Computer Simulation Techniques
g
= n
^
C
- (n - 1)
jg
y
j
jg
x
j
, g = 1,2, ...,n.
The jacknife point estimator of is
^
J
=
g=1
n
g
/n .
This is, in general, less biased than
^
C
. Let
2
J
=
!
g=1
n
"
(#
g
$%
j
)
2
n $1
.
Then, it can be shown that
^
J
~ N(,
2
J
n
), as n .
That is, we can obtain the confidence interval at 95%
(
^
J
-1.96
J
n
,
^
J
+1.96
J
n
) .
The difficulty in using the regenerative method is that real-world simulations may
not have regeneration points. If they do happen to have regeneration points, the expected
regeneration cycle may be too large so that only a few cycles may be simulated.
5.4.2 Estimation of other statistics of a random variable
So far we considered estimation techniques for constructing a confidence interval of the
mean of an endogenously created random variable. Other interesting statistics related to
the probability distribution of a random variable are:
Estimation Techniques 141
a. Probability that a random variable lies within a fixed interval.
b. Percentiles of the probability distribution.
c. Variance of the probability distribution.
Below, we examine ways of estimating the above statistics.
a. Probability that a random variable lies within a fixed interval
The estimation of this type of probability can be handled exactly the same way as the
estimation of the mean of a random variable. Let I be the designated interval. We want to
estimate
p = Pr (X I)
where X is an endogenously created random variable. We generate M replications of the
simulation. For each replication i we collect N observations of X. Let v
i
be the number of
times X was observed to lie in I. Then, p
i
= v
i
/N is an estimate of probability p. Thus,
p
_
=
1
M
i=1
M
p
i
and
s
2
=
!
1
M "1
i=1
M
#
( p
i
" p)
2
.
As before, (p
_
-p)/(s/ M ) ~ N(0,1) if M is large.
We observe, that the estimation of p requires M independent replications, each
giving rise to one realization of p. Other methods examined in section 5.4 of this Chapter
can be used in order to remove unwanted autocorrelations. For instance, instead of
replications, the batch means method or the regenerative method can be used.
Alternatively, the estimation of p can be seen as estimating a population mean.
Let Y
i
=1 if ith realization of X belongs to I. Otherwise, Y
i
=0. Then, in one replication we
142 Computer Simulation Techniques
have that (1/N)Y
i
is equal to V
i
/N or p
i
. Thus, the techniques developed in section 5.4
of this Chapter can be employed to estimate p.
!
x
!
Figure 5.9: Percentile x
.
b. Percentile of a probability distribution
This is a very important statistic that is often ignored in favour of the mean of a random
variable X. Management, sometimes, is not interested in the mean of a particular random
variable. For instance, the person in charge of a web service may not be interested in its
mean response time. Rather, he or she may be interested in "serving as many as possible
as fast as possible". More specifically, he or she may be interested in knowing the 95th
percentile of the response time. That is, a value such that the response time of the real
time system is below it 95% of the time.
In general, let us consider a probability density function f(x). The 100th
percentile is the smallest value x
under f(x) is less or equal to as shown in figure 5.9. Typically, there is interest in the
50th percentile (median) x
0.50
or in extreme percentiles such as x
0.90
, x
0.95
, x
0.99
.
We are interested in placing a confidence interval on the point estimator of x
of a
distribution of a random variable X. Let us assume independent replications of the
simulation. Each replication yields N observations, having allowed for the transient
period. For each replication i, let x
i1
, x
12
, ..., x
1N
be the observed realizations of X. Now,
let us consider a reordering of these observations y
i1
, y
12
, ..., y
1N
so that y
ij
<y
i,j+1
. Then, the
100th percentile
!
x
"
(i )
for the ith replication is observation y
ik
where k=N, if N is an
integer, or k=
!
N"
# $
+1 if N is not an integer (
!
x
" #
means the largest integer which is
less or equal to x). For instance, if we have a sample of 50 observations ordered in an
Estimation Techniques 143
ascending order, then the 90th percentile is the observation number 0.90
.
50 = 45. The
95th percentile is
!
50x0.95
" #
+1=
!
47.5
" #
+1=47+1=48.
Hence
x
_
=
!
1
M
i=1
M
"
x
(i)
and
s
2
=
!
1
M "1
i=1
M
# (x
$
(i )
" x$ )
2
Confidence intervals can now be constructed in the usual manner.
The estimation of extreme percentiles requires long simulation runs. If the runs
are not long, then the estimates will be biased. The calculation of a percentile requires
that a) we store the entire sample of observations until the end of the simulation, and b)
that we order the sample of observations in an ascending order. These two operations can
be avoided by constructing a frequency histogram of the random variable on the fly.
When a realization of the random variable becomes available, it is immediately classified
into the appropriate interval of the histogram. Thus, it suffices to keep track of how many
observations fall within each interval. At the end of the replication, the 100th percentile
can be easily picked out from the histogram. Obviously, the accuracy of this
implementation depends on the chosen width of the intervals of the histogram.
Finally, we note that instead of independent replications of the simulation, other
methods can be used such as the regeneration method.
c. Variance of the probability distribution
Let us consider M independent replications of the simulation. From each replication i we
obtain N realizations of a random variable x
i1
,x
i2
,...,x
iN
, after we allow for the transient
period. We have
_
i
=
1
N
j=1
N
x
ij
and
144 Computer Simulation Techniques
_
_
=
1
M
i=1
M
i
is the grand sample mean. Hence,
s
2
i
=
!
1
N
j=1
N
"
(x
ij
#) )
2
=
1
N
[
j=1
N
x
ij
2
- 2
_
i
_
_
+
_
_
2
].
As the point estimate of the variance
2
we take
s
2
i
=
!
1
M
i=1
M
" s
2
i
=
!
1
M
i=1
M
"
(
1
N
ij
2
x
j=1
N
"
) -
!
1
M
2
N
i
i=1
M
"
+
!
2
M
2
=
!
1
M
i=1
M
"
(
1
N
ij
2
x
j=1
N
"
) -
_
_
2
The estimates of
!
s
i
2
are all functions of
!
. Thus, they are not independent. A confidence
interval can be constructed by jacknifing the estimator s
2
. Let
!
"i
2
be an estimate of
2
with the ith replication left out. That is,
_
2
i
=
!
1
M "1
j#i
$
(
1
N
i=1
N
$
x2)-
1
M - 1
ji
_
j
2
.
Define z
i
= Ms
2
- (M-
1
)
_
2
i
. Then,
Z =
1
M
i=1
M
Z
i
Estimation Techniques 145
s
2
Z
=
1
M-1
i=1
M
(Z
i
- Z
_
)
2
and a confidence interval can be constructed in the usual way.
Alternatively, we can obtain a confidence interval of the variance by running the
simualtion only once, rather than using repications, and then calculating the standard
deviation assuming that the successive observations are independent! This approach is
correct when the sample of observations is extremely large.
5.5 Estimation techniques for transient-state simulation
The statistical behaviour of a simulation during its transient state depends on the initial
condition. In order to estimate statistics of a random variable X during the transient state
one needs to be able to obtain independent realizations of X. The only way to get such
independent observations is to repeat the simulation. That is, employ the replications
technique discussed above in section 5.4. Each independent simulation run has to start
with the same initial condition.
As an example, let us assume that we want to estimate the 95th percentile of the
probability distribution of a random variable X. This can be achieved by simply
replicating the simulation times. For each replication we can obtain an estimate x
.95
. A
confidence interval can be obtained as shown in 5.4. Each replication will be obtained by
starting the simulation with the same initial condition, and running the simulation during
its transient period. This, of course, requires advanced knowledge of the length of the
transient period. Furthermore, the pseudo-random numbers used in a replication have to
be independent of those used in previous replications. This can be achieved by using a
different seed for each replication. The difference between two seeds should be about
10,000.
5.6 Pilot experiments and sequential procedures for achieving a required
accuracy
146 Computer Simulation Techniques
So far, we discussed techniques for generating confidence intervals for various statistics
of an endogenously generated random variable. The expected width of the confidence
interval is, in general, proportional to 1/ N , where N is the number of i.i.d. observations
used. Obviously, the larger the value of N, the smaller the width confidence interval.
(This is defined as half the confidence interval.) For instance, in order to halve the width
of the confidence interval of the mean of a random variable, N has to be increased by four
times so that 1/ 4N =(1/2)(1/ N ). In general, the accuracy of an estimate of a statistic
depends on the width of the confidence interval. The smaller the width, the higher is the
accuracy.
Quite frequently one does not have prior information regarding the value of N that
will give a required accuracy. For instance, one does not know the value of N that will
yield a width equal to 10% of the estimate. Typically, this problem is tackled by
conducting a pilot experiment. This experiment provides a rough estimate of the value of
N that will yield the desired confidence interval width. An alternative approach is the
sequential method. That is, the main simulation experiment is carried out continuously.
Periodically, a test is carried out to see if the desired accuracy has been achieved. The
simulation stops the first time it senses that the desired accuracy has been achieved.
Below, we examine the methods of independent replications and batch means.
5.6.1 Independent replications
This discussion is applicable to transient and steady state estimation. Let us assume that
we want to estimate a statistic of a random variable using independent replications. A
pilot experiment is first carried out involving N
1
replications. Let
!
"
1
be a point estimate
of and let
1
be the width of its confidence interval. We assume that the width of the
confidence interval is required to be approximately less or equal to 0.1
^
. If
1
0.1
!
"
1
,
then we stop. If
1
>0.1
!
"
1
, then we need to conduct a main experiment involving N
2
replications where, N
2
= (
1
/0.1
!
"
1
)
2
N
1
appropriately rounded off to the nearest integer.
Let
!
"
2
and
2
be the new estimate and width based on N
2
replications. Due to
randomness, the N
2
observations will not exactly yield a confidence interval width equal
Estimation Techniques 147
to 0.1
!
"
2
. We note that it is not necessary to run a new experiment involving N
2
replications. Rather, one can use the N
1
replications from the pilot experiment, and then
carry out only N
2
- N
1
additional replications.
The above approach can be implemented as a sequential procedure as follows.
The simulation program is modified to conduct N
*
independent replications. The point
estimate
!
"
1
and the width
1
of its confidence interval are calculated. If
1
0.1
!
"
1
, then
the simulation stops. Otherwise, the simulation proceeds to carry out N
*
additional
replications. The new point estimate
!
"
2
and width
2
are constructed based on the total
2N
*
replications. The simulation will stop if
2
0.1
!
"
2
. Otherwise, it will proceed to
generate another N
*
replication and so on. N
*
can be set equal to 10.
5.6.2 Batch means
This discussion is obviously applicable to steady state estimations. Using the pilot
experiment approach, one can run the simulation for k
1
batches. From this, one can
obtain
!
"
1
and
1
. If
1
0.1
!
"
1
, then the desired accuracy has been achieved. Otherwise,
k
2
-k
1
additional batches have to be simulated, where k
2
=(
1
/0.1
!
"
1
)
2
k
1
. These additional
batches can be obtained by simply re-running the simulator for k
2
-k
1
batches.
Alternatively, the simulation program can be enhanced to include the following
sequential procedure. The simulation first runs for k
*
batches. Let
!
"
1
and
1
be the point
estimate and the width of its confidence interval respectively. The simulation stops if
1
0.1
!
"
1
. Otherwise, it runs for k
*
additional batches. Now, based on the 2k
*
batches
generated to this point,
!
"
2
and
2
are constructed. If
2
0.1
!
"
2
, then the simulation stops.
Otherwise, it runs for another k
*
batches, and so on.
148 Computer Simulation Techniques
Computer Assignments
1. Consider the machine interference problem. Modify the simulation model to carry
out the following tasks:
a. Set-up a data structure to collect information regarding the amount of time
each machine spends being broken down, i.e., waiting in the queue and also
being repaired (see section 2 of Chapter 3).
b. Augment your simulation program to calculate the mean and standard
deviation. Then, run your simulation for 1050 observations (i.e., repairs).
Discard the first 50 observations to account for the transient state. Based on
the remaining 1000 observations, calculate the mean and the standard
deviation of the time a machine is broken down.
c. The calculation of the standard deviation may not be correct, due to the
presence of autocorrelation. Write a program (or use an existing statistical
package) to obtain a correlogram based on the above 1000 observations.
(You may graph the correlogram by hand!) Based on the correlogram,
calculate the batch size. Implement the batch means approach in your
program and run your program for 31 batches. Disregard the first batch, and
use the other 30 batch means to construct a confidence interval of the mean
time a customer spends in the system.
d. Using the batch means approach, implement a sequential procedure for
estimating the mean time a machine is broken down (see section 5.6.2).
e. Implement a scheme to estimate the 95th percentile of the time a machine is
broken down.
2. Consider the token-based access scheme. Modify the simulation model to carry
out the following tasks:
a. Set-up a data structure to collect information regarding the amount of time
each packet spends in a queue i.e., from the time it joins a queue to the time
it is transmitted out.
Estimation Techniques 149
b. Augment your simulation program to calculate the mean and standard
deviation. Then, run your simulation for 1050 observations (i.e., packet
arrivals). Discard the first 50 observations to account for the transient state.
Based on the remaining 1000 observations, calculate the mean and the
standard deviation of the time a packet spend in a queue.
c. The calculation of the standard deviation may not be correct, due to the
presence of autocorrelation. Write a program (or use an existing statistical
package) to obtain a correlogram based on the above 1000 observations.
(You may graph the correlogram by hand!) Based on the correlogram,
calculate the batch size. Implement the batch means approach in your
program and run your program for 31 batches. Disregard the first batch, and
use the other 30 batch means to construct a confidence interval of the mean
time a customer spends in the system.
d. Using the batch means approach, implement a sequential procedure for
estimating the mean time a packet spends in a queue (see section 5.6.2).
e. Implement a scheme to estimate the 95th percentile of the time a packet
spends in a queue.
1. Consider the two-stage manufacturing system. Modify the simulation model to
carry out the following tasks. (Make sure that the input values you use lead to a
stable system, i.e. the utilization of the first server is less than 100%.)
a. Set-up a data structure to collect information regarding the amount of time
each customer spends in the system, i.e. from the time it arrives to stage 1 to
the time it departs from stage 2.
b. Augment your simulation program to calculate the mean and standard
deviation. Then, run your simulation for 1050 observations (i.e., customer
arrivals). Discard the first 50 observations to account for the transient state.
Based on the remaining 1000 observations, calculate the mean and the
standard deviation of the time a customer spends in the system.
c. The calculation of the standard deviation may not be correct, due to the
presence of autocorrelation. Write a program (or use an existing statistical
150 Computer Simulation Techniques
package) to obtain a correlogram based on the above 1000 observations.
(You may graph the correlogram by hand!) Based on the correlogram,
calculate the batch size. Implement the batch means approach in your
program and run your program for 31 batches. Disregard the first batch, and
use the other 30 batch means to construct a confidence interval of the mean
time a customer spends in the system.
d. Using the batch means approach, implement a sequential procedure for
estimating the mean time a customer spends in the system (see section
5.6.2).
e. Implement a scheme to estimate the 95th percentile of the time a customer
spends in the system.
.
CHAPTER 6:
VALIDATION OF A SIMULATION MODEL
Validation of a simulation model is a very important issue that is often neglected. How
accurately does a simulation model (or, for that matter, any kind of model) reflect the
operations of a real-life system? How confident can we be that the obtained simulation
results are accurate and meaningful?
In general, one models a system with a view to studying its performance. This
system under study may or may not exist in real-life. Let us consider, for instance, a
communications equipment manufacturer who is currently designing a new
communications device, such as a switch. Obviously, the manufacturer would like to
know in advance if the new switch has an acceptable performance. Also, the
manufacturer would like to be able to study various alternative configurations of this new
switch so that to come up with a good product. The performance of such a switch can be
only estimated through modelling since the actual system does not exist. The question
that arises here is how does one make sure that the model that will be constructed is a
valid representation of the system under study?
Let us consider another example involving a communication system already in
operation. Let us assume that it operates nearly at full capacity. The management is
considering various alternatives for expanding the system's capacity. Which of these
alternatives will improve the system's performance at minimum cost? Now, these
alternative configurations do not exist. Therefore, their performance can be only
evaluated by constructing a model, say using simulation techniques. The standard method
is to construct a model of the existing system. Then, change the model appropriately in
order to analyze each of the above alternatives. The model of the existing system can be
152 Computer Simulation Techniques
validated by comparing its results against actual data obtained from the system under
investigation. However, there is no guarantee that when altering the simulation model so
that to study one of the above alternatives, this new simulation model will be a valid
representation of the configuration under study!
The following checks can be carried out in order to validate a simulation model.
1. Check the pseudo-random number generators. Are the pseudo-random numbers
uniformly distributed in (0,1) and do they satisfy statistical criteria of
independence? Usually, one takes for granted that a random number generator is
valid.
2. Check the stochastic variate generators. Similar statistical tests can be carried out
for each stochastic variate generator built into a simulation model.
3. Check the logic of the simulation program. This is a rather difficult task. One way
of going about it is to print out the status variables, the future event list, and other
relevant data structures each time an event takes place in the simulation. Then,
one has to check by hand whether the data structures are updated appropriately.
This is a rather tedious task. However, using this method one can discover
possible logical errors and also get a good feel about the simulation model.
4. Relationship validity. Quite frequently the structure of a system under study is not
fully reflected down to its very detail in a simulation model. Therefore, it is
important that the management has the opportunity to check whether the model's
assumptions are credible.
5. Output validity. This is one of the most powerful validity checks. If actual data are
available regarding the system under study, then these data can be compared with
the output obtained from the simulation model. Obviously, if they do not compare
well, the simulation model is not valid.
Validation 153
Computer assignments
Consider the machine interference problem. This problem can be also analyzed
using queueing theory. Set up the following validation scheme. Obtain exact
values of the mean time a machine is broken down using queueing theory results
for various values of the mean operational time. Let it vary, for instance, from 1 to
50 so that to get a good spread. For each of these values, obtain an estimate of the
mean down time of a machine using your simulation model. Graph both sets of
results. Be sure to indicate the confidence interval at each simulated point.
Compare the two sets of results.
Note: Remove the iterative option from the simulation. By now, you
should have a good idea as to how many batches and the batch size you will need
in order to get the required accuracy. So, use these values in all the experiments.
1. Consider the two-stage manufacturing system. As the buffer capacity of the
second queue increases, the probability that server 1 will get blocked upon service
completion due to queue 2 being full will decrease, and eventually will become
zero. At that moment, the two-stage manufacturing system is equivalent to two
infinite capacity queues in tandem. Now, if we assume that the percent of time
each machine is down is very small, i.e. the mean downtime divided by the sum
of the mean operational time and the mean downtime is less than 2%, then the
service time at each queue can be safely approximated by an exponential
distribution. Each queue then becomes an M/M/1 queue, and the mean waiting
time in the two-stage manufacturing system is equal to the mean waiting time W
1
in the first queue plus the mean waiting time W
2
in the second queue. The mean
waiting time in the first queue is given by the expression:
!
W
1
=1/[("
1
1
/(#
1
+ "
1
)) $ %], where
1
, 1/
1
and 1/
1
is the service rate, the mean
operational time and the mean downtime respectively at the first queue, and is
the arrival rate to the two-stage manufacturing system. Likewise, the mean
waiting time in the second queue is given by the expression:
!
W
2
=1/[("
2
2
/(#
2
+ "
2
)) $ %] where
2
, 1/
2
and 1/
2
is the service rate, the
154 Computer Simulation Techniques
mean operational time and the mean downtime respectively at the second queue.
Based on the above, carry out the following experiment.
Run the simulation to calculate the mean waiting time in the two-stage
manufacturing system for different buffer capacities of queue 2. Keep ,
1
1/
1
, 1/
1
,
2
, 1/
2
and 1/
2
the same for all the simulations. (Remember to fix the
mean downtime and mean operational times so that the mean downtime divided
by the sum of the mean operational time and the mean downtime is less than 2%).
Plot the mean waiting time against the buffer capacity of queue 2. Show that this
curve approximates W
1
+W
2
as calculated using the above expressions for the
M/M1 queue.
Note: Remove the iterative option for the simulation. By now, you should
have a good idea as to how many batches and the batch size you will need in
order to get the required accuracy. So, use these values in all the experiments.
CHAPTER 7:
VARIANCE REDUCTION TECHNIQUES
Variance
Reduction
7.1 Introduction
In Chapter 6, it was mentioned that the accuracy of an estimate is proportional to 1/ n ,
where n is the sample size. One way to increase the accuracy of an estimate (i.e., reduce
the width of its confidence interval) is to increase n. For instance, the confidence interval
width can be halved if the sample size is increased to 4n. However, large sample sizes
required long simulation runs which, in general, are expensive. An alternative way to
increasing the estimate's accuracy is to reduce its variance. If one can reduce the variance
of an endogenously created random variable without disturbing its expected value, then
the confidence interval width will be smaller, for the same amount of simulation.
156 Computer Simulation Techniques
Techniques aiming at reducing the variance of a random variable are known as Variance
Reduction Techniques. Most of these techniques were originally developed in connection
with Monte Carlo Techniques.
Variance reduction techniques require additional computation in order to be
implemented. Furthermore, it is not possible to know in advance whether a variance
reduction technique will effectively reduce the variance in comparison with
straightforward simulation. It is standard practice, therefore, to carry out pilot simulation
runs in order to get a feel of the effectiveness of a variance reduction technique and of the
additional computational cost required for its implementation.
In this Chapter, we will examine two variance reduction techniques, namely, a)
the antithetic variates technique and (b) the control variates technique.
7.2 The Antithetic Variates Technique
This is a very simply technique to use and it only requires a few additional instructions in
order to be implemented. No general guarantee of its effectiveness can be given. Also, it
is not possible to know in advance how much of variance reduction can be achieved.
Therefore, a small pilot study may be useful in order to decide whether or not to
implement this technique.
Let X be an endogenously created random variable. Let
x
(1)
1
, x
(1)
2
, ..., x
(1)
n
be n i.i.d. realizations of X obtained in a simulation run. Also, let
x
(2)
1
, x
(2)
2
, ..., x
(2)
n
be n i.i.d. observations of X obtained in a second simulation run. Now, let us define a
new random variable
Variance Reduction Techniques 157
z
i
=
x
(1)
i
+ x
(2)
i
2
, i = 1, 2, ..., n. (7.1)
More specifically, let Z=(X
(1)
+X
(2)
)/2, where X
(i)
, i=1,2, indicates the random variable X
as observed in the ith simulation run. We have
E(Z)= E\
[
)
X
(1)
+X
(2)
2
=
1
2
[E(X
(1)
) + E(X
(2)
)]
= E(X)
seeing that the expected value of X
(1)
or X
(2)
is that of X. Thus, the expected value of this
new random variable Z is identical to that of X. Now, let us examine its variance. We
have
Var(Z) = Var\
[
)
X
(1)
+X
(2)
2
=
1
4
[Var(X
(1)
) + Var(X
(2)
) + 2Cov(X
(1)
, X
(2)
)].
Remembering that Var(X
(1)
)=Var(X
(2)
)=Var(X), we have that
Var(Z) =
1
2
(Var(X) + Cov (X
(1)
, X
(2)
)) .
Since Cov(X,Y)= Var(X)Var(Y) , we have that
Var(Z) =
1
2
Var(X) (1 + ), (7.2)
158 Computer Simulation Techniques
where is the correlation between X
(1)
and X
(2)
.
In order to construct an interval estimate of E(X), we use random variable Z.
Observations z
i
are obtained from (7.1) and the confidence interval is obtained using
(7.2). As will be seen below, by appropriately constructing the two samples
x
(1)
1
, x
(1)
2
, ..., x
(1)
n
and x
(2)
1
, x
(2)
2
, ..., x
(2)
n
,
we can cause Var(Z) to become significantly less than Var(X). This is achieved by
causing to become negative. In the special case where the two sets of observations
x
(1)
1
, x
(1)
2
, ..., x
(1)
n
and x
(2)
1
, x
(2)
2
, ..., x
(2)
n
are independent of each other, we have that =0. Hence, Var(Z)=Var(X)/2.
The antithetic variates technique attempts to introduce a negative correlation
between the two sets of observations. As an example, let us consider a simulation model
of a single server queue, and let X and Y indicate the waiting time in the queue and the
interarrival time respectively. If Y is very small, then customers arrive faster and,
therefore, the queue size gets larger. The larger the queue size, the more a customer has
to wait in the queue, i.e. X is larger. On the other hand, if Y is large, then customers
arrive slower and, hence, the queue size gets smaller. Obviously, the smaller the queue
size, the less a customer has to wait in the queue, i.e., X is small. Therefore, we see that X
and Y can be negatively correlated.
This negative correlation between these two variables can be created in a
systematic way as follows. Let F(t) and G(S) be the cumulative distribution of the inter-
arrival and service time respectively. Let r
i
and v
i
be pseudo-random numbers. Then,
t
i
=F
-1
(r
i
) ands
i
=G
-1
(v
i
) are an interarrival and a service variate. These two variates can be
associated with the ith simulated customer. An indication of whether the queue is tending
to increase or decrease can be obtained by considering the difference d
i
=t
i
-s
i
. This
difference may be positive or negative indicating that the queue is going through a busy
Variance Reduction Techniques 159
or slack period respectively. Now, let us consider that in the second run, we associate
pseudo-random number r
i
and v
i
with the ith simulated customer, so that
d
i
= t
1
- s
i
(where t
1
=F
-1
(r
i
) and s
i
= G
-1
(v
i
))
has the opposite sign of d
i
. That is, if the queue was going through a slack (busy) period
in the first run at the time of the ith simulated customer, now it goes through a busy
(slack) period. It can be shown that this can be achieved by simply setting r
i
= 1-r
i
and
v
i
= 1-v
i
.
In this example, we make use of two controllable variables, Y
1
and Y
2
, indicating
the interarrival time and the service time respectively. These two random variables are
strongly correlated with X, the waiting time in the queue. Y
j
(1) and Y
j
(2), j=1,2 can be
negatively correlated by simply using the compliment of the pseudo-random numbers
used in the first run.
This technique can be implemented as follows. Simulate the single server queue,
and let
x
(1)
1
, x
(1)
2
, ..., x
(1)
n
be n i.i.d observations of X. Re-run the simulation, thus replicating the results, using
pseudo-random numbers (r
i
,v
i
)=(1-r,1-v
i
). Let
x
(2)
1
, x
(2)
2
, ..., x
(2)
n
,b
e realizations of X. Construct the interval estimate of E(X) using the random variable Z
as described above. Obviously, the correlation between the two samples of observations
is as good as the correlation between Y
(1)
j
and Y
(2)
j
, j=1,2.
The antithetic variates technique, as described above, was implemented in a
simulation of an M/M/1 queue. The random variable X is the time a customer spends in
160 Computer Simulation Techniques
the system. The i.i.d. observations of X were obtained by sampling every 10th customer.
The results given in table 7.1 were obtained using straight simulation. Using the antithetic
variates technique, we obtained a confidence interval of 13.521.76. We note that the
antithetic variates techniques were employed using two sets of observations each of size
equal to 300, i.e., a total of 600 observations. From table 7.1, we see that a similar width
was obtained using a sample size of n=1800. Figure 7.2 shows the actual values for the
original sample, the sample obtained using the antithetic variates and Z. We see, that the
two samples of observations are fairly negatively correlated. Also, we observe that the Z
values are all close to the mean, indicating that their variance is small.
Sample size n Confidence interval
600 13.86 +_ 3.46
900 13.03 +_ 2.70
1200 13.11 +_ 2.30
1500 12.82 +_ 1.99
1800 12.86 +_ 1.84
Table 7.1: Straight simulation of an M/M/1 queue.
In the above example, the antithetic variates technique worked quite well.
However, this should not be construed that this method always works well. In particular,
in the following example, an M/M/2 queuing system was simulated. Table 7.2 and figure
7.2 show that in this case there is little benefit to be gained from using the antithetic
variates technique.
Variance Reduction Techniques 161
1
5
.
0
2
5
.
0
3
5
.
0
4
5
.
0
5
5
.
0
5
.
0
5
1
0
1
5
2
0
2
5
3
0
1
S
i
m
u
l
a
t
e
d
N
u
m
b
e
r
o
f
C
u
s
t
o
m
e
r
s
Waiting Time Per Customer
O
r
i
g
i
n
a
l
S
a
m
p
l
e
A
n
t
i
t
h
e
t
i
c
V
a
r
i
a
t
e
s
M
e
a
n
o
f
T
w
o
S
a
m
p
l
e
s
Figure 7.1: Antithetic variates technique applied to an M/M/1 queue.
162 Computer Simulation Techniques
Type of Simulation Sample
Size
Mean Standard
Dev.
Conf.
Interval
Standard
Error
Standard
Error as a
% of
Mean
Cost
Straight 400 18.85 9.70 +/-3.31 1.69 8.96 $.68
Straight 800 16.00 8.60 2.07 1.06 6.61 .72
Standard Antithetic 800 17.23 6.73 2.30 1.17 6.79 .97
Straight 1600 16.04 9.67 1.64 0.84 5.22 .79
Standard Antithetic 1600 15.69 5.98 1.44 0.74 4.69 1.03
Straight 2400 16.48 9.82 1.36 0.69 4.21 .88
Standard Antithetic 2400 15.84 6.36 1.25 0.64 4.01 1.09
Straight 3000 15.92 9.59 1.19 0.61 3.81 .93
Standard Antithetic 3000 16.11 6.96 1.17 0.60 3.72 1.12
Table 7.3: Straight simulation and antithetic variates techniques for an M/M/2 queue.
0.4
0.8
1.2
1.6
$
#
$
800 1600 2400 3200
$
$
$
$
$
#
#
#
Sample Size
S
t
a
n
d
a
r
d
E
r
r
o
r
$!Straight Simulation
#!Standard Antithetic Variate Technique
Figure 7.2: Standard error plotted against sample size for straight simulation and antithetic
variates techniques for an M/M/2 queue.
7.3 The Control Variates Technique
This method is otherwise known as the method of Concomitant Information. Let X be an
endogenously created random variable whose mean we wish to estimate. Let Y be
another endogenously created random variable whose mean is known in advance. This is
Variance Reduction Techniques 163
known as the control variable. Random variable Y is strongly correlated with X. We have
the following two cases.
a) X and Y are negatively correlated:
Define a new random variable Z so that Z=X+Y-E(Y). We have
E(Z)=E(X+Y-E(Y))=E(X),
Var(Z) = Var(X) + Var(Y) + 2 Cov (X, Y).
Since X and Y are negatively correlated, we have that Cov(X,Y)<0. Therefore, if
Var(Y) - 2
| |
Cov(X,Y) < 0 then, a reduction in the variance of Z has been
achieved.
b) X and Y are positively correlated:
Define Z=X-Y+E(Y). Then
E(Z) = E(X - Y + E(Y)) = E(X).
Var(Z) = Var(X) + Var(Y) - 2
| |
Cov(X,Y)
Therefore, if Var(Y) - 2
| |
Cov(X,Y) < 0 then a reduction in the variance of Z has
been achieved.
Let us consider the example of a single server queue mentioned in section 7.2. Let
X be the time a customer spends in the system. Then X is negatively correlated with the
random variable Y representing the inter-arrival time. (It is also positively correlated with
the random variable representing the service time.) Let x
1
, x
2
, ..., x
n
be n i.i.d.
observations of X. Likewise, let y
1
, y
2
, ..., y
n
be n observations of Y. (These observations
164 Computer Simulation Techniques
are i.i.d. by nature of the simulation model.) y
i
is the inter-arrival time associated with
the x
i
observation. Let
z
i
= x
i
+ y
i
- E(Y), i=1,2,..., n.
Then we can construct a confidence interval for the estimate of E(X) using Z
_
+1.96
s
z
n
where
Z
_
=
1
n
i=1
n
z
i
and
s
2
z
=
!
1
n "1
i=1
n
#
(z
i
"Z)
2
.
More generally, random variable Z can be obtained using
Z = X - a (Y - E(Y)),
where a is a constant to be estimated and Y is positively or negatively correlated to X.
Again, we have E(Z)=E(X). Also,
Var(Z) = Var(X) + a
2
Var(Y) - 2a Cov(X,Y)
so that Z has a smaller variance than X if
a
2
Var(Y) - 2a Cov(X,Y) < 0.
We select a so that to minimize the right-hand side given in the above expression. We
have
Variance Reduction Techniques 165
2a Var(Y) - 2Cov(X,Y) = 0
or
a
*
=
Cov (X,Y)
Var (Y)
Now, substituting into the expression for Var(Z) we have
Var(Z) = Var(X) -
[Cov(X,Y)]
2
Var(Y)
= (1-
2
XY
) Var(X).
Thus, we always get a reduction in the variance of Z for the optimal value of a, provided
that X and Y are correlated. The determination of a
*
requires a priori knowledge of the
Var(Y) and Cov (X,Y). Sample estimates can be used in order to approximately obtain
a
*
.
The definition of Z can be further generalized using multiple control variables, as
follows
Z = X -
i=1
m
a
i
(Yi - E(Y
i
)) ,
where a
i
, i=1,2,...,m, are any real numbers. In this case,
Var(Z) = Var(X) +
i=1
m
a
2
i
Var(Y
i
) - 2
i=1
m
a
i
Cov(X,Y
i
) + 2
i=2
m
j=1
i-1
a
i
a
j
Cov(Y
i
,Y
j
).
166 Computer Simulation Techniques
Computer assignments
1. Consider the machine interference problem. Carry out the following tasks:
a. Implement the antithetic variance reduction technique.
b. Implement the control variates technique.
c. Compare the above two variance reduction techniques against straight
simulation. In particular, compare the three techniques for various sample
sizes. Observe how the variance and the standard error expressed as a
percentage of the mean, educe as the sample size goes up. Contrast this
against the execution cost (if available).
All rights reserved 2008
168 Computer Simulation Techniques