More on Simulations


Probability

Resources

Key Distinction:

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 Distinction: Implemented in task methods (i.e., software doesn't help maintain the distinction)

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.


News Page | CS2390 Sum'97 Home Page | MMC-CaMILE | STABLE
Questions/comments/concerns to guzdial@cc.gatech.edu
Page last updated 7/28/97; 10:13:05 AM