Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_работа_МС_2_07.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
4 Мб
Скачать
☆

Пояснения и примеры по программированию генераторов на языке clips

Первые два пункта плана 3.1 раздела 3 “Выполнение работы” не требуют дополнительных комментариев. Возникшие вопросы могут быть разрешены в рабочем порядке.

Для выполнения п.3 вышеприведенного плана требуются некоторые пояснения и примеры. Исходные формулы для написания программ генераторов обоими методами содержатся в таблице Вариантов выполнения в описании лабораторной работы №1. Рассмотрим вар.1. В этом случае в функции генератора используется одна расчетная формула , где х- возвращаемое значение СВ, ps - передаваемое из основной программы среднее время между соседними событиями, например, моментами поступления заявок в систему, а  - базовая СВ. Приведем вариант текста функции для этого варианта, которую назовем myqueue, на языке CLIPS (без вычисления дисперсии, как в п.3.2):

(deffunction myqueue (?ps)

(bind ?y (/ (random 1 10000) 10000))

(bind ?x (* 1.5 (* ?ps (sqrt ?y))))

?x ;возвращаемое значение

)

Функция вызывается из основной программы командой (myqueue ?ps). В первой строке функция bind объявляет переменную ?y и связывает ее с результатом деления целого случайного числа в диапазоне от 1 до 10000 на 10000. В результате переменная ?y получает вещественное значение в диапазоне от 0.0001 до1, т.е. базовую случайную величину.

Во второй строке функция bind объявляет переменную ?x и связывает ее с результатом умножения константы на результат умножения переменной ?ps на число, получающееся в результате извлечения корня квадратного из ?y, т.е. из базовой СВ. Функция возвращает результат последней операции, т.е. значение переменной ?x, которая в основной программе присваивается, например, значению слота post при создании объекта класса ZAYAVKA.

Рассмотрим вар.2, в котором та же функция распределения реализуется универсальным методом. Здесь требуется использовать 3 расчетных формулы, приведенных в соответствующей ячейке таблицы лабораторной работы №1. Формула для aj является вспомогательной, поэтому для нее можно создать отдельную функцию, объявляемую раньше основной и вызываемой из нее. Назовем эту функцию getaj. Эта функция должна вызываться с тремя параметрами: номером интервала ?j, средним интервалом времени ?ps и значением общего числа интервалов разбиения ?q.

(deffunction getaj (?j ?q ?ps)

(bind ?aj (* (* 1.5 ?ps) (sqrt (/ ?j ?q))))

?aj ;возвращаемое значение

)

Основная функция myqueue работает с двумя оставшимися формулами и ранее объявленной функцией getaj. Вот ее текст:

(deffunction myqueue (?ps)

(bind ?q 10)

(bind ?y (/ (random 1 10000) 10000))

(bind ?j (integer (+ 1 (* ?q ?y))))

(bind ?aj (getaj ?j ?q ?ps))

(bind ?aj1 (getaj (- ?j 1) ?q ?ps))

(bind ?*ta* (+ ?*ta* (+ ?aj1 (* ?y (- ?aj ?aj1))))

?*ta* ;возвращаемое значение

)

В первой строке функция bind объявляет переменную ?q и связывает ее с числом интервалов разбиения 10. Во второй строке действия уже знакомы по первому варианту. В третьей строке объявляется переменная случайного номера интервала ?j как целая часть от суммы 1 и произведения ?q на значение базовой случайной величины ?y. Далее следуют два вызова функции getaj с текущими значениями ?j и ?j-1. В последней строке суммируются значение глобальной переменной ?*ta* с результатом сложения ?аj-1 и произведения базовой СВ на разность ?аj - ?аj-1. Результат этих операций вновь присваивается глобальной переменной ?*ta*.

Рассмотрим вариант 18 для моделирования экспоненциальной функции распределения методом МОП. Здесь используется всего одна расчетная формула: . Знак минус используется в связи с отрицательным значением ln для чисел в диапазоне от 0 до 1. В программе для компенсации минуса удобно использовать функцию abs.

(deffunction myqueue (?ps)

(bind ?y (/ (random 1 10000) 10000))

(bind ?*ta* (+ ?*ta* (abs (* ?ps (log ?y)))))

?*ta* ;возвращаемое значение

)

Функция натурального логарифма вызывается в CLIPS именно как log.