Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2013_1 / КМод / simulSqueak.pdf
Скачиваний:
133
Добавлен:
23.02.2015
Размер:
1.24 Mб
Скачать

SmallSym run. "Запуск модели на исполнение"

"Показать состояние счетчика и число сгенерированных им­ пульсов"

PopUpMenu inform: 'Число сгенерированных = ',(s1 print­ String) ,', Число подсчитанных = ',(s2 printString) .

"Освободить ресурсы интерпретатора" SmallSym free.

Smalltalk removeKey: #SmallSym.

В приведенном примере можно не заботиться о фактическом окончании порожденных подпроцессов, связанных с переменной continue. По оконча­ нии работы главной программы встроенный механизм управления памятью си­ стемы Smalltalk сам освободит все ранее занятые ресурсы, так как на них не останется ссылок.

5.4 Протоколирование результатов моделирования

Для наблюдения за результатами моделирования средствами языка Small­ talk разработан класс MyLog, позволяющий собирать протокол событий в моде­ ли.

Object subclass: #MyLog

instanceVariableNames: 'time who cod event ' classVariableNames: 'Log '

poolDictionaries: '' category: 'Simulation'

“Методы экземпляра” add

"Add record" Log add: self

cod ^cod

cod: aDetal

cod := aDetal

event ^event

40

event: aEvent

event := aEvent

 

 

 

time

 

 

 

^time.

 

 

 

time: aTime

 

 

 

time := aTime

 

 

 

who

 

 

 

^who

 

 

 

who: aSt

 

 

 

who:= aSt

 

 

 

“Методы класса”

 

 

 

clearLog

 

 

 

"Clear protocol"

 

 

 

Log := OrderedCollection new

 

log

 

 

 

"Return protocol"

 

 

 

^Log

 

 

 

showAndSaveTo: aFileName

 

 

| lines |

Who

Дcode

Event'.

lines := 'Time

Log do:

 

 

 

[ :ev |

 

 

 

lines := lines, (ev time

printString), '

',

(ev who printString), '

',

 

(ev cod printString), '

',

 

(ev event printString), '

 

'.

 

 

].

 

 

(StringHolder new contents: lines)

 

openLabel: 'Simulation protocol ',

 

Date today printString, ' / ',

 

Time now print24.

 

lines;

(FileStream fileNamed: aFileName) nextPutAll:

close.

 

 

Для сбора статистики о параметрах модели разработан класс MyStat.

41

Object subclass: #MyStat

instanceVariableNames: 'list min max delta col num sum' classVariableNames: ''

poolDictionaries: '' category: 'Simulation'

Методы экземпляра

average

"Average value"

(num = 0) ifTrue: [ num := 1 ]. ^(sum / num) asFloat

col

"Amount of values"

^col

list ^list

min: aMin max: aMax col: aNum

"To Initiate new histogram"

min := aMin. max := aMax. col := aNum.

delta := (max - min)/aNum asFloat. list := OrderedCollection new.

(0 to: (col + 1) by: 1) do: [:i | list add: 0 ]. num := 0.

sum := 0

min: aMin max: aMax delta: aDelta "To Initiate new histogram"

| |

min := aMin. max := aMax.

col := ((max - min)/aDelta asFloat) truncated. delta := (max - min)/col asFloat.

list := OrderedCollection new.

(0 to: (col + 1) by: 1) do: [:i | list add: 0 ]. num := 0.

sum := 0

42

num

"Amount of values"

^num

put: aValue

"To Add in statistics" | i v |

((aValue - min) < 0.0) ifTrue: [ i := 1 ]. ((aValue - min) < 0.0) ifFalse:

[i := (((((aValue - min) / delta) + 0.0) asFloat) truncated) + 2].

(i > (col + 2)) ifTrue: [ i := col + 2 ]. v := (list at: i) + 1.

list at: i put: v. num := num + 1.

sum := sum + aValue.

show: aTitle

"To Build and show histogram"

| v vv sv lv svv sg sgg pr n lines |

lines := 'Amount of data=', (num printString), '; Total=', (sum printString),

'; Average value=', (self average printString),

'

 

'.

Frequency

lines := lines, ' Interval

'.

 

pr := '<'.

 

(1 to: (col + 2) by: 1) do:

 

[:i |

n := i.

(i = (col + 2)) ifTrue: [ pr := '>'. n := i - 1 ]. sgg := (((((min + ((n - 1) * delta)) * 100.0)

asFloat truncated) / 100.0) printString). sg := pr, sgg.

pr := sgg, ' - '. lv := sg size.

(1 to: (20 - lv) by: 1) do: [:j | sg := sg, ' ' ]. v := (((((list at: i ) / num) * 10000)

asFloat truncated) / 10000) asFloat. vv := (v * 20.0 * col) truncated.

sv := (v printString). lv := sv size.

(1 to: (10 - lv) by: 1) do: [:j | sv := sv, ' ' ]. sv := sv, '|'.

43