Simulation Control (Basic)

The PLT Scheme Simulation Collection provides functionality for basic simulation control. Basic simulation control includes the simulation main loop for controlling the execution of events and processes, scheduling events and processes, and simulating passing of (simulated) time (i.e. waiting and working).

4.1  Scheduling Events and Processes

One of the main characteristics of discrete simulation models is the ability to schedule procedural simulation elements (e.g. events and processes) to occur at specified (simulated) times. Typically, an event list is maintained that contains entries for each of the scheduled elements.

In the simulation collection, each simulation environment has three such event lists: the now event list, the future event list, and the continuous event list. The now event list contains entries for elements that are to be executed before the simulation clock is advanced, i.e. now. The future event list contains entries for elements that are to be executed in the (simulated) future. The continuous event list is used for continuous simulation models and is described in Chapter 10 Continuous Simulation Models.)

schedule

Macro:
(schedule now (function . arguments)
          [#:priority priority])
(schedule (at time) (function . arguments)
          [#:priority priority])
(schedule (in duration) (function . arguments)
          [#:priority priority])
(schedule (when event) (function . arguments)
          [#:priority priority])
(schedule time (function . arguments)
          [#:priority priority])

This macro schedules events and processes for execution, optionally with a specified priority. If function is the name of a process, then a process instance is created and scheduled for execution using the specified arguments at the specified time. Otherwise, function must evaluate to a procedural object and the function is scheduled to be applied to the specified arguments at the specified time. If simulation-environment is not supplied, (current-simulation-environment) is used.

The time is specified using one of the following forms:

4.2  Controlling the Simulation Main Loop

start-simulation

Function:
(start-simulation)

Contract:

(-> any)

Begin execution of the simulation main loop in the current simulation environment. It saves the loop-next and loop-exit continuations in the current simulation environment. It then executes events and processes from the event list(s) until either there are no more to be executed, or the simulation main loop is explicitly exited.

The following pseudo code shows the processing for the main loop, including continuous simulation models.

simulation main loop:
  save the exit continuation
  loop:
    save the next continuation
    if the now event list is not empty
      execute the next now (discrete) event
    else if the future event list is not empty
      if the continuous event list is not empty
        execute the continuous events until
              the time of the next future event
        ;; this may terminate early and reenter
        ;; the loop via the next continuation
      else
        execute the next future (discrete) event
    else
      if the continuous event list is not empty
        execute the continuous events forever
        ;; this may terminate early and reenter
        ;; the loop via the next continuation
        ;; otherwise, the loop would never end
      else
        exit
  end loop
end simulation main loop

stop-simulation

Function:
(stop-simulation)

Contract:

(-> any)

Terminates execution of the simulation main loop running in the current simulation environment. It calls (current-simulation-loop-exit).

A convenient usage of stop-simulation is to schedule its execution at a point in time the execution is to run until. For example:

(schedule (at 1000.0) (stop-simulation))

will cause the simulation to end at (simulated) time 1000.0. [Note that it may terminate earlier if at any earlier (simulated) time there are no more events to execute.]

4.3  Simulating Waiting and Working

wait/work

wait

work

Function:
(wait/work delay)
(wait delay)
(work delay)

Contract:

(-> real? any)

The wait/work function simulates the passage of (simulated) time. The event or process calling the function will wait for the specified delay. wait and work are aliases for the wait/work function.