A Simple Discrete-Event Simulation: Part 10

Today I defined some new entities that better illustrate the operation of the wait mechanism and the current events queue, which I have modified so it scans the list of current items repeatedly until no conditions are met. Here’s the modified version.

I then created an entity that simply advances to a time, sets a flag, and destroys itself. Note that the flag has to be implemented as an object so it can be passed by reference. Here’s the flag object (see note below) and two instantiations.

Here’s the entity that sets the flag.

I also created an entity that checks the flag and destroys itself when the condition becomes true.

Finally, I created two instantiations of each entity. The idea is for the entity4 types to wait for some period (times 45.0 and 63.7, respectively) and then set the flags which represent the entity5 unblock conditions, and for the entity5 types to check to see if their unblock conditions have been met (via the ceq.processCeq() call) each time a new future event is processed.

The output indicates that things appear to be working as intended.

104 minutes

entity 1 created at time 0
entity 2 created at time 0
entity 3 created at time 0
entity 4 created at time 0
entity 5 created at time 0
entity 6 created at time 0
entity 7 created at time 0
entity 8 created at time 0
entity 4 reports at time 0 executions: 0
entity 7 still blocked at time 0 flag value: false flag1: false flag2: false
entity 8 still blocked at time 0 flag value: false flag1: false flag2: false
entity 5 sets flag at time 0 flag value: false flag1: false flag2: false
entity 7 still blocked at time 0 flag value: false flag1: false flag2: false
entity 8 still blocked at time 0 flag value: false flag1: false flag2: false
entity 6 sets flag at time 0 flag value: false flag1: false flag2: false
entity 7 still blocked at time 0 flag value: false flag1: false flag2: false
entity 8 still blocked at time 0 flag value: false flag1: false flag2: false
entity 1 updated at time 11
entity 7 still blocked at time 11 flag value: false flag1: false flag2: false
entity 8 still blocked at time 11 flag value: false flag1: false flag2: false
entity 3 updated at time 12 position: -40
entity 7 still blocked at time 12 flag value: false flag1: false flag2: false
entity 8 still blocked at time 12 flag value: false flag1: false flag2: false
entity 2 updated at time 13
entity 7 still blocked at time 13 flag value: false flag1: false flag2: false
entity 8 still blocked at time 13 flag value: false flag1: false flag2: false
entity 3 updated at time 19.009999999999998 position: -35
entity 7 still blocked at time 19.009999999999998 flag value: false flag1: false flag2: false
entity 8 still blocked at time 19.009999999999998 flag value: false flag1: false flag2: false
entity 1 updated at time 21
entity 7 still blocked at time 21 flag value: false flag1: false flag2: false
entity 8 still blocked at time 21 flag value: false flag1: false flag2: false
entity 2 updated at time 26
entity 7 still blocked at time 26 flag value: false flag1: false flag2: false
entity 8 still blocked at time 26 flag value: false flag1: false flag2: false
entity 3 updated at time 26.019999999999996 position: -30
entity 7 still blocked at time 26.019999999999996 flag value: false flag1: false flag2: false
entity 8 still blocked at time 26.019999999999996 flag value: false flag1: false flag2: false
entity 1 updated at time 31
entity 7 still blocked at time 31 flag value: false flag1: false flag2: false
entity 8 still blocked at time 31 flag value: false flag1: false flag2: false
entity 3 updated at time 33.029999999999994 position: -25
entity 7 still blocked at time 33.029999999999994 flag value: false flag1: false flag2: false
entity 8 still blocked at time 33.029999999999994 flag value: false flag1: false flag2: false
entity 2 updated at time 39
entity 7 still blocked at time 39 flag value: false flag1: false flag2: false
entity 8 still blocked at time 39 flag value: false flag1: false flag2: false
entity 3 updated at time 40.03999999999999 position: -20
entity 7 still blocked at time 40.03999999999999 flag value: false flag1: false flag2: false
entity 8 still blocked at time 40.03999999999999 flag value: false flag1: false flag2: false
entity 1 updated at time 41
entity 7 still blocked at time 41 flag value: false flag1: false flag2: false
entity 8 still blocked at time 41 flag value: false flag1: false flag2: false
entity 5 terminated at time 45 flag value: true flag1: true flag2: false
entity 7 unblocks at time 45 flag value: true
entity 8 still blocked at time 45 flag value: false flag1: true flag2: false
entity 3 updated at time 47.04999999999999 position: -15
entity 8 still blocked at time 47.04999999999999 flag value: false flag1: true flag2: false
entity 1 updated at time 51
entity 8 still blocked at time 51 flag value: false flag1: true flag2: false
entity 2 updated at time 52
entity 8 still blocked at time 52 flag value: false flag1: true flag2: false
entity 3 updated at time 54.05999999999999 position: -10
entity 8 still blocked at time 54.05999999999999 flag value: false flag1: true flag2: false
entity 1 updated at time 61
entity 8 still blocked at time 61 flag value: false flag1: true flag2: false
entity 3 updated at time 61.069999999999986 position: -5
entity 8 still blocked at time 61.069999999999986 flag value: false flag1: true flag2: false
entity 6 terminated at time 63.7 flag value: true flag1: true flag2: true
entity 8 unblocks at time 63.7 flag value: true
entity 2 updated at time 65
entity 3 waiting at time 68.07999999999998 wait count: 4
entity 1 updated at time 71
entity 3 waiting at time 75.08999999999999 wait count: 3
entity 2 updated at time 78
entity 1 updated at time 81
entity 3 waiting at time 82.1 wait count: 2
entity 3 waiting at time 89.11 wait count: 1
entity 2 updated at time 91
entity 1 updated at time 91
entity 3 waiting at time 96.12 wait count: 0
entity 1 terminated at time 101
entity 3 terminated at time 103.13000000000001
entity 2 terminated at time 104

As an aside I was reading up on some things related to this mod and discovered that I’ve apparently been using the closure pattern and not the prototypal pattern for creating objects. As I understand it on first reading, the closure pattern carries the overhead of the entire object with each instantiation, while the prototypal pattern causes the method mechanisms to be instantiated only once while the created objects contain only the relevant data and a reference to the prototype mechanisms. This may be important because discrete event simulations can involve huge numbers of entities and we wouldn’t want to carry any more overhead than absolutely necessary. I’ll definitely have to look into this more going forward.

This entry was posted in Simulation and tagged , . Bookmark the permalink.

Leave a Reply