- •Получение с помощью имитационной модели производственной системы данных для анализа закономерностей предметной области Введение
- •1. Обоснование выбора языка и среды моделирования
- •1.Цель и содержание работы
- •2. Теоретическая часть
- •2.1.Объект моделирования
- •2.2.Выбор программных объектов модели
- •2.3.Описание процесса обслуживания
- •2.4.Работа в среде clips
- •3.1. Полный факторный эксперимент
- •3.Автоматизация планирования имитационных экспериментов и составления командного (пакетного) файла для получения данных
- •3.2. Дробный факторный эксперимент
- •3.3. Использование среды Excel для автоматизации составления планов дфэ и командного файла
- •4. Выполнение работы
- •4.1. Предоставляемое программное обеспечение
- •4.2. Практическая часть
- •4.3. Получаемые самостоятельно программные продукты:
- •5. Отчет по работе
- •Пояснения к программе имитационного моделирования
- •Краткие сведения об используемых в программе конструкциях языка clips
- •Пояснения и примеры по программированию генераторов на языке clips
Пояснения и примеры по программированию генераторов на языке 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.
