Probability
- Uniform from: aNumber to: aNumber
- Normal mean: aNumber deviation: aNumber
- Exponential mean: aNumber
- SampleSpace data: aList
- Bernoulli parameter: aNumber
- Binomial events: aNumber mean: aNumber
Resources
Key Destinction:
Simple Resource: Only one object needs to know
acquire: amount ofResource: resourceName
produce: amount ofResource: resourceName
release: aStaticResource
Coordinated Resource: More than one object needs to know
coordinate: resourceName
acquireResource: resourceName
produceResource: resourceName
resume: anEvent
Whether a resource is simple or coordinated depends on your model
Secondary Destinction: Implemented in task methods
- Fixed & Consumable (aquired but not released)
- Fixed & Non-Consumable (aquired and released)
- Fluctuating (aquired and produced, may be released)
NothingAtAll with Fixed, Consumable Resources
Nothing at all initialization methods
defineResources
self produce: 15 of: 'Jelly Beans'.
defineArrivalSchedule
self scheduleArrivalOf: Visitor
accordingTo: (Uniform from: 1 to: 3).
Visitor Task method
tasks
self aquire: 2 ofResource: 'Jelly Beans'.
self holdFor: 2.
Sample output:
0.0 Visitor 1 enters
2.0 Visitor 1 exits
2.03671 Visitor 2 enters
4.03671 Visitor 2 exits
4.34579 Visitor 3 enters
5.92712 Visitor 4 enters
6.34579 Visitor 3 exits
7.92712 Visitor 4 exits
8.46271 Visitor 5 enters
10.4627 Visitor 5 exits
10.5804 Visitor 6 enters
12.5804 Visitor 6 exits
12.7189 Visitor 7 enters
14.7189 Visitor 7 exits
15.0638 Visitor 8 enters
17.6466 Visitor 9 enters
19.8276 Visitor 10 enters
tasks
(self inquireFor: 2 ofResource: 'Jelly Beans') ifTrue:
[self aquire: 2 ofResource: 'Jelly Beans'.
self holdFor: 2].
Coordinated Resource Example: A Car Wash
Simulation subclass: CarWash
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
catagory: 'Simulation-Demos'
defineArrivalSchedule
self scheduleArrivalOf: Wash
accordingTo: (Exponential mean: 20).
self scheduleArrivalOf: WashAndWax
accordingTo: (Exponential mean: 30).
self scheduleArrivalOf: (Washer new) at: 0.0.
defineResources
self coordinate: 'CarCustomer'
SimulationObject subclass Washer
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
catagory: 'Simulation-Demos'
tasks
| carRequest |
[true] whileTrue:
[carRequest := self aquireResource: 'CarCustomer'.
(carRequest condition wants: 'wash') ifTrue:
[self holdFor: (Uniform from: 12.0 to 26.0) next].
(carRequest condition wants: 'wax') ifTrue:
[self holdFor: (Uniform from: 8.0 to 12.0) next].
self resume: carRequest.
SimulationObject subclass Wash
instanceVariableNames: 'service'
classVariableNames: ''
poolDictionaries: ''
catagory: 'Simulation-Demos'
wants: aService
^service includes: aService
initialize
super initalize.
service := #('wash').
tasks
self produceResource: 'CarCustomer'
Wash subclass WashAndWax
instanceVariableNames: 'service'
classVariableNames: ''
poolDictionaries: ''
catagory: 'Simulation-Demos'
initialize
super initalize.
service := #('wash' 'wax').
More Complex Simulation -- Bank Teller
Simulation subclass Bank Simulation
instanceVariableNames: ''
classVariableNames: 'Hour'
poolDictionaries: ''
catagory: 'Simulation-Demos'
defineArrivalSchedule
self scheduleArrivalOf: BankCustomer
accordingTo: (Normal mean: 10 deviation: 5)
startingAt: 9 * Hour.
self scheduleArrivalOf: (BankTeller name: 'first')
at: 9 * Hour.
self scheduleArrivalOf: (BankTeller name: 'second')
at: 9 * Hour.
self scheduleArrivalOf: BankCustomer
accordingTo: (SampleSpaceWithoutReplacement
data: ((1 to: 20 collect [:i|3]))
startingAt: 12 * Hour.
self schedule: [self hireMoreTellers] at: 12 * Hour.
self schedule: [self finishUp] at: 15 * Hour.
defineResources
self coordinate: TellerCustomer
hireMoreTellers
self schedule: [(LunchtimeTeller name: 'first') startUp
after: 0.0.
self schedule: [(LunchtimeTeller name: 'second') startUp
after: 0.0.
SimulationObject subclass BankCustomer
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
catagory: 'Simulation-Demos'
tasks
self produceResource: 'TellerCustomer'
SimulationObject subclass BankTeller
instanceVariableNames: 'service'
classVariableNames: ''
poolDictionaries: ''
catagory: 'Simulation-Demos'
tasks
| customerRequest |
[true] whileTrue: [
(self numberOfProvidersOfResource: 'TellerCustomer' > 0)
ifTrue: [self counterWork]
ifFalse: [self deskWork]]
counterWork
| customerRequest |
customerRequest := self acqureResource: 'TellerCustomer'.
self holdFor: (Uniform from: 2 to: 15) next.
self resume: customerRequest.
deskWork
self holdFor: (Uniform from: 1 to 5) next
BankTeller subclass LunchtimeTeller
instanceVariableNames: 'getDone'
classVariableNames: ''
poolDictionaries: ''
catagory: 'Simulation-Demos'
initialize
super initialize
getDone := false.
(Simulation active) schedule: [self finishUp] after: 60.
finishUp
getDone
ifTrue: [super finishUp]
ifFalse: [getDone := true]
tasks
getDone whileFalse: [self counterWork].
self finishUp.