
- •1.3.3. Классы
- •1.3.4. Возможность применения в специальных областях
- •2.1. Синтаксис
- •2.2. Семантика ,; V-
- •2.2.1. Подклассы
- •2.2.2. Сочленение . -
- •2.2.3. Виртуальные величины
- •4.3.2.2. Генераторы объектов ,
- •4.3.2.3. Локальный объект
- •4.3.2.4. Оперативная квалификация «
- •7. Дистанционное обращение
- •7.1.2. Семантика
- •10.8.2. Семантика
- •11.3.2. Семантика
- •1 12.1. Последовательности псевдослучайных чисел
- •14.2.1.2. Семантика-
1 12.1. Последовательности псевдослучайных чисел
Все.процедуры случайной выборки в языке СИМУЛА-67 используют один и тот же прием получения «главной вы борки» из равномерного распределения на интервале (0,1). :■ Процедура главной выборки заменяет значение указанной целой переменной, скажем £/, новым значением в соответ ствии с некоторым алгоритмом, определяемым в данной реа лизации языка. Например, для двоичных машин удобен сле дующий алгоритм: ■ ■
иш = остаток (
где Ui есть i-e значение переменной U. Можно показать, что если f/o — положительное нечетное число, то такими же будут и все Ui и последовательность £/0/ U\y U% ..., периодическая с периодом 2п~2. (Младшие два бита значений U остаются неизменными, тогда ка-к прочие пробегают все возможные комбинации.) • . .
Вещественные числа щ = Ui X 2~п принадлежат интервалу (0,1). Последовательность щ, и2, ... называется последовательностью псевдослучайных чисел и щ (/=='1, 2, ,..)
является i-й результатом главной выборки из последовательности U. Последовательность однозначно определяется начальным значением i/o» соответствующей целой переменной. Тем не менее она является «хорошим приближением» к настоящей последовательности случайных чисел.
12.2, ПРОЦЕДУРЫ СЛУЧАЙНОГО ВЫБОРА
Каждая из перечисленных далее процедур осуществляет случайный выбор того или иного рода. Если явно не указано противного, выбор выполняется посредством одной процедуры ^главной выборки, т. е. процедуры с побочным эффектом продвижения на один шаг по указанной последовательности псевдослучайных чисел. Для формальных параметров процедур случайного выбора в случае необходимости выполняется преобразование типа фактических параметров, кроме последнего фактического параметра, которым всегда должна быть 'переменная типа integer, указывающая последовательность псевдослучайных чисел.
-Г I
1.'Boolean procedure draw (a, U)\ name U\ real a\ integer U\
Доставляет значение true с вероятностью а и значение false с вероятностью 1 — а. При а ^ 1 всегда доставляет значение true, а при а^О всегда доставляет значение false.
b
2. integer procedure randint (a, b9 U)\ name U\ integer a, b, U;
Доставляет с равной вероятностью одно из целых значений: а, а + 1, ..., b — 1, b. Предполагается, что b^-а; при b < а выдается сообщение об ошибке.
3. real procedure uniform {a, b, U); name U; real a, b; integer U\ , -
. 'Доставляет значение, равномерно распределенное по полусегменту [а, 6). При b < а выдается сообщение об ошибке.
4. real procedure normal (a, b% U); name U; real a, b \ integer U;
Доставляет значение, распределенное по нормальному закону со средним а и стандартным отклонением Ь. Применяется аппроксимационная формула для нормальной функции распределения !).
' ) См. Abramowitz M., Stegun I. A. (ed), Handbook of Mathematical Functions, National Bureau of Standard. Applied Mathematics Series, Ns 55, стр. 952 и формула (26.2.23) на стр. 933.
5. real procedure negexp (a, U); name U; real a; integer [/; r
Доставляет значение, распределенное по экспоненциальному закону со средним Ца. Эго значение определяется по формуле —In (и) /а, где и получается процедурой главной выборки. Это совпадает с временем ожидания события при пуассоновском распределении числа наступлений события, если их среднее число в единицу времени равно а,
6. integer procedure Poisson (at U); name U; real a; integer U\
Доставляет значение, распределенное по закону Пуассона с параметром а. Это значение получается в результате (п + 1)-кратной главной выборки, доставляющей значения uo,ui7 ..., иП9 где п определяется как наименьшее неотрицательное целое, для которого
п
0
/
Это п и является значением процедуры. Справедливость ис пользуемой формулы следует из эквивалентности ее с
п
где в левой части стоит сумма «времен ожидания», распределенных по экспоненциальному закону. Если параметр больше, чем некоторая определенная при реализации граница, например больше чем 20.0, то искомое значение может быть аппроксимировано выражением entier (normal (a, sqrt (a), U) + + 0.5) или нулем, если получается- отрицательное значение.
7. real procedure Erlang (a, b, U)\ name U\ integer U; real a, b ;
Доставляет значение, распределенное по закону Эрланга
со'средним 1/а и стандартным отклонением l/(a yb)- Это значение определяется при целом Ь в виде суммы
ь
S
" \ (здесь щ — значения главной выборки),
а при нецелом 6 —в виде
1и(«|)
aXb aXb *
где с — entier (6). И а и b должны быть положительными
1 8. integer procedure discrete (A, £/); name U\ array A;
integer U ; ' . . . , ": ' ., r
■"■ Одномерный массив А дополняется справа элементом, рав ным 1, и интерпретируется как интегральная функция рас пределения, аргументом которой является индекс. Массив А предполагается имеющим тип real. Доставляемое целочис ленное значение лежит в пределах [нижнгр,. верхнгр + 1], где нижнгр и верхнгр суть нижняя й верхняя границы индекса массива А. Оно определяется как наименьшее /, для которого А [I] > и, где и есть значение главной выборки и А [верхнгр + + 1]= 1. < . .
9. real procedure linear (Л, В, £/); name U; array Л,-В; integer U ;
Доставляемое значение распределено в соответствии с интегральной функцией распределения F, получающейся линейной интерполяцией из неравношаговой таблицы, определенной массивами А и В так, что A [i] = F(B [/]).
. Предполагается, что А и В суть одномерные веществен ные массивы одинаковой длины, что первый и последний элементы массива А равны соответственно нулю и единице и что Л[/]>Л[/], B[i] > ВЦ] при / > /. Если какие-либо из этих условий не выполняются, результат процедуры зависит от конкретных способов реализации. 1" .
1 я
. 10. integer procedure histd (Л, U)\ name U\ array Л; integer £/; r '
Доставляет целочисленное значение в пределах [нижнгр, верхнгр], где нижнгр и верхнгр суть нижняя и верхняя границы индекса одномерного массива А. Этот массив интер-. претируется как гистограмма, определяющая относительную. частоту требующего значения индекса.
13. СЛУЖЕБНЫЕ ПРОЦЕДУРЫ
i
Определена следующая процедура: procedure histo (Л, В, с, d)\ array Л, В ; real с, d;
Эта процедура обновляет гистограмму, определенную одномерными массивами Л и В в соответствии с наблюденным значением с с весом d. При этом Л [i\ возрастает на d, где / есть наименьшее целое, удовлетворяющее неравенству с < *СВ[{\. Предполагается, что длина -массива Л на единицу, больше длины массива В. Последний элемент массива А отвечает наблюденным значениям, превосходящим все
ния В [{{. Процедура допускает параметры типов real и integer в любой комбинации.
Если условие, накладываемое на длины массивов А и £, .це выполняется, то результат процедуры зависит от конкретных способов ее реализации.
14.1.3. Класс link
14.1.3.1. Определение
linkage class link;
begin procedure out; ■ l
if SUC = / = none then
begin SUC. PRED : - PRED ; PRED.SUC:-SUC; SUC: -PRED:-none ' end out; procedure follow (X); ref (linkage) X;
begin out; ■ ~
if X = / = none then
begin if X. SUC = / = none then begin PRED:-X;
SUC:-X.SUC;
SUC. PRED : - X. SUC: -
this linkage end end
end follow;
procedure precede (X)\ ref (linkage) X; begin out;
if X = / = none then
begin if X. SUC = / = none then begin SUC:-A';
PRED:-X. PRED;
PRED. SUC : - X. PRED : -
this linkage
end
end ■ ' -
end precede;
procedure into (S); ref (head) S] begin out;
if S = I = none then begin SUC:-S;
PRED :-$. PRED;
PRED . SUC : - S. PRED : -
this linkage f end w
end into; end link; »
14.1.3.2. Семантика
1 ч
Объекты, принадлежащие к подклассам класса link, могут становиться членами наборов. В каждый данный мрменг объект может быть членом только одного набора.
В дополнение к процедурам sue и pred имеются еще1 че тыре процедуры, связанные с каждым объектом класса link: out, follow, precede и into. " ■
Процедура out удаляет объект из набора, членом кото рого он является (если объект имеет членство в наборе). Если объект не состоит ни в каком наборе, то вызов про цедурной не влечет за собой никаких последствий. ' Процедуры follow и precede' удаляют объект из набора, членом которого он является (если объект имеет членство в наборе), и вставляют его в некоторый набор в указанную по зицию. Набор и позиция задаются параметром типа ref (lin kage). Если этот параметр имеет значение попе, или не имеет членства в наборе, или не является головой набора, то вызов процедур follow и precede имеет тот же эффект, что и вызов out (за исключением возможных последствий вычисления зна чения фактического параметра)*. В противном случае объект включается непосредственно <*вслед за» ^(follow) или непо средственно «перед» (precede) тем объектом класса linkage, на который указывает параметр.- "
Процедура into, которая имеет параметр типа ref (head), удаляет объект из набора, членом которого он является ^если объект имеет членство в наборе), и включает его в ка честве последнего члена в набор, указанный параметром. Если параметр есть попе, то вызов процедуры into имеет тот же эффект, что и вызов процедуры out (за исключением воз-1 можных последствий вычисления значения фактического па раметра), ' i ,
*
14.1.4. Класс head - " .. j
w
14Л.4.1. Определение
linkage class head; ;
begin ref (link) procedure first; first:— sue;
ref (link) procedure last;, last:— pred; .■• - Boolean procedure empty; _ :.
, . - l- empty:== SUC ===== this linkage; -:
integer procedure cardinal; - .
■ begin integer /; ref (linkage) X; « ■
. , , •-.-A: —this linkage; \. - '
for X: — X. sue while X = / = none . - - ,- ^ do /:=/+ 1 ;>
cardinal: = / ,
end cardinal; ,
procedure clear;
begin ref (link) X\
for X: — first while X = / = none do
'* . л - X.out
end clear;
. " SUC:-PRED:-this linkage , end head; .
14.1.4.2. Семантика
Объект класса head или подкласса класса head служит для представления набора. Объекты класса head не- могут ■становиться членами наборов. Таким образом, каждый набор имеет единственную «голову»'(head).
Процедуру first можно использовать для того, чтобы поручить ссылку на первый член набора, а процедуру last — на последний.
|-, Логическая процедура empty доставляет значение true, если набор не имеет членов.
г Целая процедура cardinal может быть использована для подсчета количества членов в наборе.
Процедурой clear можно воспользоваться для удаления всех членов из набора.
Ссылки SUC и PRED первоначально указывают на саму «голову», которая, таким образом, представляет пустой набор. '
\? 14.2. КЛАСС SIMULATION
■
Системный класс SIMULATION можно рассматривать как «пакет применений», предназначенный для решения задач моделирования. Он имеет в качестве префикса класс SIMSET и, таким образом, имеет непосредственный доступ к средствам для манипуляций с наборами.
Определение класса SIMULATION, данное ниже, является лишь одним из многих возможных способов организации зтрго класса. При реализации языка можно выбрать любую другую схему, эквивалентную этой с точки зрения программы пользователя. %
. В последующих разделах понятия, определенные в классе SIMULATION, будут разъяснены в связи с префикс-блоком,
префиксальная часть которого является экземпляром тела ■ класса SIMULATION или некоторого его подкласса. Блок с префиксом действует как главная программа некоторой квазипараллельной системы, которая может представлять модель системы «с дискретными событиями».
14.2.1. Общая структура
14.2.1.1. Определение
SIMSET class SIMULATION;
begin link class EVENT NOTICE (EVTIME, PROC); "
real EVTIME; ref (process) PROC; begin ref (EVENT NOTICE) procedure suc;-
suc:-if SUC is EVENT NOTICE then SUC
else none;
ref (EVENT NOTICE) procedure pred; . . pred : - PRED;
procedure RANK (BEFORE); Boolean BEFORE; begin ref (EVENT NOTICE) P; P ■ — SOS . last * for />:-P*while P.EVTIME>EVTIME do
P: — P. pred; if BEFORE then begin for P: - P while P. EVTIME = EVTIME do
P : — P. pred end; follow (P)
end RANK; end EVENT NOTICE; link class process; begin ref (EVENT NOTICE) EVENT; end
process; ref (head) SQS;
ref (EVENT NOTICE) procedure FIRSTEV;
FIRSTEV:-SQS.first; ref (process) procedure current;
current: - FIRSTEV. PROC ; real procedure time; time : = FIRSTEV. EVTIME;
procedure hold ;
procedure passivate ......;
procedure wait ;
procedure cancel ;
procedure terminate ;
procedure ACTIVATE ;
procedure accum ;
process class MAIN PROGRAM ;
ref (MAIN PROGRAM) main; ■ SQS : — new head; .
main: - new MAIN PROGRAM; main.EVENT:-new EVENT NOTICE (0, main); main.EVENT.into (SQS) end SIMULATION;