Probability

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

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.