Модель разрабатывается на языке
Текстовый объект ( текстовый файл
Кроме этого комплекса в составе
Чтобы обеспечить правильную последовательность обработки событий во времени, имеются системные часы, хранящие значения абсолютного модельного времени
Объекты в моделируемой системе предназначены для различных целей. Совершенно не обязательно, чтобы в одной модели участвовали все типы объектов. Необходимо лишь наличие блоков и транзактов, иначе модель работать не будет.
Объекты подразделяются на 7 категорий и 15 типов, которые представлены в табл. 6.1.
| Категории | Типы объектов |
|---|---|
| Динамическая | Транзакты |
| Операционная | Блоки |
| Аппаратная | Одноканальные устройства, памяти (многоканальные |
| устройства), логические ключи (переключатели) | |
| Вычислительная | Переменные, функции, генераторы случайных чисел |
| Статистическая | Очереди, таблицы |
| Запоминающая | Ячейки, матрицы ячеек |
| Группирующая | Числовые группы, группы транзактов, списки |
Рассмотрим назначение объектов
Динамическими объектами являются транзакты, которые создаются в определенных точках модели, продвигаются планировщиком через блоки, а затем уничтожаются. Транзакты являются аналогами единиц - потоков в реальной системе. Они могут представлять собой различные элементы даже в одной модели. С каждым транзактом связаны параметры, которые используются для конкретных данных. Каждый транзакт может иметь любое число параметров. Параметры нумеруются или им даются имена. Номера параметров и имена используются для ссылок на значения, присвоенные параметрам. Транзактам может присваиваться приоритет.Приоритет определяет предпочтение, которое получает транзакт, когда он и другие транзакты претендуют на один и тот же ресурс.
Объекты аппаратной категории - это абстрактные элементы, на которые может быть декомпозирована реальная система. Воздействуя на эти объекты, транзакты могут изменять их состояние и влиять на движение других транзактов. К объектам этого типа относятся одноканальные устройства, памяти (многоканальные устройства) и логические ключи.
Одноканальные устройства (ОКУ) представляют собой оборудование, которое в любой момент времени может быть занято только одним транзактом. Например, один
Многоканальные устройства (МКУ) предназначены для имитации оборудования, осуществляющего параллельную обработку. Они могут быть использованы одновременно несколькими тран-зактами. МКУ можно использовать в качестве аналога, например, многоканального ремонтного органа, нескольких каналов связи.
Для моделирования такого оборудования, как переключатели, имеющие только два состояния, в
Операционные объекты, т. е. блоки, задают логику функционирования модели системы и определяют пути движения транзактов между объектами аппаратной категории. В блоках могут происходить события четырех основных типов:
В зависимости от назначения блоки подразделяются на несколько групп.
GENERATE, SPLIT, TERMINATE, ASSEMBLE ;ADVANCE ;MATCH и нескольких GATHER транзактов;PRIORITY ;ASSIGN, INDEX, MARK, PLUS.DISPLACE , TRANSFER, LOOP, TEST, GATE.ADOPT, ALTER, EXAMINE , JOIN, REMOVE, SCAN.SEIZE, RELEASE, PREEMPT, RETURN, FUNAVAIL, FAVAIL ;ENTER, LEAVE, SAVAIL, SUNAVAIL ;LOGIC.SAVEVALUE, MSAVEVALUE.QUEUE, DEPART ;TABULATE .LINK, UNLINK.OPEN / CLOSE ;READ / WRITE ;SEEK.BUFFER, COUNT, EXECUTE, INTEGRATION, SELECT, TRACE, UNTRACE.Вычислительная категория служит для описания таких ситуаций в процессе моделирования, когда связи между компонентами моделируемой системы посредством процессом наиболее просто и компактно выражаются в виде математических (аналитических и логических) соотношений. Для этих целей в качестве объектов вычислительной категории введены арифметические и булевы переменные и функции.
Переменные представляют собой сложные выражения, которые включают константы, системные числовые атрибуты (СЧА), библиотечные
Выражения могут применяться в переменных и операторах
Каждому объекту соответствуют атрибуты, описывающие его состояние в данный момент времени. Они доступны для использования в течение всего процесса моделирования и называются системными числовыми атрибутами (СЧА). Например, объект вычислительной категории - генератор случайных чисел имеет СЧА - число, вычисляемое генератором равномерно распределенных случайных чисел номер n ; у объекта динамической категории - транзакта СЧА: PR - приоритет обрабатываемого в данный момент транзакта; Pi - значение i -го параметра активного транзакта и др. Всего в
Булевы переменные позволяют пользователю проверять в одном блоке
С помощью функций пользователь может производить вычисления непрерывных или дискретных функциональных зависимостей между аргументом функции (независимая величина) и зависимым значением функции.
Кроме библиотечных арифметических функций
Объекты запоминающей категории обеспечивают обращения к сохраняемым значениям. Ячейки сохраняемых величин и матрицы ячеек сохраняемых величин используются для сохранения некоторой числовой информации. Любой активный транзакт может произвести запись информации в эти объекты. Впоследствии записанную в эти объекты информацию может считать любой транзакт. Матрицы могут иметь до шести измерений.
К статистическим объектам относятся очереди и таблицы. В любой системе движение потока транзактов может быть задержано из-за недоступности устройств. В этом случае задержанные транзакты ставятся в очередь - еще один тип объектов
Для облегчения табулирования статистической информации в
К группирующей категории относятся три типа объектов: числовая группа, группа транзактов и списки.
При моделировании транзакты хранятся в списках. Существует пять видов списков, только в одном из которых в любой момент времени может находиться транзакт:
Одноканальное устройство имеет:
Многоканальное устройство имеет:
Список пользователя содержит транзакты, удаленные пользователем из списка текущих событий и помещенные в список пользователя как временно неактивные. Списки пользователя используются для организации очередей с дисциплинами, отличными от дисциплины "первым пришел - первым обслужен".
Для представления собственно обслуживания используются определенные элементы. Такими элементами могут быть либо люди, либо какие-то предметы. Независимо от этого подобные элементы в
Рассмотрение методов построения моделей с устройствами начнем с имитации функционирования ОКУ.
При моделировании возможны следующие режимы организации функционирования ОКУ:
вспомним, что потоки, существующие в реальных системах, в моделях имитируют транзакты. Поэтому сначала узнаем, как вводятся транзакты в модель и как выводятся из нее. А так как построение самых простейших моделей невозможно без некоторых блоков
GENERATE - это блок, через который транзакты входят в модель. Блок GENERATE имеет следующий формат записи:
GENERATE [A],[B],[C],[D],[E]
Скобки [ ] означают, что данный операнд является необязательным. Не существует ограничений на число различных блоков GENERATE в одной модели.
Интервалы времени между последовательными появлениями транзактов блока GENERATE называют интервалом поступления. Все разработчики должны задавать спецификацию распределения интервалов времени поступления в блоке GENERATE. Информация, необходимая для этого, задается операндами А и B. Все возможные виды распределения интервалов времени поступления в
Операнд А - средний интервал времени между последовательными поступлениями транзактов в модель.
Операнд B - задает модификатор, который изменяет значения интервала генерации транзактов по сравнению с интервалом, указанным операндом А. Есть два типа модификаторов: модификатор-интервал и модификатор-функция.
С помощью модификатора-интервала задается равномерный закон распределения времени между генерацией транзактов.
Операнды А и B могут быть именем, положительным числом, выражением в скобках или непосредственно СЧА.
При вычислении разности значений (А-В), заданных операндами А и B, получается нижняя граница интервала, а при вычислении суммы (А+В) - верхняя граница. После генерации очередного транзакта выбирается число из полученного интервала, это и будет значение времени, через которое следующий транзакт выйдет из блока GENERATE.
Когда операнды А и B задают в виде констант ( B - модификатор-интервал), они должны быть неотрицательными числами, т. е. интервал времени может быть выражен числами, например, 4.1,…,12.7. Предположим, что транзакт входит в модель - блок GENERATE - в момент модельного времени 25.6. После того, как этот транзакт попадет в следующий блок модели, планировщик
Пусть разыгранным значением будет число 9.7. Тогда планировщик планирует приход следующего транзакта в блок GENERATE в момент времени 25.6+9.7=35.3.
Можно выбрать для розыгрыша генератор равномерно распределенных случайных чисел. Это устанавливается на странице " Random Numbers " ( Случайные числа ) в журнале настроек модели. Нужно выбрать Edit/Settings ( Правка/Настройка ) и страницу " Random Numbers " ( Случайные числа ), на которой в поле ввода " GENERATE " ввести номер генератора - любое положительное целое число. По умолчанию используется генератор равномерно распределенных случайных чисел номер 1.
Операнды А и В не обязательно должны быть заданы. Когда один или оба операнда не указаны, по умолчанию предполагается их нулевое значение. Например, А=16.4, В=0. Поскольку операнд В=0, то интервалы времени распределены равномерно, $$16.4\pm 0$$, т. е. интервал времени поступления равен 16.4. Это пример того, как может быть задано детерминированное значение интервалов времени.
Более сложные интервалы времени поступления транзактов (не по равномерному закону) могут быть заданы с использованием модификатора-функции или встроенных генераторов случайных чисел. Под действием модификатора-функции значение операнда А умножается на значение функции, заданной операндом В.
При любом способе вычисления интервала времени значение операнда В не должно превышать значения операнда А, в противном случае в блоке GENERATE может быть получен отрицательный интервал времени, который вызовет останов по ошибке "Отрицательное время задержки".
Рассмотрим три дополнительных операнда: С - смещение интервалов, D - ограничитель, Е - уровень приоритета.
Смещение интервалов (первоначальная задержка) С - это момент времени, в который в блоке GENERATE должен появиться первый транзакт. После этого первого прихода все остальные приходы транзактов возникают в соответствии с распределением интервалов времени, задаваемых операндами А и B. Операнд С можно использовать как для ускорения, так и для замедления прихода первого транзакта или для указания прихода в нужный момент времени. Начальная задержка может быть меньше, равна или больше среднего времени, заданного операндом А. Когда операнд С не используется, интервалы генерирования определяются операндами А и B (они не оказывают влияния на задержку). Операнд С может быть таким же как и операнды А и B.
Операнд D задает граничное значение общего числа транзак-тов, которые могут войти в модель через данный блок GENERATE в течение времени моделирования. Когда это число достигнуто, данный блок GENERATE перестает быть активным. Если не определено граничное значение (операнд D не используется), блок GENERATE остается активным в течение всего времени моделирования, т. е. по умолчанию ограничения на количество создаваемых транзактов нет.
Операнд Е устанавливает класс приоритета каждого из транзак-тов, входящих в модель через данный блок GENERATE. Для задания приоритетов c целью повышения эффективности работы 0, 1, 2, 3,… вместо, например, 37, 43, 88, 122,... Чем выше число, тем выше приоритет. Если операнд Е не используется, по умолчанию приоритет генерируемых данным блоком GENERATE транзактов равен нулю.
Операнды D и Е могут задаваться также как и операнды А, B и С, но при этом принимать значения только целых положительных и целых чисел соответственно.
В любом блоке GENERATE должен быть обязательно задан либо операнд А, либо операнд D. Нельзя использовать в качествеоперанда параметры транзактов. Необходимо также помнить, что транзакт не должен входить в блок GENERATE. Если транзакт пытается это делать, возникает ошибка выполнения. Приведем примеры записи блоков GENERATE:
АGENERATE 38.6 GENERATE X$IntPostTran GENERATE MX$VrPost(3,6) GENERATE V$Prom GENERATE (Exponential(11,0,X$Mat)) GENERATE IntPostTran
А и BGENERATE 73.25,X$Otk GENERATE X$Sredne,FN2 GENERATE Sredne,FN4 GENERATE (V$Post+7.1),FN$Mod
А и CGENERATE 7.3,,4.1 GENERATE 7.3,,X$VrSm GENERATE V$IntP,,MX2(X$Stroka,X$Stolbez) GENERATE (Normal(3,X$Sre,X$SreOtk)),,Sme
А, B, EGENERATE 13.3,2.8,,,1 GENERATE (Normal(8,X$Sr,X$SrOtk)),Post,,1 GENERATE V$IntPostTran,(V1-12.3),,12
Приведенные примеры демонстрируют различные способы задания операндов блока GENERATE. Однако при этом нужно помнить следующее.
В начальный момент времени в каждом блоке GENERATE производится подготовка к выходу одного транзакта. На этой стадии модель еще полностью не инициализирована для выполнения, т. е. не все переменные получили значения. Но описанные в блоке GENERATE, должны быть уже определены - инициализированы. Поэтому в модели блоку GENERATE должны предшествовать команды определения EQU, INITIAL, FUNCTION, VARIABLE, FVARIABLE. Это делается для того, чтобы СЧА в блоке GENERATE, который ссылается на них, давали нужные для ввода транзактов в модель результаты.
Например:
SrIntPost EQU 47.2
StanOtkl EQU 28.6
INITIAL X$KolTrans,43
. . .
GENERATE SrIntPost,StOtk,,X$KolTrans
Как видно из примера, блоку GENERATE предшествуют присвоения командой EQU именам числовых значений и командой INITIAL начального значения сохраняемой ячейке с именем Kol-Trans.
Транзакты удаляются из модели, попадая в блок TERMINATE (завершить).
Блоки TERMINATE всегда позволяют войти всем транзактам, которые пытаются это сделать. В модели может быть любое число блоков TERMINATE. Блок имеет следующий формат записи:
TERMINATE [A]
Значением операнда А является число единиц, на которое блок TERMINATE уменьшает содержимое счетчика завершения, определяющего момент окончания моделирования. Операнд А может быть именем, положительным целым числом, выражением в скобках, СЧА или СЧА*<параметр>. По умолчанию значение операнда А равно нулю. В этом случае транзакт уничтожается, а значение счетчика завершения не меняется.
Счетчик завершения представляет собой ячейку памяти с именем TG1, которая хранит положительное целое число. Это число записывается в ячейку TG1 командой START в начале процесса моделирования.
В процессе моделирования транзакты попадают в блок TERMINATE и в соответствии со значением операнда А вычитают определенное число из счетчика завершения. При достижении содержимым счетчика нуля моделирование завершается. В модели может быть много блоков TERMINATE, но счетчик завершения только один.
Когда пользователь подготавливает модель, он задает время моделирования, указывая в операторе START значение счетчика завершения. Поскольку пути прохождения транзактов в модели имеют различный физический смысл, каждый блок TERMINATE может либо уменьшать, либо не уменьшать содержимое счетчика завершения.
Рассмотрим пример, в котором блок TERMINATE и команда START используются для управления временем моделирования. Предположим, что разработчик выбрал в качестве единицы времени 1 мин. Он хочет промоделировать поведение системы в течение 10 часов, затем моделирование должно быть закончено. За единицу модельного времени возьмем 1 мин, тогда время моделирования равно 10*60=600 единицам.
Любая модель на
GENERATE и TERMINATE ;TERMINATE в качестве операнда А использует 1 ;TERMINATE модели использует операнд А по умолчанию (однако возможны и другие варианты, т. е. и в других блоках TERMINATE операнд А может быть 1 ).В процессе моделирования транзакты, которые двигаются в других сегментах модели, время от времени выводятся из модели в других блоках TERMINATE, но они не оказывают воздействия на счетчик завершения. В момент модельного времени 600 транзакт в приведенном выше сегменте попадает в блок GENERATE и сразу же переходит в следующий блок TERMINATE.
Поскольку операнд А блока содержит 1, то из счетчика завершения вычитается 1. Предположим, что в команде START было указано число 10, т. е. десять прогонов модели, и в счетчик завершений записано число 10: TG1 = 10. После первого вычитания содержимое ячейки TG1 = 9, т. е. не равно нулю. Поэтому моделирование продолжается. После десяти прогонов, т. е. вычитания десяти единиц, TG1 = 0. Планировщик прекращает моделирование.
Команда START используется для запуска процесса моделирования. Она имеет следующий формат записи:
START A,[B],C,[D]

Операнд А задает значение счетчика завершения, определяющего момент окончания прогона модели. Может быть только целым положительным числом. Операнд B - операнд вывода статистики. Он может быть NP ("нет вывода данных") либо опущен. При задании NP стандартный отчет не выводится. По умолчанию выводится стандартный отчет. Операнд С не используется и сохранен для совместимости с описаниями ранних версий D определяет необходимость вывода содержимого списков событий. Если операнд D указать любым положительным целым числом, например, 1, то списки текущих и будущих событий включаются в стандартный отчет и выводятся.
Если операнд D опущен, то по умолчанию списки в стандартном отчете не выводятся.
Команду START можно сразу указывать в конце программы модели при ее подготовке и в таком виде записывать на магнитный носитель. Тогда после трансляции модели, т. е. создания объекта "процесс моделирования", сразу начинается моделирование. Этот же оператор можно вводить в программу модели в интерактивном режиме.
Однако может возникнуть необходимость завершить моделирование не по истечении какого-то времени, а после обработки определенного количества транзактов, имитирующих, например, изготовленные детали, переданные по каналу связи сообщения и т. д. В этом случае сегмент задания времени моделирования не нужен. Для организации такого способа завершения моделирования необходимо сделать следующее. В блоках TERMINATE, которые выводят из модели транзакты, имеющие смысл тех же изготовленных деталей или переданных сообщений, указать число, на которое уменьшается счетчик завершения моделирования. В команде START также указать число, деление которого на указанное в блоке TERMINATE число даст требуемое количество изготовленных деталей или переданных сообщений. Например, требуется завершить моделирование после изготовления 100 деталей. В модели это может быть так:
. . . TERMINATE 1 . . . TERMINATE 1 . . . TERMINATE START 100
Блоков TERMINATE, которые выводят из модели транзакты, соответствующие изготовленным деталям, может быть несколько. Все эти блоки должны иметь 1 в качестве операнда А. У остальных блоков TERMINATE, если они есть в модели, операнд А должен быть опущен.
Итак, транзакты введены в модель. Но аналоги транзактов - элементы потоков в реальных системах имеют различные характеристики. Рассмотрим, как эти же характеристики присваиваются транзактам.
Каждый транзакт может иметь любое число параметров. Интерпретация смысла параметров произвольная. В момент генерации транзактов все его параметры нулевые (только те, которые используются в модели). Блок ASSIGN является основным средством для задания значений параметров транзактов.
Формат записи:
ASSIGN A,B,[C]
Операндом А задается номер параметра, которому присваивается значение. Операнд А может быть именем, положительным целым числом, выражением в скобках, СЧА, СЧА*параметр и следующими за ними знаками + (если нужно увеличить), - (если нужно уменьшить).
Операнд B определяет значение, которое следует добавить, вычесть или которым следует заменить значение в параметре, заданном операндом А. Если такой параметр не существует, то он создается со значением, равным 0. Операнд B может быть таким же как и операнд А, кроме того, числом и строкой.
Операнд С задает номер модификатора-функции. При использовании операнда С значение операнда B умножается на значение модификатора-функции. Полученное произведение становится значением, которое изменяет значение параметра, заданного операндом А. Следует отметить, что операнд С определяет номер функции или ее имя (не нужно использовать СЧА FN или FN$ перед ним). Если используется СЧА FN, например, FN3, вычисляется функция номер 3

для определения второй функции B. Приведем примеры записи блока ASSIGN:
ASSIGN 1,754.3 ASSIGN 4+,Q5 ASSIGN 3-,5.85,7 ASSIGN Name,"Plan" ASSIGN Tr1-,(Normal(32,Sred,SrOtkl),Expdis
В первом примере параметру 1 присваивается 754.3. Во втором примере к значению параметра 4 прибавляется значение длины текущей очереди номер 5. В третьем примере из значения параметра 3 вычитается произведение 5.85 на вычисленное значение функции номер 7. В четвертом примере параметру с именем Name присваивается строка Plan. В пятом примере вычисляются выражение в скобках и функция с именем Expdis, перемножаются и полученное произведение вычитается из значения параметра с именем Tr1.
В
Блок, обладающий этими свойствами, является блоком SEIZE (занято). Вход транзакта в блок SEIZE моделирует занятие ОКУ.
После обслуживания (блок, имитирующий обслуживание, будет рассмотрен в п. 6.2.3) вход того же транзакта в другой блок моделирует освобождение ОКУ. Назначением этого блока является изменение состояния ранее занятого ОКУ с "занято" в "незанято". Этим блоком является блок RELEASE (освободить).
Форматы блоков:
SEIZE A RELEASE A
В обоих блоках операнд А - это имя занимаемого (освобождаемого) ОКУ. Может быть именем, положительным целым числом, выражением в скобках, СЧА, СЧА*параметр. Планировщик автоматически обеспечивает возникновение транзактов и ОКУ, когда этого требует логика модели. В то время как транзакты находятся в модели временно, ОКУ, используемые в модели, существуют постоянно в течение всего процесса моделирования. Прежде чем освободить ОКУ, транзакт может пройти через неограниченное число блоков. Например:
SEIZE Can . . . RELEASE Can
Если ОКУ с именем Can не занято, активный транзакт занимает его. Если ОКУ занято, транзакт помещается в список задержки данного ОКУ позади транзактов с таким же приоритетом. Этот транзакт не входит в блок SEIZE. Транзакту также отказывается во входе в блок SEIZE, если ОКУ с именем CAN находится в недоступном состоянии (режим недоступности ОКУ рассматривается в п. 4.2).
ОКУ, как уже отмечалось, может иметь имя или номер. В данном случае разрешается записывать вместо операнда А номер непосредственно без предварительного присвоения его имени командой EQU. Например:
SEIZE 5 . . . RELEASE 5
Блоки SEIZE и RELEASE при необходимости создания других версий модели могут переопределяться. Для этого они должны иметь метки (не путайте с операндами А этих блоков).
Обычно транзакт занимает ОКУ для того, чтобы немедленно начать на нем обслуживание, которое длится некоторый промежуток модельного времени. В течение этого времени транзакт должен прекратить двигаться по модели. Только по истечении времени обслуживания он должен попасть в блок RELEASE для освобождения ОКУ.
Для задержки транзакта в течение некоторого интервала модельного времени используется блок ADVANCE. Чаще всего этот интервал задается случайной переменной. Как и при использовании блока GENERATE информация, необходимая для описания соответствующего времени обслуживания и его распределения, задается операндами А и B. Формат записи блока ADVANCE следующий:
ADVANCE A,[B]
Здесь А - среднее время обслуживания, а B - способ модификации операнда А. Каждый из операндов А и B может быть именем, числом, выражением в скобках, СЧА или СЧА*параметр.
Как и в блоке GENERATE, модификаторы могут быть двух типов: модификатор-интервал и модификатор-функция, т. е. блок ADVANCE вычисляет время задержки (приращения модельного времени) такими же способами.
Если задан только операнд А, он вычисляется и используется в качестве времени задержки. Например:
ADVANCE (Normal(12,X$Sredn,X$SreOtk))
Время задержки распределено по нормальному закону со средним значением и среднеквадратическим отклонением, предварительно записанными командой INITIAL в сохраняемые ячейки с именами Sredn и SreOtk соответственно. Для генератора нормального распределения источником случайных чисел, равномерно распределенных в интервале [0, 1], является генератор номер 12.
При задании операндов А и B, и B не определяет функцию, оба операнда вычисляются (если они не константы) и в качестве времени задержки выбирается случайное число, равномерно распределенное в интервале (А-В, А+В). Для розыгрыша может быть выбран любой генератор равномерно распределенных случайных чисел. Делается это так же, как и при выборе генератора для блока GENERATE. Только номер генератора на странице "ADVANCE. По умолчанию используется генератор случайных чисел номер 1. Например
ADVANCE 56.7,23.2
В данном примере входящий транзакт задерживается на время, равномерно распределенное в интервале от 33.5 до 79.9.
Так же, как и в блоке GENERATE, при любых способах вычисления времени задержки значение операнда B не должно превышать значение операнда А. Если в приведенном выше примере операнд B взять равным 56.8, в процессе моделирования произойдет останов по ошибке "Отрицательное приращение времени".
Для задания времени задержки по другому закону, отличному от равномерного, в операнде B записывается модификатор-функция. При обращении к функции определяется некоторое число - значение функции. Оно умножается на значение операнда А. Результат используется как время задержки. Например:
ADVANCE Ring,FN$Exper
В примере вычисляется значение функции с именем Exper и умножается на значение переменной пользователя Ring, которой предварительно должно быть присвоено числовое значение командой EQU.
Как отмечалось ранее, в блоке GENERATE можно использовать функции и арифметические переменные, предварительно определенные командами FUNCTION и VARIABLE или FVARIABLE. Но в этих командах не должны были быть ссылки на параметры транзактов, так как транзактов еще нет. В операндах блока ADVANCE ссылки на параметры транзактов возможны. Естественно, что этим параметрам пользователем должны быть предварительно присвоены соответствующие значения. Например:
ADVANCE P1 ADVANCE (Exponental(7,0,MX$Sred(P2,P$Stolb))) ADVANCE SrIntPost,FN*2
В первом примере транзакт задерживается на время, равное значению параметра 1. Во втором примере время задержки определяется по экспоненциальному закону. При этом среднее значение выбирается из элемента матрицы, номера строки и столбца которого содержатся в параметре 2 и параметре с именем Stolb соответственно. Для генератора экспоненциального распределения источником равномерно распределенных случайных чисел в интервале [0, 1] является генератор номер 7 (RN7).
В третьем примере время задержки находится как произведение значения переменной пользователя SrIntPost и вычисленного значения функции, номер которой содержится в параметре 2 активного транзакта.
Блок ADVANCE никогда не препятствует входу транзакта. Любое число транзактов может находиться в этом блоке одновременно.
Приведем пример использования блоков SEIZE, ADVANCE и RELEASE (см. блок-диаграмму).
Транзакт, войдя в блок SEIZE, займет ОКУ с символическим именем Rем1, задержится там благодаря блоку ADVANCE на 21±7 единиц времени и затем покинет его. После того, как транзакт войдет в блок RELEASE, планировщик попытается продвинуть транзакт в следующий блок модели, и следующий транзакт попытается использовать ОКУ, называемое Rем1.
Блок ADVANCE можно располагать в любых местах модели, а не только между блоками SEIZE и RELEASE.
Время задержки может быть также равным нулю. Если время равно нулю, транзакт в блоке ADVANCE не задерживается и переходит в следующий блок.
GENERATE и ADVANCE позволяют поместить транзакты в список будущих событий. С помощью этих блоков моделируется продолжительность какого-либо события или промежуток времени между наступлением каких-либо событий.Представим себе, что в какой-либо системе, модель которой вы собираетесь разработать, имеются, например, два
В
Формат записи:
GATE X A,[B]

Блок GATE работает в двух режимах:
При работе в режиме отказа блок GATE не пропускает транзакты, если соответствующий объект не находится в требуемом состоянии. Если же поставленное в блоке GATE условие удовлетворяется, то активный транзакт входит в него и затем переходит к следующему по порядку блоку. Операнд А определяет имя или номер ОКУ.
Условие задается одним из следующих условных операторов X, связанных с ОКУ:
NU - ОКУ, заданное операндом А, свободно;
U - ОКУ, заданное операндом А, занято.
Как видно, тип проверяемого объекта неявно задается условным оператором (позже мы рассмотрим применение блока GATE для проверки и других объектов аппаратной категории).
Операнд B содержит номер следующего блока для входящего транзакта, когда условный оператор имеет значение "ложь". Операнды А и B могут быть именем, положительным целым числом, выражением в скобках, СЧА, СЧА*параметр. Если операнд B не используется, то проверка проводится в режиме отказа. Если результат этой проверки не будет "истина", то транзакт помещается в список повторных попыток проверяемого объекта. Когда состояние любого из объектов меняется, заблокированный транзакт снова активизируется, повторяется проверка заданного блоком GATE условия. Если это условие выполняется, транзакту разрешается войти в блок GATE и далее перейти к следующему по порядку блоку. Например:
GATE U Zrk GATE NU (FN$Expert+4) GATE NU Bat,Oper
В первом примере блок GATE не пропустит транзакт при условии незанятости ОКУ с именем Zrk. Во втором случае - когда занято ОКУ, номер которого определяется как результат вычисления и последующего округления выражения в скобках FN$Expert+4. В третьем примере в случае занятости ОКУ с именем Вat транзакт будет направлен к блоку с именем Oper.

Следует отметить, что несмотря на удобство применения блока GATE, в некоторых случаях это может привести при отсутствии операнда B к увеличению машинного времени за счет проведения проверок для заблокированных транзактов. Уменьшение числа проверок и исключение из проверяемых тех транзактов, для которых вряд ли когда-нибудь результат проверки будет истинным, может быть организовано с помощью блоков LINK и UNLINK. Методы применения этих блоков будут рассмотрены позже.
Для проверки состояния различных объектов, в том числе и ОКУ, можно использовать также булевы переменные и блок TEST.
В
Формат записи блока QUEUE следующий:
QUEUE A,[B]
Блок QUEUE увеличивает длину очереди. Операнд А задает номер или имя очереди, к длине которой добавляются единицы.
Операнд B определяет число единиц, на которое увеличивается текущая длина очереди. Если операнд B не используется, то прибавляется единица.
Рассмотрим примеры записи блока QUEUE.
QUEUE RemQ
Увеличивает длину очереди RemQ на единицу при входе каждого транзакта.
QUEUE Р14,Р1
Увеличивает длину очереди, номер или имя которой задан в параметре Р14 транзакта, на число единиц, заданных в параметре Р1.
Формат записи блока DEPART имеет вид:
DEPART A,[B]
Блок DEPART служит для уменьшения длины очереди. Операнд А задает номер или имя очереди, длину которой надо уменьшить. Операнд B задает число единиц, на которое уменьшается длина очереди. Это число не должно превышать текущую длину очереди. Если операнд B не используется, то по умолчанию длина очереди уменьшается на 1. Операнды А и B в блоках QUEUE и DEPART могут быть именем, положительным целым числом, выражением в скобках, СЧА или СЧА*параметр.
Приведем примеры записи блока DEPART.
DEPART RemQ
Уменьшает длину очереди RemQ на единицу. DEPART V3,(V4+3.7)
Операнды А и B заданы арифметической переменной V3 и выражением в скобках, которое также содержит арифметическую переменную V4. При входе транзакта в блок DEPART переменная и выражение в скобках вычисляются и округляются. После этого длина очереди, номер которой есть значение переменной V3, уменьшается на значение выражения в скобках (V4+3.7).
Очереди, как и ОКУ, разрешается записывать вместо операнда А номер без предварительного присвоения его имени командой EQU. Например:
QUEUE 5 … DEPART 5
Рассмотрим использование блоков QUEUE и DEPART в модели на примере представленной блок-диаграммы. Ожидание может возникнуть ввиду занятости ОКУ с именем Rem1. Для сбора статистики об ожидании введем регистратор очереди и дадим ему имя RemQ.
Если транзакт вошел в сегмент в момент, когда ОКУ Rem1 не занято, транзакт входит в блок QUEUE. Далее транзакт пытается войти в блок SEIZE и, поскольку Rem1 свободно, эта попытка оказывается успешной. Состояние Rem1 меняется на "занято", и далее транзакт сразу попадает в блок DEPART. Выполняется соответствующая подпрограмма и транзакт попадает в блок ADVANCE, где задерживается на некоторое время, вычисленное в соответствии с распределением $$21\pm 7$$.
Предположим теперь, что ОКУ Rem1 находится в занятом состоянии и следующий транзакт входит в сегмент модели. Он проходит в блок QUEUE и получает далее отказ, поскольку Rem1 находится в занятом состоянии. Транзакт перестает двигаться, оставаясь в блоке QUEUE.
Позднее, когда транзакт, находящийся на обслуживании в устройстве, покидает его, ожидающий транзакт опять попытается войти в блок SEIZE. На этот раз попытка окажется успешной. Двигаясь дальше, транзакт войдет в блок DEPART, уменьшая значение счетчика содержимого очереди на 1 (по умолчанию, так как операнд B не используется).
Длина очереди не может быть отрицательной. Если такое произойдет, происходит останов по ошибке "Запрещенная попытка сделать содержимое очереди отрицательным".
Останов по ошибке "Недопустимое отрицательное число в операторе
Например:
QUEUE Server,3
Для получения плотности распределения, ее интегральных относительных частот, среднего значения и стандартного отклонения некоторых аргументов, которыми могут быть СЧА (например, времени нахождения транзакта в модели или задержки в ее отдельных частях, длин очередей, содержимого МКУ, коэффициентов использования устройств и т. д.), используются статистические таблицы TABLE и QTABLE.
Команда описания таблицы TABLE имеет следующий формат:
Name TABLE A,B,C,D
Команда определяет аргумент, а также число и ширину частотных интервалов (классов). Метка Name определяет имя таблицы.
Операндом А задается аргумент таблицы - элемент данных, чье частотное распределение будет табулироваться. Операнд может быть именем, выражением в скобках или СЧА.
Операндом B задается верхний предел первого частотного интервала.
Операнд С задает ширину частотного интервала - разницу между верхней и нижней границей каждого частотного класса.
Операнды B и С могут быть числами или strinq.
Операндом D задается число частотных интервалов (положительное целое число).
Для сбора данных транзакт должен войти в блок TABULATE с тем же именем таблицы, которое определено в блоке TABLE. Блок помещается в ту точку модели, которая соответствует исследуемому объекту.
Блок имеет следующий формат:
TABULATE A,[B]
Операндом А задается имя таблицы, в которую табулируется значение аргумента.
Операндом B ( весовой коэффициент ) задается число единиц, которые должны быть занесены в тот частотный интервал, в который попало значение аргумента. Если операнд B отсутствует, то по умолчанию эта величина равна 1.
Операнды А и B могут быть именем, выражением в скобках, СЧА или СЧА*параметр. Кроме того, операнд А может быть только положительным целым числом, а операнд B - положительным числом. Например,
VrRem TABLE P$ReaLvs,8.2,5.5,10
. . .
TABULATE VrRem
Оператором TABLE описывается таблица с именем VrRem. Аргументом таблицы является СЧА P$ReaLvs с верхним пределом первого интервала 8.2, шириной 5.5 и числом интервалов 10. Каждое значение табулируемого аргумента P$ReaLvs, меньшее или равное 8.2, увеличивает частоту первого частотного класса таблицы на 1. Если аргумент таблицы не попадает в первый частотный класс, класс определяется делением значения аргумента на операнд С оператора TABLE. Например, значение P$ReaLvs равно 30.25. Тогда 30.25/5.5=5.5 и будет увеличена на 1 частота шестого класса.
Если аргумент A таблицы больше B+C#D=8.2+5.5#10= =63.2, изменен будет на 1 последний (десятый) класс. Одновременно корректируются текущие значения СЧА таблицы: счетчик входов в таблицу ТС, среднее время ожидания ТВ и стандартное отклонение времени ожидания TD. Собранная в таблице статистика выводится в стандартный отчет.
При использовании в операнде B блока весового коэффициента, например:
TABULATE VrRem,3
последний будет добавляться к значению частоты частотного класса. Весовой коэффициент применяется также для среднего и стандартного отклонения, что равносильно нескольким входам в блок .
Таким образом, команда TABLE вместе с блоком служат для табулирования любого СЧА.
Кроме таблиц TABLE могут использоваться Q -таблицы, являющиеся средством получения распределения только времени пребывания транзакта в очереди. Формат команды описания Q -таблицы такой же, как и TABLE. Отличие состоит в том, что операндом А задается имя очереди. Назначение операндов B, С, D такое же, что и в команде описания TABLE. Операнд B может быть нулем или положительным числом. Для создания в модели такой таблицы ее нужно предварительно определить с помощью команды QTABLE формата:
Name QTABLE A,B,C,D
Например:
VTime QTABLE Dlina,18.2,4.3,6
Dlina - имя очереди к устройству, а не СЧА, как в случае использования TABLE.
При прохождении транзакта через блоки QUEUE и DEPART его время ожидания фиксируется, и к счетчику частотного интервала таблицы, в который попало это время, добавляется 1. Одновременно в таблице накапливается информация для вычисления среднего значения и среднеквадратического отклонения времени ожидания. Следует обратить внимание, что при использовании QTABLE информация в таблицу заносится автоматически при входе транзакта в блоки QUEUE и DEPART и никаких специальных мер, т. е. блока , при этом не требуется.
По окончании моделирования собранная в таблице информация также выводится в стандартном отчете
Для изменения маршрутов движения транзактов в модели применяются блоки , LOOP, GATE, TEST и TRANSFER. Здесь мы рассмотрим методы применения блоков TRANSFER и .
Блок TRANSFER (передать) предназначен для передачи входящего в него транзакта в любой другой блок модели. Он имеет следующий формат:
TRANSFER [A],[B],[C],[D]
Все режимы блока TRANSFER, кроме безусловного, выборочные, т. е. отличаются друг от друга способом выбора очередного блока, к которому должен быть направлен активный транзакт. Операнд А задает этот режим выбора. Существуют следующие девять режимов работы блока TRANSFER:
ALL - последовательный выбор одного из нескольких блоков;PICK - выбор случайным образом одного из нескольких блоков;FN - функциональный;P - параметрический;SBR - подпрограммный;SIM - одновременный.Операнд А может принимать указанные выше значения, а также может быть именем, положительным целым числом, выражением в скобках, СЧА, СЧА*параметр.
Операнды B и С задают возможные значения номеров следующих блоков или их положение. Они могут быть такими же, как и операнд А. Использование этих значений будет описано ниже при рассмотрении указанных выше режимов работы. Если операнд B опущен, то планировщик записывает вместо него номер блока, следующего за блоком TRANSFER.
Рассмотрим режимы безусловной передачи и статистической передачи блока TRANSFER, как наиболее часто используемые в моделях.
Режим безусловной передачи. B режиме безусловной передачи операнд А не используется. Операнд B указывает имя блока, в который транзакт должен попытаться войти. Блок TRANSFER не может отказать транзакту во входе.
Например:
TRANSFER ,Oper
После входа транзакт сразу же пытается войти в блок с меткой Oper. Если этот блок отказывает во входе, транзакт остается в блоке TRANSFER.
Рассмотрим еще один пример использования безусловного режима блока TRANSFER. Пусть требуется поток обслуженных транзактов перед удалением из модели разделить на четыре составляющие. Первый параметр каждого транзакта имеет одно из четырех присвоенных ранее значений: 1, 2, 3 или 4. Вначале для разделения потока используем блок TEST.
. . .
TEST E P1,1,Met2
Met2 TERMINATE
TEST E P1,2,Met3
TERMINATE
Met3 TEST E P1,3,Met4
TERMINATE
Met4 TERMINATE

Теперь этот же фрагмент модели перепишем с использованием блока TRANSFER.
. . .
Met1 TRANSFER ,(Met1+P1)
TERMINATE
TERMINATE
TERMINATE
TERMINATE
В блоке TRANSFER в качестве операнда B указано выражение в скобках. При входе активного транзакта выражение вычисляется, т. е. к номеру, который присвоен планировщиком блоку с меткой Met1, прибавляется значение первого параметра. В итоге получается номер блока, к которому и направляется транзакт.
Режим статистической передачи. Когда операнд А используется и не является зарезервированным словом, блок TRANSFER работает в
Значение операнда А, записываемого после точки, рассматривается как трехзначное число, показывающее (в долях от тысячи), какая доля входящих в блок транзактов должна быть направлена в блок С. Остальные транзакты направляются в блок B или к следующему по номеру блоку, если операнд B опущен.
Числовое значение операнда А может быть задано любым СЧА. При этом возможны следующие случаи:
А меньше или равно нулю;А равно или больше 1 000 ;А больше нуля, но меньше 1 000.Если вычисленное значение операнда А меньше или равно нулю, то будет производиться безусловная передача транзакта к блоку B. Если значение операнда А больше или равно 1 000, то будет осуществляться безусловная передача транзакта к блоку С. В третьем случае блок TRANSFER работает в обычном режиме.
Например:
TRANSFER .P5,,Rrw
Трехзначное число, записанное в параметре 5 транзакта, входящего в блок TRANSFER, интерпретируется как вероятность (в долях от тысячи) того, что транзакт будет передаваться блоку Rrw, а в остальных случаях - следующему блоку, так как операнд B не используется.
Режим статистической передачи удобно использовать, например, в таких случаях. При моделировании работы цеха по производству деталей известно, что 12,5% изготовленных деталей бракуется. В модели это можно реализовать так:
. . . TRANSFER .125,Sam,Wzw . . .
Транзакты, имитирующие изготовленные в цехе детали, в 12,5% случаев будут направлены к блоку с
меткой Wzw, а в остальных 87,5% случаях - к блоку с меткой Sam.
Можно указать генератор - источник случайных чисел. Для этого нужно выбрать Edit/Settings ( Правка/Настройки ). Затем выбрать страницу Random Numbers ( Случайные числа ) и ввести номер генератора в поле ввода, отмеченное TRANSFER. После инсталляции по умолчанию используется генератор номер 1.
Блок DISPLACE предназначен для нахождения любого тран-закта и перемещения его к новому блоку. Блок имеет формат:
DISPLACE A,B,[C],[D]
Операнд А - номер транзакта, который нужно переместить.
Операнд B - метка блока, к которому перемещается транзакт, указанный операндом А.
Операнд С - номер параметра перемещаемого транзакта, в который записывается оставшееся до конца его обслуживания время, если он находился в списке будущих событий.
Операнд D - метка альтернативного блока для транзакта.
Операнды А, B, С и D могут быть именем, положительным целым числом, выражением в скобках, СЧА или СЧА*параметр. Например:
DISPLACE (P2+32),Term3,Ostatok,Met2
Операнд А указан выражением в скобках. Это выражение вычисляется и округляется до целого. Полученный результат является номером транзакта, который следует переместить. Далее блок отыскивает этот транзакт. При этом возможны случаи:

Term3. Во втором случае определяется время, оставшееся до его повторного ввода в процесс моделирования, и записывается в параметр с именем Ostatok. Если параметра с таким именем нет, он создается. Транзакт также перемещается к блоку с меткой Term3. В третьем случае, т. е. когда в модели нет транзакта с нужным номером, активный транзакт, вошедший в блок , направляется к блоку с меткой Met2. Если операнда D нет, активный транзакт переходит к следующему блоку.
Когда транзакт перемещается к новому блоку, он исключается из списков:
При перемещении прерванные выполнения в устройствах не сбрасываются.
Это означает, что перемещаемый транзакт продолжает занимать устройство. Следовательно, если необходимо, нужно освободить устройство.
Пример использования блока приведен в п. 6.8.2.
Если на входе ОКУ образуется очередь, выбор транзакта для ОКУ занятия после его освобождения происходит:
Е блока GENERATE.При этом очередной транзакт с большим приоритетом ждет окончания обслуживания предыдущего транзакта независимо от его приоритета. Приоритет учитывается только в образующейся очереди. В ней транзакты выстраиваются в приоритетном порядке.
Такой режим функционирования ОКУ организуется блоками SEIZE и RELEASE, рассмотренными в п. 6.2.2.
Однако может возникнуть необходимость смоделировать ситуацию, когда очередной транзакт должен занять ОКУ, прервав обслуживание предыдущего транзак-та. Такое прерывание называется "захватом" ОКУ и моделируется блоком PREEMPT (захватить). Формат блока:
PREEMPT A,[B],[C],[D],[E]
Операнд А - имя или номер захватываемого ОКУ.
Когда ОКУ свободно (см. блок-диаграмму), блок PREEMPT работает также, как и блок SEIZE.
При занятом ОКУ блок PREEMPT функционирует либо в приоритетном режиме, либо в режиме прерывания. Режимы определяются операндом B:
PR - приоритетный;B не используется) - режим прерывания.В приоритетном режиме прервать обслуживание предыдущего (обслуживаемого) транзакта, т. е. "захватить" ОКУ, может только транзакт с большим приоритетом. Если приоритет претендующего на занятие ОКУ транзакта равен или ниже приоритета обслуживаемого транзакта, он помещается в список задержки ОКУ последним в своем приоритете.
Что делать с транзактом, обслуживание которого прерывается? Это определяют операнды С, D и Е.
Операнд С - имя или номер блока, куда должен быть направлен прерванный транзакт.
Операнд Е при значении RE определяет режим удаления прерванного транзакта.

Операнд D - номер параметра прерванного транзакта, в который записывается оставшееся до завершения обслуживания время.
Операнды А, С, D и Е могут быть именем, положительным целым числом, выражением в скобках, СЧА или СЧА*параметр.
Транзакт, захвативший ОКУ, освобождает его от захвата вхождением в блок RETURN.Формат блока:
RETURN A
Операнд А - имя или номер освобождаемого ОКУ. Например:
RETURN Rem1
Освободить от захвата ОКУ Rem1.
Применение блоков PREEMPT и RETURN показано в п. 6.5.5.
В режиме "захвата", если ОКУ уже используется, активный транзакт помещается в список отложенных прерываний или "захватывает" ОКУ. Прерывание обслуживания сразу, а не помещение транзакта в список, происходит тогда, когда список отложенных прерываний пуст и обслуживаемый транзакт сам не является "захватчиком".
Транзактам из списка отложенных прерываний предоставляется право занять ОКУ ранее, чем прерванным транзактам или транзак-там из списка задержки ОКУ.
Проверка состояния ОКУ в приоритетном режиме может проводиться блоком GATE, а также с использованием булевой переменной и блока TEST.
Рассмотрим проверку состояния ОКУ блоком GATE.
Условие проверки задается одним из следующих условных операторов Х:
I - ОКУ, заданное операндом А, прервано;NI - ОКУ, заданное операндом А, не прервано.Например:
GATE I Stan GATE NI (V$Rasp-3) GATE I Print,Udal GATE I *1
В первом примере блок GATE пропустит транзакт, когда ОКУ Stan будет прервано. Во втором примере транзакт пройдет к следующему блоку, когда не прервано ОКУ, номер которого определяется как результат вычисления и последующего округления до целого выражения в скобках ( V$Rasp-3 ). В третьем примере в случае прерывания ОКУ Print транзакт будет направлен к блоку с меткой Udal.
В первом и втором примерах блок GATE работает в режиме отказа во входе в случае невыполнения условия. Здесь также остается справедливым замечание, сделанное в п. 6.2.4: отсутствие операнда В может привести к увеличению машинного времени моделирования. Однако в некоторых случаях такой режим, наверное, можно использовать.
Для моделирования неисправностей ОКУ и других ситуаций в PREEMPT ). Однако при этом транзакты, вызывающие прерывания (имитирующие отказы ОКУ), учитываются в статистике, как и транзакты, обслуженные при исправном функционировании ОКУ. А это неправильно, вследствие чего и искажается статистика ОКУ.
Недоступность ОКУ моделируется блоком FUNAVAIL (символ F означает ОКУ, - недоступный). При использовании этого блока статистика ОКУ не искажается.
Формат блока:
FUNAVAIL A,[B],[C],[D],[E],[F],[G],[H]
Блок делает недоступным ОКУ с именем или номером, указываемым операндом А (см. блок-диаграмму).
Все транзакты, обрабатываемые блоком FUNAVAIL, разделяются на три класса, которые и определяют назначение операндов:
SEIZE или PREEMPT ) в момент перевода его в недоступное состояние (операнды B, C, D );E, F );G, H ).Операндом B задаются режимы обработки транзакта, занимающего ОКУ в момент перевода его в недоступноcть:
СО - режим продолжения: продолжить обработку занимающего ОКУ транзакта во время недоступности;RE - режим удаления: удалить и направить занимающий ОКУ транзакт к блоку, метка которого должна быть указана операндом С;Операнд С - метка блока, в который будет направлен в режиме удаления транзакт, занимавший ОКУ в момент перевода его в недоступное состояние.
Операнд D - номер или имя параметра транзакта, занимавшего ОКУ в момент перевода его в недоступное состояние; если он будет удален (режим RE ), т. е. исключен из СБС, в этот параметр будет записано время, оставшееся удаленному транзакту до конца обслуживания.
Операндом Е задаются режимы обработки транзактов, находящихся к моменту перевода ОКУ в недоступное состояние в списке прерываний, т. е. тех транзактов, обслуживание которых на данном ОКУ было ранее прервано:
СО - режим продолжения: продолжить работу ОКУ во время недоступности - обслуживать транзакты из списка прерываний;RE - режим удаления: удалить и направить транзакты из списка прерываний к новому блоку, метка которого должна быть указана операндом F ;
Операнд F указывает метку блока, к которому будут направлены транзакты из списка прерываний ОКУ, из-за чего они не могут находиться в СБС, поэтому для них нет возможности занесения в их параметры времени, оставшегося до конца обслуживания.
Операнд F может использоваться и тогда, когда отсутствует операнд E (по умолчанию). В этом случае для перемещенных к новому блоку транзактов прерывание обслуживания сохраняется.
Операндом G задаются режимы обработки транзактов, находящихся к моменту перевода ОКУ в недоступное состояние в списке отложенных прерываний, т. е. ожидающих выполнения с прерыванием, и в списке задержки:
СО - режим продолжения: продолжить работу ОКУ во время недоступности - обслуживать транзакты из списка отложенных прерываний и списка задержки;RE - режим удаления: удалить и направить транзакты из списка отложенных прерываний и списка задержки к новому блоку, метка которого должна быть указана операндом H ;Операндом H указывается метка нового блока, к которому в режиме удаления ( RE ) направляются транзакты из списка отложенных прерываний и списка задержки. Когда операнд G не используется, нельзя использовать и операнд H.
Недоступность ОКУ сохраняется до тех пор, пока транзакт, вызвавший переход в недоступное состояние, не войдет в блок
FAVAIL A
Блок FAVAIL изменяет состояние ОКУ на доступное, т. е. восстанавливает обычный режим вхождения транзактов в ОКУ. Все транзакты, ожидающие доступного состояния ОКУ, указанного операндом А, активизируются и могут попытаться занять его.
Применение блоков FUNAVAIL и FAVAIL показано в п. 6.7.5.
B …Н относятся только к транзактам указанных ранее трех классов. Другие транзакты, которые пытаются прервать ОКУ, уже находящееся в недоступном состоянии, в эти классы не входят и операнды B …Н не имеют к ним никакого отношения.Проверка состояния ОКУ в режиме недоступности проводится блоком GATE. Формат блока см. п. 6.2.4.
Условие проверки задается одним из следующих условных операторов Х:
FNV - ОКУ, заданное операндом А, недоступно ;
FV - ОКУ, заданное операндом А, доступно.
Например:
GATE FNV Stan GATE FV (FN$Rasp-X$Col) GATE FNV Print,Udal
В первом примере блок GATE пропустит транзакт, когда ОКУ Stan будет недоступно.
Во втором примере транзакт пройдет к следующему блоку, когда доступно ОКУ, номер которого определяется как результат вычисления и последующего округления до целого выражения в скобках (FN$Rasp-X$Col).
В третьем примере в случае доступности ОКУ Print, т. е. не выполнения заданного в блоке GATE условия, транзакт будет направлен к блоку с меткой Udal.
В первом и втором примерах блок GATE работает в режиме отказа, если условия не выполняются. Здесь также остается справедливым замечание, сделанное в п. 6.2.4: отсутствие операнда В может привести к увеличению времени моделирования.
При движении по модели транзакты могут быть заблокированы, например, как отмечалось ранее, при проверке состояния ОКУ блоками GATE и TEST. Если заблокированные транзакты находятся в списке текущих событий (СТС), то при большом их количестве планировщик расходует много времени на просмотр СТС с целью выбора очередного транзакта для продвижения.
Для экономии машинного времени заблокированные транзакты целесообразно помещать в списки пользователя и оставлять их там до тех пор, пока не будут выполнены условия, позволяющие дальнейшее продвижение этих транзактов. Кроме того, этим предоставляется возможность организовать различные дисциплины очередей, отличающиеся от дисциплины FIFO, реализованной в списке текущих событий.
Список пользователя представляет собой некоторый буфер, в который могут временно помещаться транзакты, выведенные из СТС. В отличие от списков текущих и будущих событий тран-закты вводятся в список пользователя и выводятся из него не автоматически, а по решению пользователя в соответствии с логикой модели при помощи специальных блоков.
Для ввода транзактов в список пользователя служит блок LINK (ввести в список), который может быть использован в режимах:
В безусловном режиме, блок LINK имеет формат записи: [имя] LINK A,B
Операндом А задается имя или номер списка пользователя, в который безусловно помещается транзакт, вошедший в блок LINK.
Операнд B определяет, в какое место списка пользователя следует поместить вошедший транзакт. Допустимые значения:
FIFO - транзакт помещается в конец списка;LIFO - транзакт помещается в начало списка;PR - транзакты помещаются по убыванию приоритета;Р - транзакты помещаются позади тех транзактов, значения соответствующего параметра которых меньше (в порядке возрастания значения параметра);М1 - транзакты помещаются в порядке возрастания относительного времени их пребывания в модели.
В качестве операнда B могут использоваться и другие СЧА, кроме указанных ранее СЧА транзактов: арифметическая переменная, функция, а также выражение в скобках. В этом случае выполняется вычисление указанного операндом B для активного транзакта и для всех остальных транзактов, уже находящихся в списке пользователя, начиная с начала очереди. После этого производится упорядочивание транзактов в списке пользователя по убыванию вычисленного значения. Например, блок
LINK 3,FIFO
помещает транзакты в конец списка пользователя с номером 3 в порядке их поступления в блок. Блок
LINK Otst,P$Pol
помещает транзакты в список пользователя с именем Otst, упорядочивая их по возрастанию значения параметра с именем .
Условия, при которых транзакт помещается в список пользователя, в безусловном режиме проверяются средствами, предусмотренными разработчиком модели. Например, направить транзакт в список пользователя в случае занятости ОКУ можно так, как показано ниже.
. . .
GATE NU Rem1,Wait
SEIZE Rem1
. . .
Wait LINK Otst,FIFO
. . .
Если ОКУ Rem1 занято, блок GATE не впускает транзакт в блок SEIZE, а направляет его в блок LINK с именем Wait, и тран-закт вводится в конец списка пользователя с именем Otst.
В том же фрагменте модели список пользователя можно разместить и иначе.
. . .
GATE U Rem1,Met1
LINK Otst,FIFO
Met1 SEIZE Rem1
. . .
Здесь ОКУ Rem1 проверяется на занятость. Если ОКУ занято, транзакт проходит к следующему блоку LINK и помещается в список пользователя с именем Otst. В случае незанятости ОКУ, транзакт направляется к блоку SEIZE с меткой Met1 и занимает свободное ОКУ.
В только что рассмотренных примерах предполагается, что список пользователя неограничен, т. е. в него может помещаться любое количество транзактов. При моделировании реальных систем список пользователя может использоваться для имитации, например, входного накопителя, емкость которого, как правило, ограничена. Это ограничение можно реализовать следующим образом.
Emk EQU 10
. . .
GATE NU Rem1,Wait
SEIZE Rem1
. . .
Wait TEST L CH$Otst,Emk,Term1
LINK Otst,LIFO
Если ОКУ Rem1 занято, то блок GATE не впускает транзакт в блок SEIZE, а направляет его в блок TEST с меткой Wait, находящийся перед блоком LINK. Если текущее содержимое списка пользователя с именем Otst меньше заданной емкости Emk, тран-закт проходит в список пользователя, в противном случае направляется к блоку с меткой Term1.
Приведем еще возможный вариант этого же фрагмента модели.
Emk EQU 10
. . .
GATE U Rem1,Met1
TEST L CH$Otst,Emk,Term1
LINK Otst,LIFO
Met1 SEIZE Rem1
Если ОКУ Rem1 занято, блок GATE пропускает транзакт к блоку TEST. Если текущее содержимое списка пользователя с именем Otst меньше заданной емкости Emk, транзакт проходит в список пользователя, в противном случае направляется к блоку с меткой Term1. Если ОКУ незанято, транзакт направляется к блоку SEIZE с меткой Met1 и занимает свободное ОКУ Rem1.
Для вывода одного или нескольких транзактов из списка пользователя и помещения их обратно в список текущих событий служит блок UNLINK (вывести из списка), имеющий следующий формат:
[имя] UNLINK X A,B,C,[D],[E],[F]
Операндом А указывается имя или номер списка пользователя.
Операнд B - метка блока, в который переходят выведенные из списка пользователя транзакты.
Операндом С указывается число выводимых транзактов или ключевое слово ALL для вывода всех находящихся в списке транзактов. По умолчанию, т. е. когда не используется операнд С, берется слово ALL.
Операнды D и E вместе с условным оператором Х определяют способ и условия вывода транзактов из списка пользователя. Значения оператора Х те же, что и в блоке TEST. В случае, когда условный оператор Х должен использоваться, но не указан, по умолчанию он принимает значение Е (равенство). Если операнды D и Е не используются, не указывается и условный оператор Х. В этом случае транзакты выводятся с начала списка, а количество выводимых транзактов определяется обязательным операндом С.
Операнд D может быть:
BACK.Если операнд D является булевой переменной, операнд Е и оператор Х не используются. Булева переменная вычисляется относительно транзакта, находящегося в списке пользователя. Если результат не нуль, т. е. условие вывода выполняется, транзакт выводится. Количество выводимых транзактов определяется операндом С. Однако выведено может быть и меньше, чем указано операндом С: по числу не нулевых результатов вычисления булевой переменной. Кроме того и транзактов в списке пользователя может быть меньше, чем указано операндом С.
Если операндом D указано ключевое слово BACK, также операнд Е и условный оператор Х не используются, а транзакты выводятся с конца списка в количестве, определяемом обязательным операндом С.
Если операнд D не булева переменная и не ключевое слово BACK, должны быть указаны операнд Е и условный оператор Х. Операнд D вычисляется относительно транзакта, находящегося в списке пользователя, и используется в качестве номера параметра, значение которого сравнивается с результатом вычисления операнда Е.

Если операнд D задает параметр, а операнд Е не используется, значение параметра транзакта из списка пользователя сравнивается со значением такого же параметра выводящего транзакта. Если они равны, транзакт выводится из списка пользователя. И в этом случае количество выводимых транзактов определяется операндом С.
Операндом F указывается имя блока, куда переходит транзакт, выходящий из блока UNLINK, если из списка пользователя не выведен ни один транзакт. Если операнд F не используется, выходящий транзакт переходит в следующий блок независимо от количества выведенных транзактов.
Например, блок
UNLINK 4,Apd,1
выводит из списка пользователя с номером 4 один транзакт с начала списка и направляет его в блок с меткой Apd. Блок
UNLINK Otst,Mars,1,BACK
выводит из списка пользователя с именем Otst один транзакт с конца списка и направляет его в блок с меткой Mars. Блок
UNLINK E P$Wiw,App1,ALL,App2,P$App2,App3
выводит из списка пользователя, номер которого записан в параметре Wiw выводящего транзакта, и направляет в блок с меткой App1 все транзакты, содержимое параметра App2 которых равно содержимому одноименного параметра выводящего транзакта. Если таких параметров в списке не окажется, выводящий транзакт будет направлен в блок с меткой Аpp3, в противном случае - к следующему блоку.
Примеры применения списков пользователя (блоков LINK и UNLINK ) показаны в п. 6.3 и 6.7.
UNLINK. Во-первых, если операнды D и Е содержат ссылки на СЧА транзактов, операнд D вычисляется относительно транзак-тов в списке пользователя, а операнд Е - относительно активного транзакта. Во-вторых, после вывода транзактов из списка пользователя планировщик продолжает или начинает продвижение тран-закта с наивысшим приоритетом, а при равенстве приоритетов отдает предпочтение транзакту-инициатору вывода, т. е. первым выводит этот транзакт.Два или более обслуживающих устройств могут быть промоделированы на
Однако часто различные параллельно работающие устройства являются однородными.
МКУ определяется до его использования командой STORAGE. Формат команды:
Name STORAGE A
Name - имя МКУ. Символическому имени может быть поставлен в соответствие номер командой EQU. Это необходимо, если требуется обращаться к нескольким МКУ в блоках SELECT и COUNT или в других случаях. Операнд А может быть только целым положительным числом. Иные способы задания емкости вызывают ошибку.
В модели можно организовать функционирование МКУ в двух режимах:
Занятие и освобождение МКУ имитируется блоками ENTER (войти) и LEAVE (выйти). Форматы блоков:
ENTER A,[B] LEAVE A,[B]
Операнд А в обеих блоках используется для указания имени, соответствующего МКУ. Операнд B задает число устройств (элементов памяти), которое должно быть занято в блоке ENTER или освобождено в блоке LEAVE. По умолчанию операнд В = 1. При В = 0 блок считается неработоспособным.
Когда транзакт входит в блок ENTER, операнд А используется для нахождения МКУ с указанным именем. Если такого МКУ нет, происходит останов по ошибке "Обращение к несуществующей памяти". Если МКУ существует и задан операнд B, он вычисляется, округляется до целого и полученный результат используется для оценки свободной емкости. Транзакт может войти в блок ENTER, если МКУ находится в доступном состоянии и достаточно емкости для выполнения запроса. В противном случае транзакт помещается в список задержки устройства в соответствии с приоритетом.
Когда транзакт входит в блок ENTER (см. блок-диаграмму), планировщик выполняет следующие действия:
B (по умолчанию на 1 ) текущее содержимое МКУ;B (по умолчанию на 1 ) доступную емкость МКУ.Если транзакт при входе в блок ENTER запрашивает больше устройств (элементов памяти), чем определено командой STORAGE, т. е. ее операнд А меньше операнда B блока ENTER, возникает ошибка "Запрос элементов памяти превышает ее общую емкость".
МКУ никогда не может быть удалено из текущей модели, даже если команда STORAGE удаляется из рабочей программы. МКУ можно переопределить, т. е. изменить емкость другой командой STORAGE с тем же самым именем. Например:
Batr STORAGE 18
Повторное описание:
Batr STORAGE 24
Имитация обслуживания транзакта в течение какого-то промежутка времени также осуществляется блоком ADVANCE.

Пример 1.
Nak STORAGE 20
. . .
ENTER Nak,2
ADVANCE 120,40
LEAVE Nak,2
. . .
Командой STORAGE определяется МКУ с именем емкостью 20 единиц. При входе транзакта в блок ENTER занимается 2 единицы и столько же освобождается в блоке LEAVE при выходе из МКУ.
Пример 2.
Nak STORAGE 20 . . . ENTER Nak,21 ADVANCE 120,40 LEAVE Nak,2 . . .
При входе транзакта в блок ENTER произойдет останов по ошибке, так как транзакт будет пытаться занять больше каналов (21), чем определено (20) командой STORAGE. То же самое произойдет, если при выходе из блока LEAVE транзакт будет пытаться освободить каналов больше, чем определено командой STORAGE.
Пример 3.
Pun1 EQU 1 Pun2 EQU 2 Pun3 EQU 3 Pun1 STORAGE 6 Pun2 STORAGE 5 Pun3 STORAGE 3 . . . ENTER *1 ADVANCE MX$NorVr(P2,P3) LEAVE *1 . . .
В данном примере определены три МКУ с именами Pun1, Pun2, Pun3 и емкостями 6, 5 и 3 соответственно. Именам командами EQU поставлены в соответствие номера 1, 2 и 3.
Предполагается, что при входе транзакта в блок ENTER в его первом параметре (ссылка *1) содержится какой-либо один из трех номеров. Согласно этому номеру и занимается МКУ, а затем освобождается. Операнд B в блоках ENTER и LEAVE не используется, поэтому транзактом занимается и освобождается одна единица емкости МКУ.
Ранее (см. табл. 6.1) для МКУ был употреблен термин "память". Это связано с тем, что блоки ENTER и LEAVE могут быть использованы для имитации функционирования запоминающих устройств, например, оперативного или внешних устройств памяти. В этом случае в качестве операнда B этих блоков может быть использован один из параметров транзакта, имитирующего, например, сообщение, содержащий количество занимаемых (освобождаемых) ячеек памяти. Пример такого использования блоков ENTER и LEAVE приведен в 6.7.5.
Недоступность МКУ моделируется блоком SUNAVAIL (символ S означает МКУ, - недоступный). Формат блока:
SUNAVAIL A
Операнд А - имя или номер МКУ, может быть именем, положительным целым числом, выражением в скобках, СЧА, СЧА*параметр.
Например:
SUNAVAIL Batr
Когда транзакт входит в этот блок, МКУ Batr становится недоступным. Если при переводе в недоступное состояние в МКУ находились транзакты, т. е. текущее содержимое МКУ не равнялось нулю, то обслуживание этих транзак-тов продолжается, пока текущее содержимое не станет равным нулю.
Транзакты, которые пытаются занять МКУ во время нахождения его в недоступном состоянии, не входят в блок ENTER и помещаются в список задержки МКУ.
Нахождение в недоступном состоянии продолжается до тех пор, пока транзакт не войдет в блок SAVAIL.
Формат блока:
SAVAIL A

Операнд А - имя или номер МКУ. Может быть таким же, как операнд А в блоке SUNAVAIL.
Если в момент перевода МКУ в доступное состояние в его списке задержки были транзакты, им предоставляется возможность занять МКУ в соответствии с дисциплиной "first-fit-with-skip" (первый подходящий с пропусками).
Транзакты, которым будет отказано в занятии МКУ, остаются в его списке задержки.
SUNAVAIL и SAVAIL невозможна. Такая имитация возможна с использованием блока DISPLACE (см. п. 6.8.2).Состояние МКУ, как и состояние ОКУ, проверяется блоком GATE такого же формата
GATE X A,[B]
Отличие состоит в значениях условного оператора Х, которые могут быть следующими:
SE - МКУ, заданное операндом А, пусто;SF - МКУ, заданное операндом А, заполнено;SNE - МКУ, заданное операндом А, не пусто;SNF - МКУ, заданное операндом А, не заполнено;SNV - МКУ, заданное операндом А, не доступно;SV - МКУ, заданное операндом А, доступно. Блок GATE также работает в двух режимах:Например:
GATE SNF Can,Met5
Если МКУ с именем Can не заполнено, т. е. имеются свободные каналы (элементы памяти), заданное в блоке GATE условие выполняется, и транзакт будет направлен к следующему блоку. Если МКУ заполнено, транзакт будет направлен к блоку с меткой Met5.
Блок GATE позволяет только определить состояние не заполненности МКУ, т. е. наличие свободных каналов, но достаточно ли их для удовлетворения запроса, он не определяет.
Для проверки состояния МКУ могут также использоваться булева переменная и блок TEST [5]. Их использование позволяет расширить возможности по осуществлению проверок состояния, а также сократить машинное время, так как в одном блоке с помощью булевой переменной может проверяться сразу несколько условий.
Для моделирования такого оборудования как переключатели, имеющие только два состояния, в
ON или 1 );OFF или 0 ). В зависимости от состояния ключа изменяется направление движения транзактов.Логический ключ моделируется блоком LOGIC. Формат блока:
LOGIC X A
Операнд А - имя или номер логического ключа. Может быть именем, положительным целым числом, выражением в скобках, СЧА или СЧА*параметр.
Логический оператор Х - состояние логического ключа устанавливается в зависимости от следующих его значений:
S - ключ, заданный операндом А, включается;R - ключ, заданный операндом А, выключается;I - логический ключ инвертируется, т. е. состояние его меняется на противоположное, например, если был включен, будет выключен.Состояние логического ключа проверяется также блоком GATE. Блок GATE имеет такой же формат, как и при проверке состояний ОКУ и МКУ, и два режима работы:
GATE X A,[B]
Операнд А - имя или номер проверяемого ключа. Может быть именем, положительным целым числом, выражением в скобках, СЧА или СЧА*параметр.
Операнд B - метка блока, к которому будет направлен тран-закт при невыполнения условия, заданного оператором Х.
Условный оператор может принимать значения:

LS - равен 1, если логический ключ, заданный операндом А, включен; 0 - если выключен;LR - равен 1, если логический ключ, заданный операндом А, выключен; 0 - если включен.При имитационном моделировании с использованием специальных инструментальных средств, например,
Прямая задача заключается в нахождении
Обратная задача состоит в определении
Решение этих задач, особенно обратной задачи, имеет свои особенности. Рассмотрим эти особенности на примере.
Пример 6.1. Сервер обрабатывает запросы, поступающие с автоматизированных рабочих мест (АРМ) с интервалами, распределенными по показательному закону со средним значением T1= 2 мин. Вычислительная сложность запросов распределена по нормальному закону с математическим ожиданием S1 = 6 x 107 оп и среднеквадратическим отклонением S2 = 2*105 Производительность сервера Q = 6*105 оп /c. В случае занятости сервера поступающий запрос теряется.
Сервер представляет собой однофазную систему массового обслуживания разомкнутого типа с отказами.
Прямая задача.Построить имитационную модель для определения T = 1 час, и
Обратная задача.Построить имитационную модель для определения
Рассчитаем количество прогонов, которые нужно выполнить в каждом наблюдении, т. е. проведем так называемое тактическое планирование эксперимента. Пусть результаты моделирования (вероятность обработки запросов) нужно получить с
В модели для имитации источника запросов следует использовать блок GENERATE, для имитации сервера как одноканального устройства - блоки SEIZE и RELEASE, для имитации обработки запросов - блок ADVANCE.
В модели должны быть следующие элементы:
Серверу дадим имя Server. Для вывода из модели транзактов, имитирующих обработанные и потерянные запросы, используем блоки TERMINATE с метками ObrZap и PotZap соответственно. Для счета количества всех запросов используем метку KolZap.
Построим блок-диаграмму модели для решения прямой задачи, т. е. сегмент имитации поступления и обработки запросов и сегмент задания времени моделирования и расчета результатов моделирования (рис. 6.1).
Блок-диаграмма представляет собой набор стандартных блоков [5]. Она строится так. Из множества блоков выбирают нужные и далее выстраивают их в диаграмму для того, чтобы в процессе функционирования модели они как бы взаимодействовали друг с другом. Диаграмма сопровождается необходимыми комментариями. Использование блоков при построении моделей зависит от логических схем работы реальных систем, моделируемых на ЭВМ.
Теперь приступим к написанию программы модели.
(рис 6.1) Блок-диаграмма модели
Для задания исходных данных используем переменные пользователя. Они задаются с помощью команды EQU. Переменным пользователя даны такие же имена, как и в постановке задачи, но добавлен знак подчеркивания. Например, T1_, S1_ и т. д. Время моделирования зададим переменной пользователя VrMod.
Арифметическая переменная для расчета времени обработки VrObr запроса на сервере:
VrObr VARIABLE (Normal(2,S1_#Koef,S2_#Koef))/Q_
Переменная пользователя Koef введена для удобства изменения (пропорционального изменения) характеристик нормального закона распределения, которому подчиняется вычислительная сложность запросов. Особенно целесообразно использование этой переменной при проведении экспериментов. Примеры применения приведены в главе 7.
Вероятность обработки VerObr запросов на сервере будем определять как отношение количества обработанных N$ObrZap запросов к количеству всего поступивших N$KolZap запросов:
VerObr VARIABLE N$ObrZap/N$KolZap
В арифметическом выражении VerObr, например, N$ObrZap - системный числовой атрибут - количество транзактов, вошедших в блок с меткой ObrZap, а N$KolZap - количество транзактов, вошедших в блок с меткой KolZap.
Все необходимое для написания программы модели имеется. Напишем программу решения прямой задачи.
; Обработка запросов сервером. Прямая задача ; Задание исходных данных T1_ EQU 120 ; Средний интервал поступления запросов, с S1_ EQU 60000000 ; Среднее значение вычислительной сложности запросов, оп S2_ EQU 200000 ; Стандартное отклонение вычислительной сложности запросов, оп Q_ EQU 600000 ; Среднее значение производительности сервера, оп/с Koef EQU 1 ; Коэффициент изменения характеристик нормального распределения VrObr VARIABLE (Normal(2,(S1_#Koef),(S2_#Koef))/Q_ VerObr VARIABLE N$ObrZap/N$KolZap VrMod EQU 3600 ; Время моделирования, 1 ед. мод. времени = 1 с. ; Сегмент имитации обработки запросов GENERATE (Exponential(1,0,T1_)) ; Источник запросов KolZap GATE NU Server,PotZap ; Свободен ли сервер? Если да, то SEIZE Server ; занять сервер ADVANCE V$VrObr ; Имитация обработки запроса RELEASE Server ; Освободить сервер ObrZap TERMINATE ; Обработанные запросы PotZap TERMINATE ; Потерянные запросы ; Сегмент задания времени моделирования и расчета результатов GENERATE VrMod TEST L X$Prog,TG1,Met1 ; Если X$Prog < TG1, SAVEVALUE Prog,TG1 ; то X$Prog = TG1 Met1 TEST E TG1,1,Met2 ; Если TG1 = 1, то SAVEVALUE VerObr, V$VerObr ; расчет и сохранение в ячейке VerObr вероятности обработки запросов SAVEVALUE Res,(INT(N$ObrZap/X$Prog)) ; расчет и сохранение в ячейке Res количества обработанных запросов Met2 TERMINATE 1 START 1000,NP ; Прогоны до установившегося режима RESET ; Сброс накопленной статистики START 9604 ; Количество прогонов модели
При расчете количества обработанных запросов
SAVEVALUE Res,(INT(N$ObrZap/X$Prog))
в арифметическом выражении N$ObrZap/X$Prog используется число прогонов. В арифметическом выражении указано не явное число прогонов, а в виде содержимого ячейки X$Prog. Число прогонов заносится предварительно в эту ячейку по завершении первого прогона модели, но до того момента, когда из счетчика завершений TG1 будет вычтена первая единица. В этом случае арифметическое выражение не зависит от числа прогонов, которое может меняться на различных этапах создания и эксплуатации модели, в том числе и в зависимости от исходных данных, а также от точности и достоверности результатов моделирования. Поскольку количество обработанных запросов не может быть дробным числом, то для получения целого числа, записываемого в ячейку Res, используется процедура INT из встроенной библиотеки.
Для уменьшения машинного времени расчет искомых показателей производится не после каждого прогона, а после завершения последнего прогона, т. е. когда содержимое счетчика завершений будет равно единице ( TG1 = 1 ).
Т1_ нужно нажать клавишу [Tab]. Интервалы табуляции установлены по умолчанию.В результате решения прямой задачи получим, что за один час сервером будет обработано N=16 запросов, а вероятность обработки составит VerObr = 0,546. Если не использовать процедуру INT - выделения целого числа с отбрасыванием дробной части, будет обработано 16,345 запроса.
Для N =16 - результат решения прямой задачи.
Программа модели приведена ниже.
; Обработка запросов сервером. Обратная задача ; Задание исходных данных T1_ EQU 120 ; Средний интервал поступления запросов, с S1_ EQU 60000000 ; Среднее значение вычислительной сложности запросов, оп S2_ EQU 200000 ; Стандартное отклонение вычислительной сложности запросов, оп Q_ EQU 600000 ; Среднее значение производительности сервера, оп/c Koef EQU 1 ; Коэффициент изменения характеристик нормального распределения Koef1 EQU 1 ; Коэффициент учета дробной части N_ EQU 16 ; Количество запросов ; Сегмент имитации обработки запросов GENERATE (Exponential(1,0,T1_)) ; Источник запросов KolZap GATE NU Server,PotZap ; Свободен ли сервер? Если да, то SEIZE Server ; занять сервер ADVANCE ((Normal(2,(S1_#Koef),(S2_#Koef)))/Q_) ; Имитация обработки запроса RELEASE Server ; Освободить сервер TRANSFER ,ObrZap ; Запрос отправляется в сегмент завершения моделирования PotZap TERMINATE ; Потерянные запросы ; Сегмент организации завершения моделирования и расчета результатов ObrZap TEST L X$Prog,TG1,Met1 ; Если X$Prog < TG1, SAVEVALUE Prog,TG1 ; то X$Prog = TG1 SAVEVALUE NZap,0 ; Обнуление счетчика обработанных запросов Met1 SAVEVALUE NZap+,1 ; Счет количества обработанных запросов TEST E X$NZap,N_,Ter1 ; Если X$NZap = N_, то TEST E TG1,1,Met2 ; если TG1 = 1, то SAVEVALUE VerObr,(N$ObrZap/N$KolZap) ; расчет и сохранение в ячейке VerObr вероятности обработки запросов SAVEVALUE TimeNZap,((AC1-X$AC2)/(X$Prog#Koef1)) ;расчет и сохранение в ячейке TimeNZap времени обработки запросов SAVEVALUE AC2,AC1 ; Запомнить абсолютное модельное время в ячейке АС2 Met2 SAVEVALUE NZap,0 ; Обнуление счетчика обработанных запросов TERMINATE 1 Ter1 TERMINATE START 1000,NP ; Прогоны до установившегося режима RESET ; Сброс накопленной статистики START 9604 ; Количество прогонов модели
При решении обратной задачи один прогон определяется заданным количеством запросов N_, а не временем моделирования. Для этого организован счетчик обработанных запросов в виде сохраняемой ячейки NZap. Как только содержимое X$NZap = N_, из счетчика завершений вычитается единица.
Для расчета времени обработки заданного количества запросов используется арифметическое выражение (AC1-X$AC2)/X$Prog. В состав этого выражения входят абсолютное модельное время АС1 и опять количество прогонов. Запоминается количество прогонов также как и при решении прямой задачи.
Кроме этого, в арифметическом выражении есть сохраняемая ячейка X$AC2. Дело в том, что команда RESET не влияет на абсолютное модельное время АС1. Время же выполнения 1000 прогонов до установившегося режима не должно участвовать в расчете. Поэтому оно запоминается, а затем вычитается из абсолютного модельного времени выполнения 1000 + 9604 = 10604 прогонов. Количество прогонов до установившегося режима может быть и другим.
В результате моделирования получим время обработки 16 запросов 3523,658 с.
Фрагмент из отчета моделирования приведен ниже:
SAVEVALUE RETRY VALUE PROG 0 9604.000 NZAP 0 0 VEROBR 0 0.546 TIMENZAP 0 3523.658
А почему не 3600 с? Ведь это же время моделирования было задано при решении прямой задачи. Потому что мы отбросили дробную часть, т. е. взяли 16, а не 16,345. Как же поступить, чтобы учесть и отброшенную дробную часть? Ведь в счетчике фиксируются обработанные запросы только целыми числами, а не дробными?
Для учета десятых долей дробной части зададим N_ = 163, т. е. увеличим в 10 раз. Это нужно учесть и в арифметическом выражении: ((AC1-X$AC2)/(X$Prog#Koef1)). Переменной пользователя Koef1 задается значение 10. По завершении моделирования получим 3586,504. Этот результат уже ближе к 3600.
Для учета сотых долей дробной части зададим N_ = 1634, а Koef1 = 100. Получим 3595,399 с.
Вероятность обработки запросов во всех случаях практически одна и та же, т. е. 0,546. Однако время моделирования существенно возрастает: 4 с, 39 с и 6 мин 29 c, т. е. в 10 и 100 раз соответственно.
В примере
Например (см. сегмент организации завершения моделирования и расчета результатов):
ADVANCE ((Normal(2,(S1_#Koef),(S2_#Koef)))/Q_) ; Розыгрыш времени обработки запроса SAVEVALUE VerObr,(N$ObrZap/N$KolZap)) ; Расчет вероятности обработки запросов SAVEVALUE TimeNZap,((AC1-X$AC2)/(X$Prog#Koef1)) ;Расчет среднего времени обработки запросов
Предприятие имеет $$n_{1}$$ цехов, производящих $$n_{1}$$ типов блоков, т. е. каждый цех производит блоки одного типа. Интервалы выпуска блоков $$T_{1}, T_{2} , ..., T_{n1} $$ - случайные. Из $$n_{1}$$ типов блоков собирается одно изделие.
Перед сборкой каждый тип блоков проверяется на $$n_{11}, n_{12} , ..., n_{1n }$$ соответствующих постах. Длительности контроля одного блока $$T_{11}, T_{12} , ..., T_{1n}$$ случайные. На каждом посту бракуется $$q_{11}, q_{12} , ..., q_{1n} %$$ блоков соответственно. Эти блоки в дальнейшем процессе сборки не участвуют и удаляются с постов контроля.
Прошедшие контроль, т. е. не забракованные блоки поступают на один из $$n_{2}$$ пунктов сборки. На каждом пункте сборки одновременно собирается только одно изделие. Сборка начинается только тогда, когда имеются все необходимые $$n_{2}$$ блоков различных типов. Время сборки $$T_{c}$$ случайное.
После сборки изделие поступает на один из $$n_{3}$$ стендов выходного контроля. На одном стенде одновременно проверяется только одно изделие. Время проверки $$T_{n}$$ случайное. По результатам проверки бракуется $$q_{2} %$$ изделий.
Забракованное изделие направляется в цех сборки, где неработоспособные блоки заменяются новыми. Время замены $$T_{c}$$ случайное. После замены блоков изделие вновь поступает на один из стендов выходного контроля.
Прошедшие стенд выходного контроля изделия поступают в отдел приемки. Время приемки $$T_{пр}$$ одного изделия случайное. По результатам приемки бракуется $$q_{4} %$$ изделий, которые направляются вновь на стенд выходного контроля. Принятые приемкой изделия направляются на склад предприятия.
Разработать имитационную модель процесса изготовления изделий на предприятии.
Вариант 1 .Исследовать влияние интервалов выпуска блоков из цехов, времени сборки и проверки на стенде выходного контроля (табл. 6.2) на количество принятых приемкой изделий в течение недели (40 часов). Результаты моделирования необходимо получить с точностью $$\varepsilon = 1 $$ и
| Уровни факторов | Факторы | |||||
|---|---|---|---|---|---|---|
K1_ |
T2_ |
K3_ |
T4_ |
Kc_ |
Kpr_ |
|
| Нижний | 0,4 | 8 | 0,6 | 10 | 0,5 | 0,7 |
| Верхний | 1,6 | 20 | 1,4 | 24 | 1,5 | 1,3 |
T2_ и T4_ соответствуют $$T_2$$ и $$T_4$$.Т1, Т01, Т3, Т03 соответственно) и нормального ( $$T_{c},$$ $$T_{0c }$$, $$T _{пр}$$, $$T_{0пр}$$, в модели Тс, Т0с, Тpr, Т0pr соответственно) законов распределения производится изменением значений коэффициентов K1_, K3_, Kc_, Kpr_ соответственно. В этом случае среднее значение и сред-неквадратическое отклонение изменяются пропорционально соответствующему коэффициенту, например, T1_#K1_, T01_#K1_.Вариант 2. При исходных данных, указанных в п. 6.4.1.2, исследовать влияние качества изготовления блоков и сборки изделий (табл. 6.3) на количество принятых приемкой изделий в течение недели (40 часов).
| Уровни факторов | Факторы | |||||
|---|---|---|---|---|---|---|
q11_ |
q12_ |
q13_ |
q14_ |
q2_ |
q4_ |
|
| Нижний | 0.4 | 8 | 0.6 | 10 | 0.5 | 0.7 |
| Верхний | 1.6 | 20 | 1.4 | 24 | 1.5 | 1.3 |
Сделать выводы о работе подразделений предприятия и необходимых мерах по повышению их эффективности.
Результаты моделирования необходимо получить с точностью $$\varepsilon = 1$$ и
Предприятие при изготовлении блоков и сборки из них изделий может быть представлено как многофазная многоканальная разомкнутая система массового обслуживания с ожиданием, так как оно имеет все ее элементы (рис. 6.2):
Для имитации МКУ следует использовать блоки ENTER и LEAVE, для ОКУ - SEIZE и RELEASE. Для имитации ОКУ, а в данном случае это пункт приема изделий, можно также использовать МКУ, описав его командой STORAGE с емкостью 1. Тогда при увеличении количества пунктов приема собранных изделий нужно будет только изменить команду STORAGE, записав в ней вместо 1 новое значение емкости МКУ.
(рис 6.2) Предприятие как система массового обслуживанияДля исходных данных в программе модели возьмем те же идентификаторы, что и в постановке задачи, но для предотвращения случаев совпадения с зарезервированными символами
Например, q11_, n1_. Сделаем это для отличия от зарезервированных символов q - системный числовой атрибут, означающий очередь, n -используется в качестве ссылки при определении количества транзактов, вошедших в какой-либо блок программы. Добавление символа подчеркивания предотвратит ошибку, которая в противном случае будет выявлена на этапе создания объекта "Процесс моделирования". Другие идентификаторы будем вводить по мере уяснения задачи, а также в ходе разработки блок-диаграммы и программы модели.
Для моделирования необходимо привести в соответствие время протекания реального процесса изготовления блоков и сборки изделий на предприятии и в модели. Это осуществляется введением масштабного коэффициента, например, если для условий рассматриваемой задачи его взять равным 1, а в реальном процессе измерять время в минутах, то 1 мин будет соответствовать 1 ед. мод. вр. Тогда время моделирования VrMod = 60 # 40 = 2400 ед. мод. вр. Временные параметры изготовления и контроля блоков, сборки, контроля и приемки изделий даны в минутах, поэтому при выбранном масштабном коэффициенте 1 они не изменятся.
В модели, как процесса, протекающего в СМО (см. рис. 6.2), необходимо иметь:
Модели функционирования систем на
При этом отдельные элементы модели и модель в целом имеют достаточно различимое подобие. Для получения такого вывода сравните рис. 6.2 и 6.3: состав и блок-диаграмму модели функционирования предприятия.
Это подобие может быть также усилено разработчиком за счет продуманного на этапе разработки разделения исследуемого объекта на элементы, на процессы, протекающие в них, а модели - на сегменты.
Однако возможно и другое. В данном примере в каждом цехе имеются свои посты контроля блоков. Поэтому, казалось, в модели должны были бы быть сегменты, имитирующие работу цеха и его постов контроля. По предложенному же составу модели видно, что в нее входят сегменты, имитирующие работу каждого из цехов без постов контроля, и сегмент имитации работы всех постов контроля. Т. е. как бы все посты контроля блоков объединены в отдельное подразделение предприятия, но функциональное предназначение соответствующих постов контроля осталось прежним.
Объединение сделано в интересах частичной универсальности модели. Предположим, количество цехов увеличилось. В первом случае нужно было бы добавлять сегменты имитации работы цехов и постов контроля, т. е. количество блоков в модели увеличилось бы. Во втором случае добавляются только сегменты имитации работы цехов и необходимые исходные данные. При этом сегмент имитации функционирования постов контроля блоков изделий остается неизменным.
Списки пользователя применяются для имитации работы складов готовых блоков. Предполагается наличие такого склада у каждого цеха.
Для розыгрыша брака блоков и изделий используется блок TRANSFER в статистическом режиме.
Обратите внимание, что в сегменте имитации сборки изделий блок TEST используется в режиме, который рекомендуется избегать вследствие того, что проверяемое условие может не выполниться. Однако здесь этого не должно быть, так как в противном случае будут отсутствовать готовые блоки для сборки изделий. По мере готовности блоков условие обязательно выполняется и блоки - транзакты направляются на сборку. Первые три транзакта уничтожаются, а четвертый транзакт имитирует собранное из четырех блоков изделие. Он направляется для проверки работоспособности на пункт приема изделий.
(рис 6.3) Блок-диаграмма модели (лист 1)
(рис 6.3) Блок-диаграмма модели (продолжение, лист 2)
(рис 6.3) Блок-диаграмма модели (продолжение, лист 3)
(рис 6.3) Блок-диаграмма модели (продолжение, лист 4)
(рис 6.3) Блок-диаграмма модели (окончание, лист 5)
Программа модели построена в соответствии с блок-диаграммой (см. рис. 6.3). В ней, кроме, как уже отмечалось, раскрытия методов использования ОКУ, МКУ и списков пользователя демонстрируется применение номеров МКУ вместо их имен.
Этот метод дает возможность иметь в модели один сегмент имитации работы постов контроля блоков вместо подобного сегмента для каждого цеха, т. е. сократить число блоков в модели.
Обратите внимание, что в программе присвоение номеров именам МКУ указывается в самом начале и только потом, не обязательно следом, определение МКУ командой STORAGE. Если вы построите программу так, что поменяете порядок: вначале определение МКУ командой STORAGE, а потом - присвоение командой EQU номеров именам МКУ, то на этапе выполнения программы модели возникнет ошибка: "Обращение к несуществующей памяти". На этапе создания объекта "Процесс моделирования" ошибка изменение этого порядка не обнаруживается.
; Модель функционирования предприятия. Прямая задача ; Замена имен МКУ номерами Kontr1 EQU 1 Kontr2 EQU 2 Kontr3 EQU 3 Kontr4 EQU 4 ; Задание исходных данных q11_ EQU 0.02 ; Доля брака блоков на постах n11 q12_ EQU 0.03 ; Доля брака блоков на постах n12 q13_ EQU 0.04 ; Доля брака блоков на постах n13 q14_ EQU 0.06 ; Доля брака блоков на постах n14 q2_ EQU 0.05 ; Доля брака изделий на пункте вых. контроля q4_ EQU 0.03 ; Доля забракованных изделий приемкой TipBl EQU 4 ; Максимальное количество типов блоков VrMod EQU 2400 ; Время моделирования, 1 ед. мод. вр. = 1 мин T1_ EQU 19 ; Средний интервал выпуска блоков типа 1 T01_ EQU 6 ; Стандартное отклонение времени выпуска блоков типа 1 T2_ EQU 11 ; Средний интервал выпуска блоков типа 2 T3_ EQU 15 ; Средний интервал выпуска блоков типа 3 T03_ EQU 8 ; Стандартное отклонение времени выпуска блоков типа 3 T4_ EQU 18 ; Средний интервал выпуска блоков типа 4 T11_ EQU 12 ; Среднее время контроля на постах n11 T011_ EQU 6 ; Стандартное отклонение времени контроля на постах n11 T12_ EQU 16 ; Среднее время контроля на постах n12 T13_ EQU 21 ; Среднее время контроля на постах n13 T14_ EQU 17 ; Среднее время контроля на постах n14 Tc_ EQU 22 ; Среднее время сборки изделия T0c_ EQU 2 ; Стандартное отклонение времени сборки изделия Tp_ EQU 15 ; Среднее время проверки изделия Tpr_ EQU 18 ; Среднее время приема изделия T0pr_ EQU 2 ; Стандартное отклонение времени приема изделия ; Коэффициенты изменения параметров законов распределения K1_ EQU 1 ; Коэффициент изменения T1_ и T01_ K2_ EQU 1 ; Коэффициент изменения T2_ и T02_ K3_ EQU 1 ; Коэффициент изменения T3_ и T03_ K4_ EQU 1 ; Коэффициент изменения T4_ и T04_ Kc_ EQU 1 ; Коэффициент изменения Tс_ и T0с_ Kp_ EQU 1 ; Коэффициент изменения Tp_ и T0p_ Kpr_ EQU 1 ; Коэффициент изменения Tpr_ и T0pr_ ; Задание количества пунктов сборки и постов контроля Sbor STORAGE 2 ; Количество пунктов сборки Kontr1 STORAGE 3 ; Количество постов n11 Kontr2 STORAGE 2 ; Количество постов n12 Kontr3 STORAGE 2 ; Количество постов n13 Kontr4 STORAGE 2 ; Количество постов n14 Kontsb STORAGE 2 ; Количество стендов выходного контроля ; Описание арифметических выражений KolIzd VARIABLE INT(N$Term7/X$prog) ; Количество готовых изделий KolGotBl VARIABLE (INT(CH*1/X$Prog)) ; Количество готовых блоков всех типов, оставшихся на складах KolBrBl VARIABLE (INT(X*1/X$Prog)) ; Количество забракованных блоков всех типов TIzd VARIABLE (AC1/X$Prog)/X$KolIzd ; Среднее время подготовки одного изделия ;Сегмент имитации работы цеха 1 без постов контроля GENERATE (T1_#K1_),(T01_#K1_) ASSIGN 1,1 ; Код 1 в параметре 1 транзакта - тип 1 блока ASSIGN 2,((T11_-T01_)+2#T011_#(RN27/1000)) ; Розыгрыш времени контроля и запись в Р2 ASSIGN 9,q11_ ; Запись в Р9 доли брака блоков после постов контроля TRANSFER ,Met1 ; Сегмент имитации работы цеха 2 без постов контроля GENERATE (Exponential(32,0,(T2_#K2_))) ASSIGN 1,2 ; Код 2 в параметре 1 транзакта - тип 2 блока ASSIGN 2,(Exponential(23,0,T12_)) ; Розыгрыш времени контроля и запись в Р2 ASSIGN 9,q12_ ; Запись в Р9 доли брака блоков после постов контроля TRANSFER ,Met1 ; Сегмент имитации работы цеха 3 без постов контроля GENERATE (T3_#K3_),(T03_#K3_) ASSIGN 1,3 ; Код 3 в параметре 1 транзакта - тип 3 блока ASSIGN 2,(Exponential(22,0,T13_)) ; Розыгрыш времени контроля и запись в Р2 ASSIGN 9,q13_ ; Запись в Р9 доли брака блоков после постов контроля TRANSFER ,Met1 ; Сегмент имитации работы цеха 4 без постов контроля GENERATE (Exponential(32,0,(T4_#K4_))) ASSIGN 1,4 ; Код 4 в параметре 1 транзакта - тип 4 блока ASSIGN 2,(Exponential(22,0,T14_)) ; Розыгрыш времени контроля и запись в Р2 ASSIGN 9,q14_ ; Запись в Р9 доли брака блоков после постов контроля ; Сегмент имитации работы постов контроля блоков Met1 QUEUE P1 ; Встать в очередь с номером в Р1 ENTER P1 ; Занять МКУ с номером в Р1 DEPART P1 ; Покинуть очередь с номером в Р1 ADVANCE P2 ; Имитация контроля с временем в Р2 LEAVE P1 ; Освободить МКУ с номером в Р1 ASSIGN 10,0 ; Подготовка к циклу Met21 ASSIGN 10+,1 ; Начало цикла по числу типов блоков TEST E P10,P1,Met21 ; Какой тип блока подготовлен? TRANSFER P9,,Met14 ; Отправить брак блоков к Met14 LINK P1,FIFO ; Готовые блоки на склад с номером в Р1 ; Сегмент имитации сборки изделий GENERATE ,,,1 Met3 ASSIGN 1,0 ; Подготовка к циклу Met13 ASSIGN 1+,1 ; Начало цикла по числу типов блоков TEST L P1,TipBl,Met4 ; Все ли типы блоков? TEST NE CH*1,0 ; Есть на складе готовые блоки? UNLINK P1,Term5,1 ; Да TEST G P1,TipBl,Met13 ; Блоки всех типов есть? Если да, Met4 UNLINK P1,Met5,1 ; то, отправить блоки на сборку TRANSFER ,Met3 ; Вернуться для проверки наличия всех типов блоков для следующего изделия Met5 QUEUE Sbor ; Занять очередь на пункты сборки ENTER Sb ; Занять пункт сборки DEPART Sbor ; Освободить очередь на пункт сборки ADVANCE (Normal(15,(Tc_#Kc_),(T0c_#Kc_))) ; Имитация сборки LEAVE Sb ; Освободить пункт сборки ; Сегмент имитации работы стендов выходного контроля Met9 QUEUE KSbor ; Занять очередь на стенд выходного контроля ENTER KSb ; Занять стенд выходного контроля DEPART KSbor ; Освободить очередь на стенд выходного контроля ADVANCE (Exponential(11,0,(Tp_#Kp_))) ; Имитация работы стенда выходного контроля LEAVE KSb ; Освободить стенд выходного контроля TRANSFER q2_,,Met5 ; Направить в приемку, а брак - для замены на пункт сборки ; Сегмент имитации работы приемки QUEUE Opr ; Занять очередь на пункт приемки SEIZE KPr ; Занять пункт приемки DEPART Opr ; Освободить очередь пункта приемки ADVANCE (Normal(11,(Tpr_#Kpr_),(T0pr_#Kpr_))) ; Имитация работы приемки RELEASE KPr ; Освободить пункт приемки TRANSFER q4_,,Met9 ; Готовые изделия - на склад ; Сегмент счета блоков и изделий Term7 TERMINATE ; Количество готовых изделий Met14 SAVEVALUE P1+,1 ; Количество брака блоков всех типов TERMINATE Term5 TERMINATE ; Задание времени моделирования и расчет результатов моделирования GENERATE VrMod ; Задание времени моделирования TEST L X$Prog,TG1,Met10 ; Если X$Prog< содержимого счетчика завершений, то SAVEVALUE Prog,TG1 ; записать в X$Prog содержимое счетчика завершений Met10 TEST E TG1,1,Met12 ; Если содержимое счетчика завершений равно 1, то расчет результатов моделирования SAVEVALUE KolIzd,V$KolIzd ; Количество готовых изделий ASSIGN 1,0 ; Подготовка к циклу Met15 ASSIGN 1+,1 ; Начало цикла по числу типов блоков SAVEVALUE (10+P1),V$KolGotBl ; Количество готовых блоков всех типов, оставшихся на складах SAVEVALUE P1,V$KolBrBl ; Количество забракованных блоков всех типов ASSIGN 11,(20+P1) ; Задание номера Х и запись его в Р11 TEST GE P1,TipBl,Met15 ; Все ли типы блоков? SAVEVALUE TIzd,V$TIzd ; Среднее время подготовки одного изделия Met12 TERMINATE 1
Отладьте модель. Выполните моделирование, указав в команде START 1000 прогонов. В отчете, фрагмент которого приведен ниже,
SAVEVALUE RETRY VALUE KOLIZD 0 122.000 TIZD 0 19.512
найдите, что за 40 часов подготовлено 122 изделия, а среднее время подготовки одного изделия ? 20 мин (19,51 мин).
После изучения материала главы 7 вернитесь к данной задаче и проведите два отсеивающих эксперимента (
При необходимости внесите в эти данные свои изменения. По результатам экспериментов сделайте выводы.
Постановка задачи аналогична постановке задачи п. 6.4.1.1 при тех же исходных данных (п. 6.4.1.2).
Отличие состоит в том, что нужно построить имитационную модель для определения N_ - количество изделий, время изготовления которых нужно оценить.
В программе модели те же сегменты (п. 6.4.1.6), только вместо сегмента задания времени моделирования и расчета результатов включен сегмент организации завершения моделирования и расчета результатов моделирования.
Один прогон наблюдения завершается подготовкой N_ изделий, т. е. поступлением их на склад. Поэтому соответствующие этим изделиям транзакты не выводятся сразу из модели, как в прямой задаче, а поступают в сегмент организации завершения моделирования и расчета результатов моделирования.
В блоке
Met10 SAVEVALUE NIzd+,1
подсчитывается количество подготовленных изделий. Если это количество равно N_, т. е. выполняется условие
TEST E X$NIzd,N_,Term5
фиксируется один прогон.
С целью сокращения машинного времени расчет результатов моделирования производится один раз по накопленной статистике за все прогоны. Программа, как и в п. 6.3.2.2, построена так, чтобы расчет результатов моделирования не требовал ее изменения при различном числе прогонов, задаваемом пользователем.
Ниже приведена программа обратной задачи.
; Модель функционирования предприятия. Обратная задача ; Замена имен МКУ номерами Kontr1 EQU 1 ; Замена имени МКУ Kontr1 номером Kontr2 EQU 2 ; Замена имени МКУ Kontr2 номером Kontr3 EQU 3 ; Замена имени МКУ Kontr3 номером Kontr4 EQU 4 ; Замена имени МКУ Kontr4 номером ; Задание исходных данных q11_ EQU 0.02 ; Доля забракованных блоков на постах n11 q12_ EQU 0.03 ; Доля забракованных блоков на постах n12 q13_ EQU 0.04 ; Доля забракованных блоков на постах n13 q14_ EQU 0.06 ; Доля забракованных блоков на постах n14 q2_ EQU 0.05 ; Доля брака изделий на пункте выходного контроля q4_ EQU 0.03 ; Доля забракованных изделий приемкой TipBl EQU 4 ; Максимальное количество типов блоков, изготавливаемых цехами T1_ EQU 19 ; Средний интервал выпуска блоков типа 1 T01_ EQU 6 ; Стандартное отклонение времени выпуска блоков типа 1 T2_ EQU 11 ; Средний интервал выпуска блоков типа 2 T3_ EQU 15 ; Средний интервал выпуска блоков типа 3 T03_ EQU 8 ; Стандартное отклонение времени выпуска блоков типа 3 T4_ EQU 18 ; Средний интервал выпуска блоков типа 4 T11_ EQU 12 ; Среднее время контроля на постах n11 T011_ EQU 6 ; Стандартное отклонение времени контроля на постах n11 T12_ EQU 16 ; Среднее время контроля на постах n12 T13_ EQU 21 ; Среднее время контроля на постах n13 T14_ EQU 17 ; Среднее время контроля на постах n14 Tc_ EQU 22 ; Среднее время сборки изделия T0c_ EQU 2 ; Стандартное отклонение времени сборки изделия Tp_ EQU 15 ; Среднее время проверки изделия Tpr_ EQU 18 ; Среднее время приема изделия T0pr_ EQU 2 ; Стандартное отклонение времени приема изделия N_ EQU 122 ; Количество изделий, которое необходимо подготовить ; Задание количества пунктов сборки и контроля Sbor STORAGE 2 ; Количество пунктов сборки Kontr1 STORAGE 3 ; Количество постов n11 Kontr2 STORAGE 2 ; Количество постов n12 Kontr3 STORAGE 2 ; Количество постов n13 Kontr4 STORAGE 2 ; Количество постов n14 Kontsb STORAGE 2 ; Количество пунктов сборки ; Сегмент имитации работы цеха 1 без постов контроля GENERATE T1_,T01_; Источник блоков типа 1 ASSIGN 1,1 ; Код 1 в параметре 1 транзакта - тип 1 блока ASSIGN 2,((T11_-T011_)+2#T011_#(RN27/1000)) ; Розыгрыш времени контроля и запись в Р2 ASSIGN 9,q11_ ; Запись в Р9 доли брака блоков после постов контроля TRANSFER ,Met1 ; Сегмент имитации работы цеха 2 без постов контроля GENERATE (Exponential(32,0,T2_)); Источник блоков типа 2 ASSIGN 1,2 ; Код 2 в параметре 1 транзакта - тип 2 блока ASSIGN 2,(Exponential(23,0,T12_)) ; Розыгрыш времени контроля и запись в Р2 ASSIGN 9,q12_ ; Запись в Р9 доли брака блоков после постов контроля TRANSFER ,Met1 ; Сегмент имитации работы цеха 3 без постов контроля GENERATE T3_,T03_ ; Источник блоков типа 3 ASSIGN 1,3 ; Код 3 в параметре 1 транзакта - тип 3 блока ASSIGN 2,(Exponential(22,0,T13_)) ; Розыгрыш времени контроля и запись в Р2 ASSIGN 9,q13_ ; Запись в Р9 доли брака блоков после постов контроля TRANSFER ,Met1 ; Сегмент имитации работы цеха 4 без постов контроля GENERATE (Exponential(32,0,T4_)) ; Источник блоков типа 4 ASSIGN 1,4 ; Код 4 в параметре 1 транзакта - тип 4 блока ASSIGN 2,(Exponential(22,0,T14_)) ; Розыгрыш времени контроля блока и запись в Р2 ASSIGN 9,q14_ ; Запись в Р9 доли брака блоков после постов контроля ; Сегмент имитации работы постов контроля блоков Met1 QUEUE P1 ; Встать в очередь с номером в Р1 ENTER P1 ; Занять МКУ с номером в Р1 DEPART P1 ; Покинуть очередь с номером в Р1 ADVANCE P2 ; Имитация контроля качества блока с временем контроля в Р2 LEAVE P1 ; Освободить МКУ с номером в Р1 ASSIGN 10,0 ; Подготовка к циклу Met21 ASSIGN 10+,1 ; Начало цикла по числу типов блоков TEST E P10,P1,Met21 ; Какой тип блока подготовлен? TRANSFER P9,,Met14 ; Отправить брак блоков к Met14 LINK P1,FIFO ; Готовые блоки на склад с номером в Р1 ; Сегмент имитации сборки изделий GENERATE ,,,1 Met3 ASSIGN 1,0 ; Подготовка к циклу Met13 ASSIGN 1+,1 ; Начало цикла по числу типов блоков TEST L P1,TipBl,Met4 ; Все ли типы блоков? TEST NE CH*1,0 ; Есть на складе готовые блоки? UNLINK P1,Term5,1 ; Да TEST G P1,TipBl,Met13 ; Блоки всех типов есть? Если да, Met4 UNLINK P1,Met5,1 ; то отправить блоки на сборку TRANSFER ,Met3 ; Вернуться для проверки наличия всех типов блоков для следующего изделия Met5 QUEUE Sbor ; Занять очередь на пункты сборки ENTER Sb ; Занять пункт сборки DEPART Sbor ; Освободить очередь на пункт сборки ADVANCE (Normal(15,Tc_,T0c_)) ; Имитация сборки LEAVE Sb ; Освободить пункт сборки ; Cегмент имитации работы стендов выходного контроля Met9 QUEUE KSbor ; Занять очередь на стенд выходного контроля ENTER KSb ; Занять стенд выходного контроля DEPART KSbor ; Освободить очередь на стенд выходного контроля ADVANCE (Exponential(11,0,Tp_)) ; Имитация работы стенда выходного контроля LEAVE KSb ; Освободить стенд выходного контроля TRANSFER q2_,,Met5 ; Направить изделие в приемку, а брак -на замену на пункт сборки ; Сегмент имитации работы приемки QUEUE Opr ; Занять очередь на пункт приемки SEIZE KPr ; Занять пункт приемки DEPART Opr ;Освободить очередь пункта приемки ADVANCE (Normal(11,Tpr_,T0pr_)) ; Имитация работы приемки RELEASE KPr ; Освободить пункт приемки TRANSFER q4_,,Met9 ; Готовые изделия - на склад ; Сегмент организации завершения моделирования и расчета результатов моделирования TEST L X$Prog,TG1,Met10 ; Если X$Prog< содержимого счетчика завершений, то SAVEVALUE Prog,TG1 ; записать в X$Prog содержимое счетчика завершений - количество прогонов из TG1 SAVEVALUE NIzd,0 Met10 SAVEVALUE NIzd+,1 ; Счет и сохранение в ячейке NIzd количества принятых приемкой изделий TEST E X$NIzd,N_,Term5 ; Если принято N_изделий, зафиксировать один прогон TEST E TG1,1,Met12 ; Если содержимое счетчика завершений равно 1, то расчет результатов моделирования ASSIGN 1,0 ; Подготовка к циклу Met15 ASSIGN 1+,1 ; Начало цикла по числу типов блоков SAVEVALUE (10+P1),(INT(CH*1/X$Prog)) ; Количество готовых блоков всех типов, оставшихся на складах SAVEVALUE P1,(INT(X*1/X$Prog)) ; Количество забракованных блоков всех типов ASSIGN 11,(20+P1) ; Задание номера сохраняемой ячейки и запись его в Р11 TEST GE P1,TipBl,Met15 ; Все ли типы блоков для подготовки изделия имеются на складах цехов? SAVEVALUE TIzd,((AC1/X$Prog)/60) ; Расчет и сохранение в ячейке TIzd времени подготовки N_изделий, час SAVEVALUE STIzd,((X$TIzd/N_)#60) ; Расчет и сохранение в ячейке STIzd среднего времени подготовки одного изделия, мин Met12 SAVEVALUE NIzd,0 ; Обнуление X$NIzd - подготовка к очередному прогону TERMINATE 1 Met14 SAVEVALUE P1+,1 ; Количество брака блоков всех типов TERMINATE Term5 TERMINATE ; Вывод вспомогательных транзактов
Отладьте модель. Запустите модель, указав в команде START 1000 прогонов. По окончании моделирования в отчете, фрагмент которого приведен ниже,
SAVEVALUE RETRY VALUE TIZD 0 39.438 STIZD 0 19.396
получите, что среднее время подготовки N_=122 изделий составляет 40 ч (39,438) при среднем времени подготовки одного изделия 20 мин (19,396). Как видно, эти результаты согласуются с исходными данными и результатами решения прямой задачи.
Результаты
START TIME END TIME BLOCKS FACILITIES STORAGES 0.000 2366280.440 74 1 6
Разделите END TIME (абсолютное модельное время АС1) на количество прогонов и минут в одном часе, т. е. на 60 000, получите ?40 ч.
Теперь в программе модели укажите командой EQU количество изделий N_=244:
N_ EQU 244
Выполните моделирование, указав, как и в предыдущем случае, в команде START 1000 прогонов. Из отчета
| SAVEVALUE | RETRY | VALUE |
|---|---|---|
| TIZD | 0 | 78.863 |
| STIZD | 0 | 19.393 |
видно, что время подготовки, как и число изделий, увеличивается в два раза при неизменном времени изготовления одного изделия.
Сделайте выводы: влияет ли стохастичность, как и при решении прямой задачи, на результаты моделирования.
Автоматическая телефонная станция (АТС) обслуживает $$n_{1}$$ телефонных аппаратов (ТА) первой категории (ТА1), $$n_{2}$$ ТА второй категории (ТА2) и имеет $$n_{3}$$ выходов в сеть связи. Интервал времени $$T_{1} /n_{1}$$ между звонками с ТА1 случайный. Вероятность звонка с i-го ТА1 $$p_{1i} =1/ n_{1}.$$ Вероятность того, что при этом для разговора потребуется внешняя линия связи $$p_{2} = n_{3} / (n_{2} + n_{3} ),$$ соединение с ТА2 $$p_{3} = n_{2} / (n_{2} + n_{3} ).$$ При этом может быть занята любая свободная линия связи, а вероятность звонка на $$j$$ -й ТА2 $$p_{4j} =1/ n_{2}.$$ Длительность $$t_{1}$$ разговора с ТА1 случайная. Время $$t_{ож1}$$ ожидания при занятости ТА или внешних линий связи случайное. Вероятность того, что ТА2 не ответит, $$p_{5}.$$ При этом время $$t_{ож2}$$ случайное.
Интервал времени $$T_{2} /n_{2}$$ между звонками с ТА2 случайный. Вероятность звонка с $$k$$ -го ТА2 $$p_{6k} =1/ n_{2}.$$ Вероятности того, что при этом для разговора потребуются внешняя линия связи $$p_{7} = n_{3} / (n_{1} + n_{3} ),$$ соединение с ТА1 $$p_{7} = n_{1} / (n_{1} + n_{3} ).$$ Для разговора может быть занята любая свободная внешняя линия связи, а вероятность звонка на $$l$$ -й ТА1 $$p_{9l} =1/ n_{1}.$$ Длительность $$t_{2} $$ разговора с ТА2 случайная. Время $$t_{ож3}$$ при занятости ТА или внешних линий связи случайное. Вероятность того, что ТА1 не ответит, $$p_{10}.$$ При этом время $$t_{ож4}$$ также случайное.
Звонки с ТА1 обладают абсолютным приоритетом по отношению к звонкам с ТА2 при занятости внешнего выхода в сеть связи. Поэтому, если при поступлении с ТА1 заявки на разговор по внешнему выходу все внешние выходы будут заняты разговорами также с ТА1, прерывания разговоров не происходит и заявка считается потерянной. Если же некоторые внешние выходы будут заняты разговорами с ТА2, после $$t_{ож1}$$ один из этих разговоров прерывается (теряется) и начинается разговор по этому выходу с ТА1.
Разработать имитационную модель функционирования АТС. Исследовать зависимость вероятности разговоров абонентами ТА1 от интервалов времени T1, T2, времени t1, t2 разговоров и вероятностей р5 и р10 ответа на звонки абонентов ТА2 и ТА1 соответственно.
Результаты моделирования необходимо получить с точностью $$\varepsilon = 0,01$$ и \alpha = 0,99.
Модель функционирования АТС должна иметь:
Телефоны и внешние выходы в модели нужно представить ОКУ, а заявки на разговоры - транзактами. Казалось бы, что в целях сокращения программы модели нужно использовать МКУ, однако МКУ не дает возможности идентифицировать каждый свой канал. Что касается сокращения, то этого можно достичь и с ОКУ.
В программе п. 6.5.1.6 (сегмент имитации работы постов контроля) был продемонстрирован метод сокращения блоков модели за счет замены имен МКУ номерами. Язык
Но для одноканального устройства это возможно. Дадим, используя переменные пользователя, номера ОКУ, предварительно не указывая их имена:
1 … N1_ ;(N1_+1) … (N1_+N2_) ;(N1_+N2_+1) … (N1_+N2_+N3_).Нумерацию будем использовать в блок-диаграмме и программе модели. За счет этого при увеличении числа ТА1, ТА2 и внешних выходов программа модели не потребует внесения каких-либо изменений.
Конечно, можно также определить арифметические выражения для вычисления (N1_+N2_), (N1_+N2_+N3_) и затем ссылаться на них в программе модели, например:
Num1 VARIABLE N1_+N2_ Num2 VARIABLE N1_+N2_+N3_
В больших моделях этот вариант предпочтителен. Для лучшего понимания построения модели ее
В программе демонстрируется возможность
Для имитации прерывания телефонных разговоров абонентов ТА2 звонками абонентов с ТА1 используются блоки PREEMPT и RETURN.
Блок-диаграмма модели представлена ниже (рис. 6.4).
(рис 6.4) Блок-диаграмма модели АТС (лист 1)
(рис 6.4) Блок-диаграмма модели АТС (продолжение, лист 2)
(рис 6.4) Блок-диаграмма модели АТС (продолжение, лист 3)
(рис 6.4) Блок-диаграмма модели АТС (продолжение, лист 4)
(рис 6.4) Блок-диаграмма модели АТС (окончание, лист 5)
В программе модели для задания исходных данных используются переменные пользователя. Значения им присваиваются командой EQU. Это позволяет проводить эксперименты с использованием встроенных генераторов, так как факторы в них должны быть только переменными пользователя.
Рассмотрим работу сегмента имитации телефонных разговоров с ТА1.
Генератор этого сегмента вводит в модель транзакты со средним интервалом времени (T1_/ N1_ ). Поскольку звонки с ТА1 имеют абсолютный приоритет, то блоком GENERATE транзактам присваивается приоритет 1. Генератор сегмента имитации телефонных разговоров с ТА2 вводит в модель транзакты с нулевым приоритетом.
После ввода транзакта в модель, имитирующего заявку на звонок, производится определение номера звонящего ТА1. Группа событий - звонки с ТА1 - рассматривается как
Определенный в результате розыгрыша номер ТА1 заносится в параметр Р3 транзакта. Однако возможно, что с этого телефона уже звонят. Поэтому блоком GATE производится проверка: свободен ли ТА1 с данным номером? Если нет, заявка теряется.
Если телефон свободен, то далее определяется: куда звонок? На ТА2 или требуется внешний выход? Ответ на этот вопрос находится розыгрышем единичного события (см. п. 3.6).
Пусть требуется внешний выход. Поиск свободного внешнего выхода производится в цикле от номера (N1_+ N2_)+1) до номера ( N1_+ N2_+ N3_). Предположим, что найден свободный
внешний выход, номер которого занесен в параметр Р4. Тогда последовательностью блоков, начиная с метки Мет4, имитируется ведение разговора с ТА1 без прерывания разговора по внешнему выходу с ТА2. После занятия свободного выхода в сохраняемую ячейку с тем же номером, что и номер занятого внешнего выхода, заносится уровень приоритета, в данном случае это 1.
Разговор с ТА1 по внешнему выходу состоялся. Транзакт выводится из модели блоком TERMINATE с меткой Ter2.
Вернемся к поиску свободного внешнего выхода. Пусть все внешние выходы заняты. Далее отыскивается внешний выход, занятый разговором с ТА2. Поиск производится также в цикле от номера (N1_+ N2_) +1 до номера ( N1_+ N2_+ N3_). Однако при этом проверяется содержимое сохраняемых ячеек с такими же номерами, как и номера внешних выходов. Если содержимое проверяемой ячейки равно 1, то внешний выход занят ТА1. Если все внешние выходы заняты ТА1, т. е. во всех проверяемых сохраняемых ячейках 1, заявка на звонок теряется - транзакт отправляется на метку Мет23.
Пусть найден внешний выход, занятый ТА2, т. е. в соответствующей сохраняемой ячейке 0. Транзакт переходит к последовательности блоков, начинающихся с метки Мет22. Эта последовательность имитирует прерывание разговора с ТА2 и ведение разговора с ТА1 по внешнему выходу. По окончании разговора тран-закт выводится из модели блоком TERMINATE с меткой Ter1.
Возвратимся к последовательности блоков, разыгрывающей номер ТА1, с которого поступает заявка на звонок. Пусть теперь требуется не внешний выход, а нужно позвонить одному из абонентов ТА2. В этом случае транзакт направляется к последовательности блоков, начинающейся с метки Мет2. Эта последовательность имитирует определение номера ТА2, на который звонят с ТА1. Номер ТА2 разыгрывается также, как и ранее рассмотренный розыгрыш номера ТА1. После определения номера ТА2 проверяется: свободен ли ТА2 с данным номером? Если не свободен, фиксируется несостоявшийся разговор выводом транзакта из модели блоком TERMINATE с меткой Ter3.
Если же ТА2 свободен, транзакт направляется к последовательности блоков, начинающейся с метки Мет6. Эти блоки имитируют ведение разговора абонентами ТА1 и ТА2. По окончании разговора транзакт выводится из модели блоком TERMINATE с меткой Ter4.
Сегмент имитации телефонных разговоров с ТА2 отличается от только что рассмотренного тем, что в нем отсутствует последовательность блоков, имитирующей прерывание разговоров с ТА2 заявками на разговор с ТА1 при отсутствии свободных внешних выходов.
; Модель функционирования автоматической телефонной станции ; Задание исходных данных VrMod EQU 3600 ; Время моделирования, 1 ед. мод. вр. = 1 с N1_ EQU 10 ; Количество ТА1 N2_ EQU 20 ; Количество ТА2 N3_ EQU 3 ; Количество внешних выходов T1_ EQU 40 ; Время для расчета интервалов между звонками с ТА1 T2_ EQU 50 ; Время для расчета интервалов между звонками с ТА2 Tog1 EQU 3.5 ; Среднее время ожидания при занятости внешних линий Tog01 EQU 0.5 ; Среднеквадратическое отклонение времени ожидания Tog2 EQU 3 ; Среднее время ожидания при звонке с ТА1 на ТА2 Tog02 EQU 0.5 ; Среднеквадратическое отклонение времени ожидания Tog3 EQU 2.5 ; Среднее время ожидания при занятости внешних линий Tog03 EQU 0.4 ; Среднеквадратическое отклонение времени ожидания Tog4 EQU 2 ; Среднее время ожидания при звонке с ТА2 на ТА1 Tog04 EQU 0.3 ; Среднеквадратическое отклонение времени ожидания Trazg1 EQU 3 ; Среднее время разговора с ТА1 Trazg2 EQU 5 ; Среднее время разговора с ТА2 P5_ EQU 0.7 ; Вероятность того, что ТА2 не ответит P10_ EQU 0.3 ; Вероятность того, что ТА1 не ответит ; Сегмент имитации телефонных разговоров с ТА1 GENERATE (Exponential(333,0,(T1_/N1_))),,,,1 ; Определение номера звонящего ТА1 Met0 ASSIGN 7,(RN43/1000) ; Обращение к генератору RN Met1 ASSIGN 3+,1 ; Начало цикла определения номера звонящего ТА1 TEST LE P7,(P3#(1/N1_)),Met1 ; Если условие выполнено, то номер ТА1 запомнить в Р3 GATE NU P3,Met9 ; Свободен ли телефон с данным номером? Если да, SEIZE P3 ; то звонят с него ASSIGN 7,(RN343/1000) ; Обращение к генератору RN TEST LE P7,(N3_/(N2_+N3_)),Met2 ; Если условие выполнено, то нужен внешний выход ; Поиск свободного внешнего выхода ASSIGN 4,(N1_+N2_) ; Подготовка к циклу Met3 ASSIGN 4+,1 ; Начало цикла определения номера свободного внешнего выхода GATE U P4,Met4 ; Свободен ли внешний выход? TEST GE P4,(N1_+N2_+N3_),Met3 ; Все ли внешние выходы проверены и не найдено свободного? ADVANCE Tog1,Tog01 ; Если да, то задержаться и ; Поиск внешнего выхода, занятого ТА2 ASSIGN 4,(N1_+N2_) ; подготовка к циклу Met21 ASSIGN 4+,1 ; Начало цикла определения номера внешнего выхода, занятого ТА2 TEST E X*4,1,Met22 ; Равно ли значение сохраняемой ячейки 1? Если нет, то перейти к прерыванию разговора TEST GE P4,(N1_+N2_+N3_),Met21 ; Все ли сохраняемые ячейки проверены? Не найдено ни одной, значение которой равно 0? Если да, то TRANSFER ,Met23 ; все внешние выходы заняты звонками с ТА1 ; Прерывание разговора с ТА2 Met22 PREEMPT P4,PR,Met24,,RE ; Прервать разговор с ТА2 по внешнему выходу без права продолжения SAVEVALUE *4,PR ; Сохранить PR в ячейке с номером в Р4 ADVANCE (Exponential(222,0,Trazg1)) ; Имитация разговора с ТА1 по внешнему выходу RETURN P4 ; Освободить внешний выход с номером в Р4 RELEASE P3 ; Освободить ТА1 с номером в Р3 Ter1 TERMINATE ; Состоявшиеся разговоры с ТА1 по внешним выходам с прерыванием разговоров с ТА2 Met23 RELEASE P3 ; Освободить ТА1, разговор с которого по внешнему выходу не состоялся TERMINATE ; Несостоявшиеся разговоры с ТА1 по внешним выходам из-за занятости их ТА1 ; Имитация ведения разговоров с ТА1 без прерывания Met4 SEIZE P4 ; Занять свободный внешний выход с номером в Р4 SAVEVALUE P4,PR ; Занести в ячейку с номером в Р4 уровень приоритета ADVANCE (Exponential(222,0,Trazg1)) ; Имитация разговора с ТА1 RELEASE P4 ; Освободить внешний выход с номером в Р4 RELEASE P3 ; освободить ТА1 с номером в Р3 Ter2 TERMINATE ; Состоявшиеся разговоры с ТА1 по внешним выходам ; Определение номера ТА2, на который звонят с ТА1 Met2 ASSIGN 7,(RN343/1000) ; Обращение к генератору RN ASSIGN 6,0 ; Подготовка к циклу Met5 ASSIGN 6+,1 ; Начало цикла определения номера ТА2, на который звонят с ТА1 TEST LE P7,(P6#(1/N2_)),Met5 ; Если условие выполнено, то номер ТА2 запомнить в Р6 GATE NU (N1_+P6),Met7 ; Свободен ли телефон с данным номером? Если да, ASSIGN 7,(RN343/1000) ; то ответит ли он? TEST LE P7,P5_,Met6 ; Если условие выполнено, то не ответит. Тогда Met7 ADVANCE Tog2,Tog02 ; задержаться и RELEASE P3 ; освободить ТА1 с номером в Р3 Ter3 TERMINATE ; Несостоявшиеся разговоры между абонентами ТА1 и ТА2 ; Имитация разговоров абонентов ТА1 и ТА2 Met6 SEIZE (N1_+P6) ; Занять ТА2 с номером в (N1_+Р6) ADVANCE (Exponential(222,0,Trazg1)) ; Имитация разговора между абонентами ТА1 и ТА2 RELEASE (N1_+P6) ; Освободить ТА2 с номером в (N1_+Р6) RELEASE P3 ; Освободить ТА1 с номером в Р3 Ter4 TERMINATE ; Состоявшиеся разговоры между абонентами ТА1 и ТА2 Met9 TERMINATE ; ТА1 уже был занят, поэтому разговор не состоялся Met24 RELEASE (N1_+P3) ; Прерванные разговоры с ТА2 TERMINATE ; Сегмент имитации телефонных разговоров с ТА2 GENERATE (Exponential(493,0,(T2_/N2_))) ; Определение номера звонящего ТА1 Met10 ASSIGN 7,(RN413/1000) ; Обращение к генератору RN ASSIGN 3,0 ; Подготовка к циклу Met11 ASSIGN 3+,1 ; Начало цикла определения номера звонящего ТА2 TEST LE P7,(P3#(1/N2_)),Met11 ; Если условие выполнено, то номер ТА2 запомнить в Р3 GATE NU (N1_+P3),Met19 ; Свободен ли телефон с данным номером? Если да, SEIZE (N1_+P3) ; то звонят с него ; Поиск свободного внешнего выхода ASSIGN 7,(RN343/1000) ; Обращение к генератору RN TEST LE P7,(N3_/(N1_+N3_)),Met12 ; Если условие выполнено, то нужен внешний выход ASSIGN 4,(N1_+N2_) ; Подготовка к циклу Met13 ASSIGN 4+,1 ; Начало цикла определения номера свободного внешнего выхода GATE U P4,Met14 ; Свободен ли внешний выход? TEST GE P4,(N1_+N2_+N3_),Met13 ; Все ли внешние выходы проверены и не найдено свободного выхода? ADVANCE Tog3,Tog03 ; Если да, то задержаться и RELEASE (N1_+P3) ; Освободить телефон с номером (N1_+P3) Ter5 TERMINATE ; Несостоявшиеся разговоры с ТА2 из-за занятости внешних выходов Met14 SEIZE P4 ; Занять свободный внешний выход SAVEVALUE P4,PR ; Запомнить приоритет абонента, ведущего разговор ADVANCE (Exponential(222,0,Trazg2)) ; Имитация разговора между абонентами ТА2 по внешним выходам RELEASE P4 ; Освободить внешний выход RELEASE (N1_+P3) ; Освободить ТА2 Ter6 TERMINATE ; Состоявшиеся разговоры с ТА2 по внешним выходам ; Определение номера ТА1, на который звонят с ТА2 Met12 ASSIGN 7,(RN343/1000) ; Обращение к генератору RN ASSIGN 6,0 ; Подготовка к циклу Met15 ASSIGN 6+,1 ; Начало цикла определения номера ТА1, на который звонят с ТА2 TEST LE P7,(P6#(1/N1_)),Met15 ; Если условие выполнено, то номер ТА1 запомнить в Р6 GATE NU P6,Met17 ; Свободен ли телефон с данным номером? Если да, ASSIGN 7,(RN343/1000) ; то ответит ли он? TEST LE P7,P10_,Met16 ; Если условие выполнено, то не ответит. Тогда Met17 ADVANCE (Normal(211,Tog2,Tog02)) ; задержаться и RELEASE (N1_+P3) ; освободить телефон с номером N1_+P3 Ter7 TERMINATE ; Несостоявшиеся разговоры с ТА2 из-за занятости ТА1 ; Имитация разговоров абонентов ТА2 и ТА1 Met16 SEIZE P6 ; Занять ТА1 с номером в Р6 ADVANCE (Exponential(222,0,Trazg2)) ; Имитация разговора между абонентами ТА2 и ТА1 RELEASE P6 ; Освободить ТА1 с номером в Р6 RELEASE (N1_+P3) ; Освободить ТА2 с номером N1_+P3 Ter8 TERMINATE ; Состоявшиеся разговоры между абонентами ТА2 и ТА1 Met19 TERMINATE ; Сегмент задания времени моделирования и расчета результатов моделирования GENERATE VrMod ; Задание времени моделирования TEST E TG1,1,Met20 ; Если содержимое счетчика завершений равно 1, то рассчитать SAVEVALUE Ver1,((N$Ter2+N$Ter4)/N$Met0) ; Вероятность ведения разговоров с ТА1 SAVEVALUE Ver2,((N$Ter6+N$Ter8)/N$Met10) ; Вероятность ведения разговоров с ТА2 Met20 TERMINATE 1 ; Фиксация очередного прогона
Приведем результаты моделирования, полученные после 1000 прогонов.
SAVEVALUE RETRY VALUE VER1 0 0.614 VER2 0 0.396
Вероятность ведения разговоров с ТА2 Ver2 = 0,396 меньше, чем Ver1 = 0,614. Одним из факторов, влияющим на это, является вероятность P10_ = 0,7 того, что абонент ТА1 на звонок абонента ТА2 не ответит.
Оставим без изменений все исходные данные, установим лишь равную вероятность не ответа на звонки абонентами обеих категорий P10_ = P5_ = 0,3.
По окончании моделирования получим:
SAVEVALUE RETRY VALUE VER1 0 0.584 VER2 0 0.625
В условиях рыночных отношений производственная и финансовая деятельность организаций сложна и динамична, что требует применения динамических моделей практически во всех вариантах методик проведения
Накопление опыта в области компьютерного моделирования позволило выделить четыре группы бизнес процессов, обладающих спецификой в отношении построения динамических моделей: процессы реализации проектов, процессы производства, процессы распределения и процессы предоставления услуг.
Процессы предоставления услуг - наиболее распространенная область применения динамических моделей. Такие процессы характерны для организаций, предоставляющих услуги по средствам связи, сервис-центров (рестораны, агентства, поликлиники, ремонтные мастерские и т. п.) и предприятий торговли.
Рассмотрим разработку и реализацию подобных моделей в системе моделирования
На дежурстве находятся n1 средств связи (СС) n2 типов (n21 + n22 + … + n2n2 = n2) в течение n3 часов.
Каждое СС может в любой момент времени выйти из строя. В этом случае его заменяют резервным, причем либо сразу, либо по мере его появления. Тем временем, вышедшие из строя СС ремонтируют, после чего содержат в качестве резервного. Всего количество резервных СС - n4.
Ремонт неисправных СС производят n5 мастеров. Время T1, T2, …, Tn2 ремонта случайное и зависит от типа СС, но не зависит от того, какой мастер это СС ремонтирует. Интервалы времени T21, T22, …, T2n2 между отказами находящихся на дежурстве СС случайные.
Прибыль от СС, находящихся на дежурстве, составляет S1 денежных единиц в час. Почасовой убыток при отсутствии на дежурстве одного СС - S2 денежных единиц. Оплата мастера за ремонт неисправного СС - S31, S32, …, S3n2 денежных единиц в час. Затраты на содержание одного резервного СС составляют S4 денежных единиц в час.
25 суток ( 1000 часов ).Исследовать через промежутки времени $$\Delta T = 5*40=200$$ (пять недель) влияние на ожидаемую прибыль различного количества резервных СС и мастеров.
Определить абсолютные величины и относительные коэффициенты ожидаемой прибыли для каждого промежутка времени. Результаты моделирования (относительный коэффициент прибыли) необходимо получить с точностью $$\varepsilon = 0,01$$ и
Сделать выводы об использовании СС, мастеров по промежуткам времени $$\Delta T$$ и необходимых мерах по совершенст вованию бизнес-процесса.
Вариант исходных данных приведен в программе модели (п. 6.6.3).
Уясним задачу на разработку имитационной модели, предварительно разработав структуру системы предоставления услуг связи (рис. 6.5).
Видно, что система предоставления услуг связи представляет собой многофазную многоканальную систему массового обслуживания замкнутого типа.
(рис 6.5) Структура системы предоставления услуг связиКакие ограничения в системе?
Для моделирования двух первых ограничений используем МКУ, а для третьего и четвертого ограничений - транзакты.
Модель бизнес-процесса должна состоять из следующих сегментов:
Сегмент переопределения блоков модели необходим для изменения версий модели, т. е. изменения количества резервных СС и мастеров-ремонтников в ремонтном подразделении, а также номеров строк и столбцов матриц, в которые записываются результаты моделирования.
Предполагается, что количество типов СС в системе предоставления услуг связи может изменяться от одного до максимального значения n1_. Программа модели построена для n1_ =5.
Для хранения результатов моделирования используются матрицы. В целях придания неизменности программы модели при варьировании количеством типов СС матрицы должны быть пронумерованы. Однако MATRIX не позволяет вместо имени указывать число. Матрицы нужно вначале описать, дав им имена, а затем пронумеровать.
Результаты моделирования для одного типа СС хранятся в трех матрицах, например, для СС типа 1 ( СС1 ) с идентификаторами:
Prib1 - матрица ожидаемой прибыли СС1 ;KPr1 - матрица коэффициентов прибыли СС1 ;KZen1 - матрица коэффициентов использования СС1.Значит, аналогичных матриц будет пятнадцать. Да плюс еще матрица KRem коэффициентов использования мастеров - ремонтников. Именам этим шестнадцати матрицам даны номера.
Три матрицы для хранения суммарных результатов моделирования для СС всех типов не нумеровались:
Pribil - матрица суммарной прибыли;SrKPrib - матрица средних коэффициентов прибыли СС всех типов;SrKIsp - матрица коэффициентов использования СС всех типов.Именам пяти МКУ СС1_, СС2_, СС3_, СС4_ и СС5_, имитирующим по типам СС, находящиеся на дежурстве, даны номера 1 … 5. Это позволяет сократить число блоков в модели за счет того, что вместо пяти (в данном варианте модели) сегментов имитации постановки на дежурство СС используется один сегмент.
Для записи исходных данных (количества СС всех типов (в том числе и резервных), среднего времени наработки до отказа и среднего времени восстановления по типам СС, дохода по типам от одного СС, находящегося на дежурстве, убытка по типам при отсутствии одного СС на дежурстве, стоимости по типам одного резервного СС) используются функции KolSS, KollSSRes, NarOtk, SrVrRem, S1_, S2_, S3_ соответственно. По сравнению с использованием матриц для записи этих же данных программа модели сокращается на двадцать пять строк.
В начале работы модели генератор сразу вырабатывает количество транзактов, равное соответствующему количеству типов СС, и перестает быть активным.
Далее блоками SAVEVALUE и ASSIGN в параметр 1 каждого из транзактов последовательно заносятся коды 1 … n1_ - СС.
Затем каждый из транзактов с помощью блока SPLIT расщепляется (копируется, размножается) по количеству СС (с учетом резервных) соответствующего типа. После расщепления транзакты в соответствии с типом СС сразу занимают все каналы МКУ, имитирующие нахождение СС на дежурстве.
Вышедшее из строя СС снимается с дежурства, поступает в ремонтное подразделение - транзакт либо занимает свободный канал МКУ Rem, если такой есть, либо при отсутствии свободного канала помещается в список задержки этого МКУ - список тран-зактов, ожидающих возможность занять освободившиеся каналы МКУ.
После ремонта СС отправляется либо сразу на дежурство, либо в резерв. В обоих случаях транзакт направляется на метку Met1. Здесь также транзакт либо занимает свободный канал, либо помещается в список задержки МКУ, соответствующего типу СС.
Ниже приводится программа только (в целях сокращения) для моделирования случая три мастера-ремонтника, а резервных СС2 - четыре, пять и шесть. Количество типов СС - n1_ = 4.
; Модель бизнес-процесса ; Задание номеров матрицам Prib1 EQU 1 ; Матрица ожидаемой прибыли СС1 KPr1 EQU 2 ; Матрица коэффициентов прибыли СС1 KZen1 EQU 3 ; Матрица коэффициентов использования СС1 Prib2 EQU 4 ; Матрица ожидаемой прибыли СС2 KPr2 EQU 5 ; Матрица коэффициентов прибыли СС2 KZen2 EQU 6 ; Матрица коэффициентов использования СС2 Prib3 EQU 7 ; Матрица ожидаемой прибыли СС3 KPr3 EQU 8 ; Матрица коэффициентов прибыли СС3 KZen3 EQU 9 ; Матрица коэффициентов использования СС3 Prib4 EQU 10 ; Матрица ожидаемой прибыли СС4 KPr4 EQU 11 ; Матрица коэффициентов прибыли СС4 KZen4 EQU 12 ; Матрица коэффициентов использования СС4 Prib5 EQU 13 ; Матрица ожидаемой прибыли СС5 KPr5 EQU 14 ; Матрица коэффициентов прибыли СС5 KZen5 EQU 15 ; Матрица коэффициентов использования СС5 KRem EQU 16 ; Матрица коэффициентов использования Rem ; Задание номеров МКУ, имитирующих дежурство СС CC1_ EQU 1 ; Задание номера МКУ СС1 CC2_ EQU 2 ; Задание номера МКУ СС2 CC3_ EQU 3 ; Задание номера МКУ СС3 CC4_ EQU 4 ; Задание номера МКУ СС4 CC5_ EQU 5 ; Задание номера МКУ СС5 ; Задание матриц Prib1 MATRIX ,3,5 ; Матрица ожидаемой прибыли СС1 KPr1 MATRIX ,3,5 ; Матрица коэффициентов прибыли СС1 KZen1 MATRIX ,3,5 ; Матрица коэффициентов загрузки СС1 Prib2 MATRIX ,3,5 ; Матрица ожидаемой прибыли СС2 KPr2 MATRIX ,3,5 ; Матрица коэффициентов прибыли СС2 KZen2 MATRIX ,3,5 ; Матрица коэффициентов загрузки СС2 Prib3 MATRIX ,3,5 ; Матрица ожидаемой прибыли СС3 KPr3 MATRIX ,3,5 ; Матрица коэффициентов прибыли СС3 KZen3 MATRIX ,3,5 ; Матрица коэффициентов загрузки СС3 Prib4 MATRIX ,3,5 ; Матрица ожидаемой прибыли СС4 KPr4 MATRIX ,3,5 ; Матрица коэффициентов прибыли СС4 KZen4 MATRIX ,3,5 ; Матрица коэффициентов загрузки СС4 Prib5 MATRIX ,3,5 ; Матрица ожидаемой прибыли СС5 KPr5 MATRIX ,3,5 ; Матрица коэффициентов прибыли СС5 KZen5 MATRIX ,3,5 ; Матрица коэффициентов загрузки СС5 KRem MATRIX ,3,5 ; Матрица коэффициентов загрузки Rem Pribil MATRIX ,3,5 ; Матрица суммарной прибыли SrKPrib MATRIX ,3,5 ; Матрица коэффициентов прибыли СС всех типов SrKIsp MATRIX ,3,5 ; Матрица коэффициентов загрузки СС всех типов KolSS MATRIX ,2,5 ; Матрица количества СС всех типов NarOtk MATRIX ,1,5 ; Матрица среднего времени наработки до отказа по типам СС, час SrVrRem MATRIX ,1,5 ; Матрица среднего ремонта по типам СС, час ; Определение МКУ по числу СС, находящихся на дежурстве CC1_ STORAGE 35 ; Емкость МКУ по количеству СС1 CC2_ STORAGE 100 ; Емкость МКУ по количеству СС2 CC3_ STORAGE 60 ; Емкость МКУ по количеству СС3 CC4_ STORAGE 45 ; Емкость МКУ по количеству СС4 CC5_ STORAGE 60 ; Емкость МКУ по количеству СС5 Rem STORAGE 3 ; Емкость МКУ по числу мастеров-ремонтников ; Исходные данные VrMod EQU 200 ; Время моделирования, 1 ед. мод. вр. = 1 час Stroka EQU 1 ; Номер строки матрицы Stolbez EQU 1 ; Номер столбца матрицы n1_ EQU 5 ; Количество типов СС StoMast FUNCTION P1,D5 ; Стоимость работы одного мастера 1,17/2,18/3,16/4,20/5,21 KolSS FUNCTION P1,D5 ; Количество по типам СС, находящихся на дежурстве 1,55/2,100/3,60/4,45/5,60 KolSSRes FUNCTION P1,D5 ; Количество по типам резервных СС 1,2/2,4/3,4/4,3/5,4 NarOtk FUNCTION P1,D5 ; Среднее время наработки до отказа по типам СС, час 1,373/2,301/3,482/4,325/5,470 SrVrRem FUNCTION P1,D5 ; Среднее время ремонта по типам СС 1,6.5/2,4.2/3,2.8/4,3/5, 5.5 S1_ FUNCTION P1,D5 ; Доход по типам от одного СС, находящегося на дежурстве 1,20/2,24.2/3,32.8/4,23/5, 25.5 S2_ FUNCTION P1,D5 ; Убыток по типам при отсутствии одного СС на дежурстве 1,32/2,34.2/3,37/4,31/5,32.5 S3_ FUNCTION P1,D5 ; Стоимость по типам содержания одного резервного СС 1,21/2,24.2/3,28/4,26/5, 25.5 ; Арифметические выражения для расчета показателей DoxMax VARIABLE VrMod#FN$S1_#FN$KolSS ; Максимальный доход от дежурства СС Ubitok VARIABLE VrMod#FN$KolSS#(1-SR*1/1000)#FN$S2_ ; Убыток от отсутствия на дежурстве СС DoxPol VARIABLE X$DoxMax-X$Ubitok ; Полученный доход от дежурства СС StoRem VARIABLE (VrMod#SM$Rem#FN$StoMast)#(SR$Rem/1000) ; Стоимость ремонта неисправных СС ZatrResSS VARIABLE FN$S3_#FN$KolSSRes#VrMod ; Затраты на содержание резервных СС SumPrib VARIABLE X$DoxPol-(X$StoRem+X$ZatrResSS) ; Прибыль KoefPr VARIABLE MX*3(Stroka,Stolbez)/X$DoxMax ; Коэффициент прибыли ; Сегмент имитации постановки на дежурство СС GENERATE ,,,n1_ SAVEVALUE TipSS+,1 ; Код 1 ... n2_ - признак СС1 ... CCn1 в X$TipSS ASSIGN 1,X$TipSS ; Код 1 ... n2_ - признак СС1 ...CCn2_ в P1 SPLIT (FN$KolSS+FN$KolSSRes-1) ; Число СС + резервные СС ; Сегмент имитации дежурства СС Met1 ENTER P1 ; Встать на дежурство СС типа с номером в Р1 ADVANCE (Exponential(30,0,FN$NarOtk)) ; Имитация выхода из строя СС LEAVE P1 ; Снятие с дежурства из-за выхода из строя СС типа, номер которого в Р1 ; Сегмент имитации работы ремонтного подразделения ENTER Rem ; Занять одного мастера ADVANCE (Exponential(31,0,FN$SrVrRem)) ; Имитация ремонта LEAVE Rem ; Конец ремонта TRANSFER ,Met1 ; Направить исправное СС на дежурство или в резерв ; Сегмент задания времени моделирования и расчета результатов GENERATE VrMod TEST E TG1,1,Met2 Met23 ASSIGN 1+,1 ; Начало цикла изменения типов СС SAVEVALUE DoxMax,V$DoxMax ; Максимально возможный доход от дежурства СС SAVEVALUE Ubitok,V$Ubitok ; Убыток SAVEVALUE DoxPol,V$DoxPol ; Полученный доход от дежурства СС SAVEVALUE StoRem,V$StoRem ; Затраты на ремонт SAVEVALUE ZatrResSS,V$ZatrResSS ; Затраты на резервные СС SAVEVALUE SumPrib,V$SumPrib ; Суммарная прибыль ASSIGN 2,(P1#3) ASSIGN 3,(P2-2) MSAVEVALUE *3,Stroka,Stolbez,X$SumPrib ; Прибыль по типу СС MSAVEVALUE Pribil+,Stroka,Stolbez,X$SumPrib ; Суммарная прибыль по СС всех типов ASSIGN 4,V$KoefPr ; Коэфициент прибыли по типам СС в Р4 ASSIGN 3,(P2-1) MSAVEVALUE *3,Stroka,Stolbez,P4 ; Коэфициент прибыли по типам СС MSAVEVALUE SrKPrib+,Stroka,Stolbez,(P4/n1_) ; Средний коэффициент прибыли по СС всех типов MSAVEVALUE *2,Stroka,Stolbez,(SR*1/1000) ; Коэффициент использования CC MSAVEVALUE SrKIsp+,Stroka,Stolbez,(SR*1/(1000#n1_)) ; Средний коэффициент использования CC всех типов TEST GE P1,n1_,Met23 MSAVEVALUE 16,Stroka,Stolbez,(SR$Rem/1000); Коэффициент использования Rem SAVEVALUE TipSS,0 Met2 TERMINATE 1 START 1000,NP ; Недели 1-5: Резервных СС2=4, мастеров=3 ; Сегмент переопределения блоков - изменения версий модели Stolbez EQU 2 RESET START 1000,NP ; Недели 6-10: Резервных СС2=4, масте-ров=3 Stolbez EQU 3 RESET START 1000,NP ; Недели 11-15: Резервных СС2=4, мас-теров=3 Stolbez EQU 4 RESET START 1000,NP ; Недели 16-20: Резервных СС2=4, мас-теров=3 Stolbez EQU 5 RESET START 1000,NP ; Недели 21-25: Резервных СС2=4, мас-теров=3 KolSSRes FUNCTION P1,D5 ; Количество резервных СС2 1,2/2,5/3,4/4,4/5,4 Stroka EQU 2 Stolbez EQU 1 RESET START 1000,NP ; Недели 1-5: Резервных СС2=5, мастеров=3 Stolbez EQU 2 RESET START 1000,NP ; Недели 6-10: Резервных СС2=5, мастеров=3 Stolbez EQU 3 RESET START 1000,NP ; Недели 11-15: Резервных СС2=5, мастеров=3 Stolbez EQU 4 RESET START 1000,NP ; Недели 16-20: Резервных СС2=5, мастеров=3 Stolbez EQU 5 RESET START 1000,NP ; Недели 21-25: Резервных СС2=5, мастеров=3 KolSSRes FUNCTION P1,D5 ; Количество резервных СС2 1,2/2,6/3,4/4,5/5,4 Stroka EQU 3 Stolbez EQU 1 RESET START 1000,NP ; Недели 1-5: Резервных СС2=6, мастеров=3 Stolbez EQU 2 RESET START 1000,NP ; Недели 6-10: Резервных СС2=6, мастеров=3 Stolbez EQU 3 RESET START 1000,NP ; Недели 11-15: Резервных СС2=6, мастеров=3 Stolbez EQU 4 RESET START 1000,NP ; Недели 16-20: Резервных СС2=6, мастеров=3 Stolbez EQU 5 RESET START 1000 ; Недели 21-25: Резервных СС2=6, мастеров=3
В программе, кроме методов применения матриц и функций, показывается метод изменения версий модели. Изменение версий модели производится переопределением соответствующих блоков. Переопределяться не могут блоки GENERATE. Для переопределения блоков, описывающих ОКУ и МКУ, они должны иметь метки. Однако одного переопределения блоков недостаточно. В RESET и CLEAR.
В рассматриваемом примере в процессе моделирования необходимо собирать статистику по отрезкам времени \Delta T. То есть предшествующую статистику нужно сбросить, но оставить неизменными условия функционирования системы.
Сброс в ноль статистики без удаления транзактов из процесса моделирования осуществляет команда RESET. Команда RESET не имеет операндов:
RESET
Команда также не сбрасывает генераторы случайных чисел, ячейки и матрицы ячеек, не влияет на абсолютное модельное время и нумерацию транзактов. Относительное модельное время (после последней команды RESET ) устанавливается равным нулю. Таким образом, с помощью команды RESET обеспечивается удобное средство сбора статистических данных в типичных условиях функционирования систем.
После того как для данной версии модели выполнено моделирование в течение заданного числа отрезков времени \Delta T (в примере - пять), нужно изменить версию модели и провести моделирование сначала.
Изменение версии в данной модели производится переопределением функции KolSSRes, т. е. изменением количества резервных СС2, например:
KolSSRes FUNCTION P1,D5 ; Количество резервных СС2 1,2/2,5/3,4/4,4/5,4
Процесс моделирования в исходное состояние возвращает команда CLEAR. Формат записи команды:
CLEAR [A]
Операнд А может быть ON либо OFF. По умолчанию - ON.
Команда CLEAR сбрасывает всю накопленные статистические данные, удаляет все транзакты из процесса моделирования и заполняет все блоки GENERATE первым транзактом. ОКУ и МКУ становятся доступными, устанавливаются в незанятое состояние. Содержимое всех блоков становится нулевым. Генераторы случайных чисел не сбрасываются.
Если в команде CLEAR операнд А равен OFF, то сохраняемые ячейки, матрицы и логические ключи остаются без изменений. Поэтому в модели в команде CLEAR используется операнд А, равный OFF, так как нужно сохранить результаты моделирования для предыдущей версии модели.
Однако при этом нужно иметь в виду те ячейки, начальные значения которых должны быть нулевыми в новой версии модели. Необходимо предусмотреть в программе блоки приведения таких ячеек в исходное состояние. В данной модели это показано на примере сохраняемой ячейки TipSS. Если эту ячейку не привести в нулевое состояние, процесс моделирования второй версии будет остановлен по ошибке "Обращение к несуществующей памяти".
Поскольку накопленные и сохраненные в матрицах результаты моделирования нет необходимости выводить на каждом отрезке \Delta T, то в команде START используется операнд B, равный ON. В последней команде START операнд B не используется. Поэтому стандартный отчет выдается после завершения моделирования. В рассматриваемом примере - после пятнадцати наблюдений.
Ниже показан фрагмент журнала с информацией о ходе моделирования. В первых пяти наблюдениях (первой версии модели) команда RESET не влияет на абсолютное модельное время, которое растет от 0 до 1 000 000 единиц модельного времени.
После переопределения (формирования второй версии модели) выполняется команда CLEAR и абсолютное модельное время вновь изменяется от 0 до 1 000 000 единиц модельного времени.
06/05/08 17:29:10 Model Translation Begun. 06/05/08 17:29:10 Ready. 06/05/08 17:29:10 Simulation in Progress. 06/05/08 17:29:15 The Simulation has ended. Clock is 200000.000000. 06/05/08 17:29:15 Simulation in Progress. 06/05/08 17:29:19 The Simulation has ended. Clock is 400000.000000. 06/05/08 17:29:19 Simulation in Progress. 06/05/08 17:29:24 The Simulation has ended. Clock is 600000.000000. 06/05/08 17:29:24 Simulation in Progress. 06/05/08 17:29:28 The Simulation has ended. Clock is 800000.000000. 06/05/08 17:29:28 Simulation in Progress. 06/05/08 17:29:32 The Simulation has ended. Clock is 1000000.000000. 06/05/08 17:29:33 Simulation in Progress. 06/05/08 17:29:37 The Simulation has ended. Clock is 200000.000000. 06/05/08 17:29:37 Simulation in Progress. 06/05/08 17:29:41 The Simulation has ended. Clock is 400000.000000. 06/05/08 17:29:41 Simulation in Progress. … 06/05/08 17:30:17 Reporting in Rem_SS_2.59.1 - REPORT Window.
Для включения в формируемый стандартный отчет матриц необходимо при открытом объекте "Модель" выполнить команду:
Edit/Settings/Reports/Matrices/Применить/Ok
Результаты моделирования после 1000 прогонов приведены ниже. Но опять же в целях сокращения - для СС1 и СС всех типов.
| MATRIX | RETRY | INDICES | VALUE |
|---|---|---|---|
| PRIB1 | 0 | ||
| 1 1 | 181586.183 | ||
| 1 2 | 181251.160 | ||
| 1 3 | 179584.944 | ||
| 1 4 | 181774.706 | ||
| 1 5 | 182291.154 | ||
| 2 1 | 180844.964 | ||
| 2 2 | 181435.896 | ||
| 2 3 | 181478.223 | ||
| 2 4 | 179347.815 | ||
| 2 5 | 179178.486 | ||
| 3 1 | 178683.512 | ||
| 3 2 | 178136.334 | ||
| 3 3 | 179139.261 | ||
| 3 4 | 181934.517 | ||
| 3 5 | 179655.938 | ||
| KPR1 | 0 | ||
| 1 1 | .825 | ||
| 1 2 | .823 | ||
| 1 3 | .816 | ||
| 1 4 | .826 | ||
| 1 5 | .828 | ||
| 2 1 | .822 | ||
| 2 2 | .824 | ||
| 2 3 | .824 | ||
| 2 4 | .815 | ||
| 2 5 | .814 | ||
| 3 1 | .812 | ||
| 3 2 | .809 | ||
| 3 3 | .814 | ||
| 3 4 | .826 | ||
| 3 5 | .816 | ||
| KZEN1 | 0 | ||
| 1 1 | .943 | ||
| 1 2 | .942 | ||
| 1 3 | .937 | ||
| 1 4 | .943 | ||
| 1 5 | .945 | ||
| 2 1 | .941 | ||
| 2 2 | .942 | ||
| 2 3 | .942 | ||
| 2 4 | .936 | ||
| 2 5 | .936 | ||
| 3 1 | .935 | ||
| 3 2 | .933 | ||
| 3 3 | .936 | ||
| 3 4 | .944 | ||
| 3 5 | .937 | ||
| 3 5 | .601 | ||
| KREM | 0 | ||
| 1 1 | .981 | ||
| 1 2 | .982 | ||
| 1 3 | .984 | ||
| 1 4 | .978 | ||
| 1 5 | .981 | ||
| 2 1 | .983 | ||
| 2 2 | .982 | ||
| 2 3 | .982 | ||
| 2 4 | .984 | ||
| 2 5 | .982 | ||
| 3 1 | .985 | ||
| 3 2 | .984 | ||
| 3 3 | .984 | ||
| 3 4 | .979 | ||
| 3 5 | .982 | ||
| PRIBIL | 0 | ||
| 1 1 | 1111897.023 | ||
| 1 2 | 1110398.484 | ||
| 1 3 | 1102062.813 | ||
| 1 4 | 1113459.610 | ||
| 1 5 | 1114232.258 | ||
| 2 1 | 1105731.875 | ||
| 2 2 | 1107881.589 | ||
| 2 3 | 1111610.502 | ||
| 2 4 | 1098478.153 | ||
| 2 5 | 1097605.578 | ||
| 3 1 | 1094679.743 | ||
| 3 2 | 1091129.285 | ||
| 3 3 | 1096084.094 | ||
| 3 4 | 1107311.254 | ||
| 3 5 | 1097609.762 | ||
| SRKPRIB | 0 | ||
| 1 1 | .844 | ||
| 1 2 | .843 | ||
| 1 3 | .837 | ||
| 1 4 | .846 | ||
| 1 5 | .846 | ||
| 2 1 | .839 | ||
| 2 2 | .840 | ||
| 2 3 | .843 | ||
| 2 4 | .833 | ||
| 2 5 | .832 | ||
| 3 1 | .829 | ||
| 3 2 | .826 | ||
| 3 3 | .830 | ||
| 3 4 | .839 | ||
| 3 5 | .831 | ||
| SRKISP | 0 | ||
| 1 1 | .954 | ||
| 1 2 | .953 | ||
| 1 3 | .948 | ||
| 1 4 | .954 | ||
| 1 5 | .955 | ||
| 2 1 | .956 | ||
| 2 2 | .957 | ||
| 2 3 | .959 | ||
| 2 4 | .952 | ||
| 2 5 | .951 | ||
| 3 1 | .955 | ||
| 3 2 | .953 | ||
| 3 3 | .956 | ||
| 3 4 | .962 | ||
| 3 5 | .957 |
На вычислительный комплекс коммутации сообщений (ВККС) поступают сообщения от $$n_{1}$$ абонентов с интервалами времени $$T_{1}, T_{2}, ...,T_{n1}$$. Сообщения могут быть $$n_{2} $$ категорий с вероятностями $$p_{1}, p_{2}, ..., p_{n2} (p_{1} + p_{2} + p_{n2} = 1$$ ) и вычислительными сложностями их обработки $$S_{1}, S_{2}, ..., S_{n2}$$ операций (оп) соответственно. Вычислительные сложности случайные. ВККС имеет входной накопитель емкостью $$L_{1} $$ байт для хранения сообщений, ожидающих передачи. Сообщения 1-й категории обладают относительным приоритетом по отношению к сообщениям остальных категорий при обработке на ВККС. В буфере сообщения размещаются в соответствии с приоритетом.
ВККС обрабатывает сообщения с производительностью $$Q $$ оп/с. После обработки сообщения передаются по $$n_{3}$$ каналам связи. Скорость передачи $$V_{п}$$ бит/с. Сообщения 1-й категории обладают абсолютным приоритетом по отношению к сообщениям других категорий. Поэтому если после обработки сообщения все $$n_{3}$$ каналов связи заняты передачей сообщений 1-й категории, обработанное сообщение помещается в накопитель каналов связи, если в нем есть место, иначе - теряется. Если же по какому-либо каналу передается сообщение другой категории, происходит прерывание передачи этого сообщения и передается сообщение 1-й категории. Емкость накопителя каналов связи ограничена $$L_{2}$$ сообщениями.
ВККС и каналы связи имеют конечную надежность. Интервалы времени $$T_{от1}$$ и $$T_{от2}$$ между отказами ВККС и каналов связи случайные. Длительности восстановления $$T_{в1}$$ и $$T_{в2}$$ ВККС и каналов связи случайные. При отказе канала связи передаваемые сообщения 1-й категории сохраняются в накопителе каналов, если в нем есть место. При выходе из строя ВККС с вероятностью $$p_{c}$$ все сообщения в накопителе ВККС и накопителе каналов связи сохраняются, обрабатываемое сообщение теряется, а прием ВККС и передача сообщений по каналам связи прекращается. Все поступающие в это время сообщения теряются.
Разработать имитационную модель функционирования ВККС. Исследовать влияние емкостей входных накопителей, интервалов времени $$T _{1},T_{2},...,T_{6} $$ и вероятностей $$p _{1}$$ и $$p_{2} $$ на вероятности передачи сообщений по категориям и в целом через ВККС в течение двух часов. Провести дисперсионный и регрессионный анализы. Сделать выводы о загруженности элементов ВККС и необходимых мерах по повышению эффективности его функционирования.
Результаты моделирования необходимо получить с точностью $$\varepsilon = 0,01$$ и
Представим систему, имитационную модель которой предстоит разработать, схемой (рис. 6.6).
Видно, что ВККС - это многофазная
В структуре системы выделен блок контроля состояний ВККС, каналов связи ( GATE ) и их накопителей ( TEST ).
В модели сообщения следует представить транзактами, ВККС и каналы связи - одноканальными устройствами. Так как количество каналов связи может быть любым, то целесообразно идентифицировать их не именами, а номерами. Тогда в ходе моделирования для указания номеров этих устройств нужно будет использовать параметр транзакта, например, номер четыре, предварительно записав в него номер устройства.
Для имитации накопителей будет использоваться список пользователя, т. е. блоки LINK и UNLINK. Но так как емкость накопителя ВККС определяется в байтах, а список пользователя не позволяет вести в них учет, следует ввести сохраняемую ячейку и в ней вести учет текущей емкости накопителя. Также примем, что объем накопителя, занимаемый сообщением, равен его вычислительной сложности.
Для моделирования неисправностей ВККС и каналов связи нужно использовать блоки FUNAVAIL и F AVAIL. В этом случае статистика ОКУ не будет искажена, как это могло быть при использовании блоков PREEMPT и RETURN.
(рис 6.6) ВККС как система массового обслуживания
Программа модели согласно декомпозиции ВККС (рис. 6.6) должна иметь:
Программа модели функционирования ВККС приведена ниже.
; Модель функционирования ВККС ; Задание исходных данных VrMod EQU 7200 ; Время моделирования, 1 ед. мод. вр. = 1с NCan EQU 3 ; Число каналов n1_ EQU 6 ; Количество источников сообщений MaxKat EQU 3 ; Максимальное число категорий сообщений T_ EQU 118.4 ; Средний интервал времени поступления сообщений от источника Q EQU 3600 ; Производительность ВККС, оп/c V_ EQU 5000 ; Скорость передачи, бит/с Pc_ EQU 0.7 ; Вероятность потери сообщений при отказе ВККС L1_ EQU 2500000 ; Емкость накопителя ВККС, байт L2_ EQU 5 ; Емкость накопителя каналов связи, сообщений TOtk1 EQU 3600 ; Среднее время между отказами ВККС TOtk2 EQU 1800 ; Среднее время между отказами каналов TVost1 EQU 3.7 ; Среднее время восстановления ВККС TVost2 EQU 4.2 ; Среднее время восстановления каналов ; Описание функций, задающих исходные данные Kat FUNCTION RN34,D3 ; Вероятности видов категорий .3,1/.5,2/1,3 S_ FUNCTION P1,D3 ; Средние вычислительные сложности сообщений (длины), оп (байт) по категориям 1,53000/2,86000/3,66000 So_ FUNCTION P1,D3 ; Среднеквадратические отклонения вычис- лительных сложностей (длин) сообщений, оп (байт) по категориям 1,6100/2,5000/3,7000 ; Арифметические выражения вычисления DL VARIABLE INT(NORMAL(114,FN$S_,FN$So_)) ; Длин (вычислительных сложностей) сообщений VrPer VARIABLE (P2/V_)#8 ; Времени передачи сообщения VrObr VARIABLE P2/Q_ ; Времени обработки сообщения ; Сегмент имитации поступления сообщений от источников GENERATE (Exponential(11,0,(T_/n1_))) ; Источники сообщений ; Розыгрыш категории сообщения и счета сообщений Met4 ASSIGN 1,FN$Kat ; Запись в Р1 кода категории и счет сообщений всех категорий ASSIGN 10,(P1+MaxKat) ; Запись в Р10 номера Х для счета поступающих сообщений по категориям ASSIGN 11,(P10+MaxKat) ; Запись в Р11 номера Х для счета переданных сообщений по категориям ASSIGN 12,(P11+MaxKat) ; Запись в Р12 номера Х для счета потерянных сообщений по категориям ASSIGN 13,(P12+MaxKat) ; Запись в Р13 номера Х для записи вероятности переданных сообщений по категориям ASSIGN 14,(P13+MaxKat) ; Запись в Р14 номера Х для записи вероятности потерянных сообщений по категориям SAVEVALUE P10+,1 ; Cчет поступающих сообщений по категориям ; Розыгрыш характеристик сообщений Met02 ASSIGN 2,V$DL ; Занесение в Р2 длины (вычислительной сложности) сообщения ASSIGN 3,V$VrPer ; Занесение в Р3 времени передачи сообщения ASSIGN 8,V$VrObr ; Занесение в Р8 времени обработки сообщения ASSIGN 7,0 ; Код 0 в Р7 - признак попадания сообщения в накопитель TEST E P1,1,Met111 ; Если сообщение 1 категории, то PRIORITY 1 ; сообщению 1 категории - высокий приоритет ;Сегмент имитации работы накопителя 1 и ВККС Met111 GATE FV Vkks,Met5 ; Проверка ВККС на исправность GATE U Vkks,Met17 ; Проверка ВККС на занятость TEST LE P2,(L1_-X$TEmk),Met5 ; Есть ли место в накопителе ВККС? SAVEVALUE TEmk+,P2 ; Увеличение текущей емкости накопителя на длину сообщения LINK SVkks,PR ; Поместить сообщение в накопитель ВККС Met17 ASSIGN 7,1 ; Признак: сообщение поступило на ВККС, минуя накопитель Met14 SEIZE Vkks ; Занять ВККС ADVANCE P8 ; Имитация обработки RELEASE Vkks ; Освобождение ВККС TEST E P7,0,Met18 ; Если Р7 =0, то SAVEVALUE TEmk-,P2 ; уменьшить текущую емкость накопителя ВККС на длину обработанного сообщения Met18 UNLINK SVkks,Met111,1 ; Очередное сообщение из накопителя ВККС послать на обработку ; Сегмент имитации работы накопителя 2 и каналов связи Met15 ASSIGN 4,NCan ; Подготовка к циклу Met16 GATE FV P4,Met23 ; Начало цикла поиска исправного и свободного канала. ;Исправен ли канал? Если да, то GATE U P4,Met21 ; занят ли канал? Если нет, на Met21-занять канал TEST E X*4,1,Met61 ; Если канал занят сообщением низкого приоритета, то прервать Met23 LOOP 4,Met16 ; Все ли каналы просмотрены? Если нет, продолжить поиск TEST L CH$SCan_,L2_,Met5 ; Есть ли место в накопителе каналов? LINK SCan_,PR ; Сообщение в накопитель каналов Met21 SEIZE P4 ; Занять канал с номером в Р4 SAVEVALUE P4,P1 ; Занести код категории в ячейку с номером в Р4 ADVANCE P3 ; Имитация передачи сообщения RELEASE P4 ; Освобождение канала с номером в Р4 UNLINK SCan_,Met15,1 ; Очередное сообщение из накопителя каналов на передачу TRANSFER ,Met10 ; Счет переданных сообщений ; Имитация передачи по каналам с прерыванием Met61 SAVEVALUE P4,P1 ; Занести PR в ячейку с номером в Р4 PREEMPT P4,PR,Met62 ; Занять канал с номером в Р4 ADVANCE P3 ; Имитация передачи сообщения RETURN P4 ; Освобождение канала с номером в Р4 UNLINK SCan_,Met15,1 ; Очередное сообщение из накопителя каналов на передачу TRANSFER ,Met10 ; Счет переданных сообщений Met62 RELEASE P4 ; Освободить канал с номером в Р4 TRANSFER ,Met15 ; Отправить в накопитель каналов ;Сегмент имитации отказов ВККС GENERATE ,,,1 Met49 ADVANCE (Exponential(237,0,TOtk1)) ; Розыгрыш времени до очередного отказа ASSIGN 1,(RN35/1000) ; Обращение к датчику RN TEST LE P1,Pc_,Met50 ; Все ли сообщения в накопителях теряются? Met51 FUNAVAIL Vkks,RE,Met115 ; Перевод ВККС в неисправное состояние ADVANCE (Exponential(237,0,TVost1)) ; Имитация восстановления FAVAIL Vkks ; Перевод ВККС в исправное состояние TRANSFER ,Met49 ; Отправить для розыгрыша очередного отказа Met115 RELEASE Vkks ; Освобождение ВККС прерванным сообщением TEST E P7,0,Met5 ; Если Р7=0, то SAVEVALUE TEmk-,P2 ; уменьшить текущую емкость накопителя ВККС на длину потерянного сообщения TRANSFER ,Met5 ; Отправить для счета потерь Met50 UNLINK SVkks,Met5,ALL ; Потеря всех сообщений из накопителя ВККС UNLINK SCan_,Met5,ALL ; Потеря всех сообщений из накопителя каналов SAVEVALUE TEmk,0 ; Значение текущей емкости =0 TRANSFER ,Met51 ; Отправить для перевода ВККС в неисправное состояние ;Сегмент имитации отказов каналов связи GENERATE ,,,NCan ; Число транзактов - по числу каналов связи SAVEVALUE NumCan+,1 ; Записать в X$NumCan последовательно 1, 2, ..., NCan ASSIGN 4,X$NumCan ; Записать в Р4 последовательно 1, 2, ..., NCan Met19 ADVANCE (Exponential(237,0,TOtk2)) ; Розыгрыш времени до очередного отказа GATE FV P4,Met19 FUNAVAIL P4,RE,Met112 ; Перевод канала в неисправное состояние ADVANCE (Exponential(237,0,TVost2)) ; Имитация восстановления канала FAVAIL P4 ; Перевод в исправное состояние TRANSFER ,Met19 ; Отправить для розыгрыша очередного отказа Met112 RELEASE P4 ; Освобождение канала с номером 1 TEST E P1,1,Met5 ; Если сообщение 1 категории, то TRANSFER ,Met15 ; отправить на повторную передачу ; Сегмент счета переданных и потерянных сообщений и расчет вероятностей передачи сообщений Met10 SAVEVALUE P11+,1 ; Cчет и сохранение в ячейке с номером в Р11 переданных сообщений всего и по категориям SAVEVALUE P13,(X*11/X*10) ; Расчет и сохранение в ячейке с номером в Р13 вероятностей передачи по категориям ; SAVEVALUE VPerS,(N$Met10/N$Met4) ; Расчет и сохранение в ячейке VPerS вероятностей передачи сообщений всех категорий TERMINATE Met5 SAVEVALUE P12+,1 ; Cчет и сохранение в ячейке с номером в Р12 потерянных сообщений всего и по категориям SAVEVALUE P14,(X*12/X*10) ; Расчет и сохранение в ячейке с номером в Р14 вероятностей потери сообщений по категориям ; SAVEVALUE VPotS,(N$Met5/N$Met4) ; Расчет и сохранение в ячейке VPotS вероятностей потерь сообщений всех категорий TERMINATE ;Задание времени моделирования GENERATE VrMod ; Задание времени моделирования TERMINATE 1
Для задания исходных данных использованы команда EQU и функции.
Арифметические выражения введены для расчета вычислительных сложностей сообщений, времени их обработки и передачи. Поскольку вычислительная сложность определяется количеством операций, которое не может быть дробным, то для перевода в целое используется встроенная функция INT.
Рассмотрим работу блоковой части модели.
Так как интервалы времени поступления сообщений от источников одинаковы, то блок GENERATE вводит транзакты - сообщения в модель со средним значением интервала (T_/n1_ ).
Предполагается, что число категорий сообщений может изменяться от единицы до определенного максимального значения, поэтому программа модели построена так, чтобы не подвергаться коррекции в таком случае.
Для этого в сегмент имитации поступления сообщений от источников включена последовательность блоков, разыгрывающих категории сообщений. Категория сообщения записывается в параметр Р1 транзакта. Для счета всех поступивших сообщений и в последующем переданных и потерянных сообщений по категориям в параметры Р10…Р14 транзакта записываются номера сохраняемых ячеек. В параметр Р10 записывается номер (Р1+MaxKat), в параметры Р11…Р14 записываются те, которые отличаются в указанной последовательности на максимальное число категорий MaxKat, задаваемое в исходных данных.
Пусть MaxKat = 5. Тогда в зависимости от того, что в Р1:
Р1 = 1; Р10 = 4; Р11 = 7; Р12 = 10; Р13 = 13; Р14 = 16 ;Р1 = 2; Р10 = 5; Р11 = 8; Р12 = 11; Р13 = 14; Р14 = 17 ;Р1 = 3; Р10 = 6; Р11 = 9; Р12 = 12; Р13 = 15; Р14 = 18.Таким образом, распределение номеров сохраняемых ячеек не зависит от количества категорий сообщений.
После счета поступающих сообщений по категориям в сохраняемых ячейках с номерами в параметре Р10 производится розыгрыш и запись характеристик сообщений: вычислительной сложности, времени обработки и времени передачи по описанным ранее арифметическим выражениям. Характеристики записываются в параметры Р2, Р8 и Р3 соответственно.
Если сообщение первой категории, ему присваивается приоритет 1. Все сообщения отправляются на сегмент имитации работы накопителя 1 и ВККС.
Здесь вначале ВККС проверяется на исправность и занятость.
Если ВККС неисправен, сообщение теряется. Транзакт направляется на метку Мет5. Здесь учитывается потерянное сообщение, и рассчитываются вероятности потерь по категориям и в целом по всем категориям. После этого транзакт выводится из модели.
Если ВККС исправен, но занят, проверяется возможность сохранения сообщения в накопителе 1 SVkks. Если достаточно свободной емкости, сообщение помещается в накопитель 1. Его текущая занятая емкость TEmk увеличивается на длину сообщения. Если свободной емкости недостаточно, сообщение теряется. Транзакт направляется на метку Мет5. Здесь выполняются те же действия, что и при возникновении неисправности ВККС.
Если ВККС исправен и свободен, т. е. накопитель 1 пуст, тран-закт направляется на метку Мет17. В параметр Р7 заносится 1 - признак поступления сообщения на обработку, минуя накопитель 1. Транзакт занимает ВККС. После обработки при Р7 = 1 транзакт направляется на Мет18 для вывода очередного сообщения из накопителя 1 (если оно есть) для обработки на ВККС. Выводящий же транзакт - обработанное сообщение направляется в сегмент имитации работы накопителя 2 и каналов связи.
Поиск канала для передачи сообщения организован в цикле Максимально возможное повторение в цикле равно числу каналов связи.
Для организации в модели циклов предназначен блок LOOP. Он имеет следующий формат:
LOOP A,B
Операнд А - параметр транзакта или параметр цикла, в котором содержится число повторений какого-либо участка модели.
Операнд B - метка блока, с которого начинается цикл.
Операнды А и B могут быть именем, положительным целым числом, выражением в скобках, СЧА или СЧА*параметр.
Например, в данной модели блок LOOP используется так:
Met15 ASSIGN 4,NCan ; Подготовка к циклу Met16 GATE FV P4,Met23 ; Начало цикла поиска исправного и свободного канала ; Исправен ли канал? Если да, то GATE U P4,Met21 ; занят ли канал? Если нет, на Met21-занять канал TEST E X*4,1,Met61 ; Если канал занят сообщением низкого приоритета, то прервать Met23 LOOP 4,Met16 ; Все ли каналы просмотрены? Если нет, продолжить поиск
Блок с меткой Мет16 является началом цикла, т. е. расположен раньше блока LOOP. Когда транзакт, пройдя участок модели, начинающийся блоком с меткой Мет16, войдет в блок LOOP, значение его параметра - параметра номер четыре транзакта уменьшается на 1. Если это значение не равно нулю, транзакт переходит к блоку с меткой Мет16, т. е. цикл повторяется. Если же после вычитания 1 значение параметра цикла равно нулю, следовательно, выполнено заданное число повторений, транзакт переходит к следующему блоку.
LOOP значение параметра цикла уменьшается на 1. Значит, значение параметра цикла можно использовать для выбора новых значений каких-либо факторов при очередном повторении. Однако это не всегда удобно, так как величина параметра цикла изменяется от большего к меньшему значению, а не наоборот. В рассматриваемой модели это не имеет принципиального значения.Если в результате поиска находится исправный и свободный канал, транзакт направляется на Мет21 и занимает канал, номер которого содержится в его параметре Р4 (ссылка *4). После имитации передачи транзакт входит в блок UNLINK для вывода очередного сообщения из накопителя 2 на передачу. Выводящий же транзакт - переданное сообщение направляется на метку Мет10. Здесь учитывается переданное сообщение, рассчитываются вероятности передачи сообщений отдельно по категориям и в целом по всем категориям.
Если просмотрены все каналы связи и не найдено свободного канала для передачи сообщения не первой категории, проверяется возможность помещения этого сообщения в накопитель Scan_. При отсутствии свободного места в накопителе Scan_ сообщение теряется, и транзакт направляется на метку Мет5 для учета и вывода из модели.
Если при передаче сообщения первой категории, обладающего абсолютным приоритетом по отношению к сообщениям других категорий, в результате поиска не найдено свободного канала или занятого передачей сообщений более низких
Если же обнаружен канал, занятый передачей сообщения более низкого приоритета, транзакт направляется на метку Мет61. Происходит прерывание сообщения низкого приоритета. Прерванное сообщение направляется на метку Мет15 для проверки возможности размещения его в накопителе каналов связи Scan_. Переданное сообщение выводит из накопителя каналов связи на передачу очередное сообщение и направляется на метку Мет10 для счета.
Теперь рассмотрим сегменты имитации отказов.
Начнем с сегмента имитации отказов ВККС. ВККС в модели представлен ОКУ с именем Vkks. Блок GENERATE вырабатывает один транзакт и становится неактивным. Далее имитация отказов организуется в цикле. Такой метод позволяет уменьшить количество транзактов в модели, сократить машинное время. Ведь можно было бы сделать так, чтобы GENERATE вводил в модель транзакт для имитации каждого отказа ВККС, а блок TERMINATE выводил его после имитации восстановления.
Блоком ADVANCE с меткой Мет49 разыгрывается время до очередного отказа. Затем: все ли сообщения в накопителе теряются? Если да, транзакт направляется на Мет50. Из накопителей SVkks и Scan_ выводятся и теряются все имевшиеся там сообщения. Обнуляется текущая емкость TEmk накопителя SVkks и транзакт направляется к метке Мет51 для перевода ВККС в неисправное (недоступное) состояние. После восстановления транзакт направляется на метку Мет49 для розыгрыша очередного отказа.
Если же не все сообщения теряются, а только те, которые обрабатываются ВККС, он переводится в неисправное состояние. Обрабатываемое сообщение удаляется, и транзакт направляется на метку Мет115.
Если сообщение перед обработкой помещалось в накопитель SVkks, его емкость уменьшается на длину потерянного сообщения. Транзакт направляется на метку Мет5 для счета и уничтожения.
Каналы связи в модели представлены несколькими ОКУ, работающими параллельно. Следовательно, они будут независимо друг от друга выходить из строя. Поэтому блок GENERATE вырабатывает сразу количество транзактов, равное количеству каналов связи NCan_. Далее эти транзакты в соответствии с номером канала, записанным в параметр Р1 каждого из NCan_ транзактов, имитируют выход каналов связи из строя. Предполагается, что время восстановления канала связи значительно меньше времени между его предыдущим и последующим отказами.
После 1000 прогонов получим следующие результаты моделирования:
| SAVEVALUE | RETRY | VALUE |
|---|---|---|
| 1 | 0 | 1.000 |
| 2 | 0 | 1.000 |
| 3 | 0 | 1.000 |
| 4 | 0 | 1094993.000 |
| 5 | 0 | 729783.000 |
| 6 | 0 | 1823763.000 |
| 7 | 0 | 519429.000 |
| 8 | 0 | 320633.000 |
| 9 | 0 | 811566.000 |
| 10 | 0 | 575561.000 |
| 11 | 0 | 409149.000 |
| 12 | 0 | 1012190.000 |
| 13 | 0 | 0.474 |
| 14 | 0 | 0.439 |
| 15 | 0 | 0.445 |
| 16 | 0 | 0.526 |
| 17 | 0 | 0.561 |
| 18 | 0 | 0.555 |
| TEMK | 0 | 2498959.000 |
| VPERS | 0 | 0.453 |
| VPOTS | 0 | 0.547 |
Ранее отмечалось, что осуществить имитацию выхода МКУ из строя, при котором все транзакты, находившиеся в МКУ на обслуживании, теряются, блоками SUNAVAIL и SAVAIL невозможно. Рассмотрим, как это можно осуществить с применением блока на следующем примере.
Многоканальная СМО с отказами без очереди. СМО имеет конечную надежность. При выходе СМО из строя заявки, находившиеся на обслуживании, теряются. Новые заявки на обслуживание не принимаются.
; Модель многоканальной СМО конечной надежности ; Определение МКУ и булевых переменных Emk EQU 7 Zap EQU 2 Sist STORAGE 7 Kont1 BVARIABLE SV$Sist'AND'((7-S$Sist)>=Zap) Kont2 BVARIABLE SE$Sist ; Сегмент имитации поступления и обслуживания заявок GENERATE 2,,,7 ; Источник заявок Met12 TEST E BV$Kont1,1,Met1 ; Есть ли место в МКУ? SAVEVALUE KolPovt,(INT(Emk/Zap)) ENTER Sist,Zap ; Занять МКУ ; Учет номеров транзактов, занявших МКУ ASSIGN KolPovt,X$KolPovt ; Запись в параметр цикла Met5 TEST E X*KolPovt,0,Met4 ; Есть ли в списке место? SAVEVALUE P$KolPovt,XN1 ; Да, записать номер транзакта TRANSFER ,Met6 ; Выйти из цикла Met4 LOOP KolPovt,Met5 ; Повторить или конец цикла ; Met6 ADVANCE 5 ; Имитация обслуживания LEAVE Sist,Zap ; Освободить МКУ ; Учет номеров транзактов, освободивших МКУ ASSIGN KolPovt,X$KolPovt ; Запись в параметр цикла Met8 TEST E X*KolPovt,XN1,Met7 ; Есть ли этот номер транзакта? SAVEVALUE P$KolPovt,0 ; Да, тогда удалить TRANSFER ,Met9 ; Выйти из цикла Met7 LOOP KolPovt,Met8 ; Повторить или конец цикла Met9 TERMINATE 1 ; Обслуженные заявки Met1 TERMINATE 1 ; Потерянные заявки ; Сегмент имитации неисправностей GENERATE ,,,1 Met2 ADVANCE 7.5 ; Интервал отказов SUNAVAIL Sist ; Перевод в недоступность ; Удаление транзактов из МКУ ASSIGN KolPovt,X$KolPovt ; Запись в параметр цикла Met10 TEST NE X*KolPovt,0,Met11 ; Есть ли транзакт в МКУ DISPLACE X*KolPovt,Met3 ; Да, тогда удалить SAVEVALUE P$KolPovt,0 ; Снять с учета Met11 LOOP KolPovt,Met10 ; Повторить или конец цикла TEST E BV$Kont2,1 ; МКУ пуст? ADVANCE 1 ; Да, тогда ремонтируем SAVAIL Sist ; Перевод в доступность TRANSFER ,Met2 Met3 LEAVE Sist,2 ; Освободить МКУ TERMINATE 1 ; Удаленные из МКУ транзакты
В данной модели кроме блока показывается также применение булевых переменных.
Булевы переменные с использованием всего лишь одного блока дают возможность принимать решения в зависимости от состояния и значения атрибутов многих объектов . Булева переменная представляет собой логическое выражение, составленное из различных СЧА, в том числе и других булевых переменных.
Булева переменная определяется командой BVARIABLE.
Формат команды:
Name BVARIABLE A
Name - имя булевой переменной, которое также, как и имя арифметической переменной, по желанию пользователя командой EQU может быть заменено номером.
Операнд А - логическое выражение.
В выражении можно использовать арифметические и логические операторы. Результат преобразуется в целое значение 0, если равен нулю, или в целое значение 1, если отличен от нуля.
Логические операторы связаны с объектами аппаратной категории и используются для определения состояния этих объектов.
Имеются следующие логические операторы:
FVj равен 1, если устройство j доступно, иначе - 0 ;FIj равен 1, если устройство j обслуживает прерывание, иначе - 0 ;SFj равен 1, если МКУ j заполнено полностью, иначе - 0 ;SEj равен 1, если МКУ j пусто, иначе - 0 ;SVj равен 1, если МКУ j доступно, иначе - 0 ;LSj равен 1, если логический ключ j включен, иначе - 0. Под j понимается номер или имя.Например:
Oky BVARIABLE FV$Rem1 Can3 BVARIABLE SF$Usel Prov1 BVARIABLE SV$Pusk Prov2 BVARIABLE LS2
В первом примере булева переменная Oky равна 1, если устройство Rem1 доступно, и - 0, если не доступно. Во втором примере булева переменная Can3 равна 1, если МКУ Usel заполнено полностью. В третьем примере булева переменная Prov1 равна 1, если МКУ Pusk доступно. В четвертом примере булева переменная Prov2 равна 1, если логический ключ номер 2 включен.
Операторы отношения производят алгебраическое сравнение операндов. Например:
Prov1 BVARIABLE V$VseAvt'G'16 Prov2 BVARIABLE Q5$'LE'P3 Prov3 BVARIABLE MX$Plan(Stroka,Stolbez)'GE'P2
Булева переменная Prov1 равна 1, если переменная VseAvt больше 16, иначе равна 0. Во втором примере булева переменная Prov2 равна 1, если текущая длина очереди номер 5 меньше или равна значению параметра 3 транзакта. В третьем примере булева переменная Prov3 равна 1, если значение определенного элемента матрицы Plan больше или равно значению параметра 2.
Булевых операторов два: OR - ИЛИ и AND - И. Оператор ИЛИ проверяет выполнение хотя бы одного из условий, а оператор И требует выполнения обоих условий. Например:
Con1 BVARIABLE FI$Rem"OR"SF4 Con2 BVARIABLE FI$Rem"AND"SF$Pogr Con3 BVARIABLE (V3'G'7)"AND"(FN$Rav"OR"LS7)
Булева переменная Con1 равна 1, если выполняется одно из условий: устройство Rem обслуживает прерывание или память номер 4 не заполнена. Булева переменная Con2 равна 1, если выполняются оба условия: устройство Rem обслуживает прерывание и память с именем Pogr не заполнена. В третьем примере переменная Con3 равна 1, если выполняются оба условия: значение переменной номер 3 больше 7 и логический ключ номер 7 включен.
Скобки в третьем примере нужны только для задания определенных булевых соотношений. Скобки следует использовать только в тех случаях, когда они необходимы.
Если булева переменная задается СЧА, как например
Stan BVARIABLE V$TreAvt
то вычисляется значение арифметической переменной с именем TreAvt и если оно отлично от нуля - значение булевой переменной Stan будет равно 1, в противном случае - 0.
Рассмотрим работу модели.
Блок GENERATE с интервалами две единицы модельного времени генерирует семь транзактов. Следующий за ним блок TEST проверяет МКУ Sist на исправность (доступность) и наличия в нем свободных каналов, достаточных для удовлетворения запроса. Если булева переменная Kont1 равна 1, транзакт пропускается и занимает МКУ Sist. Но перед этим вычисляется и заносится целое число INT(Emk/ в сохраняемую ячейку с именем KolPovt, которое определяет, сколько транзактов может одновременно находится в МКУ.
После выхода транзакта из блока ENTER начинает работать сегмент учета номеров транзактов, занявших МКУ. Блоком ASSIGN в параметр с именем KolPovt - параметр цикла - заносится число, находящееся в сохраняемой ячейке с именем KolPovt. Далее в цикле, тело которого начинается с блока TEST с меткой Met5 и заканчивается блоком LOOP с меткой Met4, находится свободное место в списке для записи номера транзакта. Свободное место определяется блоком TEST как равенство нулю значения какой-либо одной из трех сохраняемых ячеек Х1, Х2 или Х3 (по числу транзактов, одновременно находящихся в МКУ).
Такая ячейка всегда есть и блоком SAVEVALUE в нее записывается номер занявшего МКУ транзакта. А так как сохраняемых ячеек, значения которых равны нулю, может быть несколько (особенно вначале работы модели), после записи номера транзакта осуществляется выход из цикла.
Транзакт направляется к блоку ADVANCE с меткой Met6 и входит в него. Имитируется обслуживание заявки. После обслуживания транзакт освобождает МКУ Sist, пройдя блок LEAVE.
Начинает работать сегмент учета номеров транзактов, освободивших МКУ. Его работа аналогична рассмотренной ранее работе сегмента учета номеров транзактов, занявших МКУ. Отличие состоит в том, что отыскивается сохраняемая ячейка Х1, Х2 или Х3, которая содержит номер обслуженного транзакта. Найденная ячейка обнуляется, т. е. обслуженный транзакт снимается с учета. Так как номер записывается только в одну ячейку, то после ее обнуления осуществляется выход из цикла, тело которого начинается с блока TEST с меткой Met8 и заканчивается блоком LOOP с меткой Met7.
Теперь рассмотрим работу модели при возникновении неисправности МКУ. Транзакт, инициирующий неисправность, после задержки блоком ADVANCE сегмента имитации неисправностей, входит в блок SUNAVAIL, который переводит МКУ Sist в недоступное (неисправное) состояние.
Далее начинается работа сегмента удаления транзактов из МКУ. Суть ее заключается в следующем. В цикле, также организованном с помощью блока LOOP, просматривается список номеров транзактов, занявших МКУ. Если значение какой-либо сохраняемой ячейки Х1, Х2 или Х3 не равно нулю, значит в ней записан номер транзакта, находящегося в данный момент в МКУ. Блоком этот транзакт перемещается к блоку LEAVE с меткой Met3, освобождает МКУ и выводится из модели.
После удаления из МКУ всех транзактов, транзакт - инициатор неисправности входит в следующий за блоком LOOP с меткой Met11 блок TEST. Так как МКУ Sist пусто (булева переменная Kont2 равна нулю), блок TEST пропускает этот транзакт в блок ADVANCE и начинается имитация восстановления работоспособности МКУ.
Результаты моделирования представлены в табл. 6.4.
Из результатов следует, что обслужены только две заявки (первый и шестой транзакты). Пять заявок не обслужены: пятый тран-закт поступил, когда МКУ было неисправным, а третий и четвертый, седьмой и восьмой транзакты потеряны: в моменты возникновения неисправностей ( t = 7,5 и t =16 соответственно) они находились в МКУ.
| События | Транзакты | ||||||
|---|---|---|---|---|---|---|---|
| 1 | 3 | 4 | 5 | 6 | 7 | 8 | |
| Вход в модель | 2 | 4 | 6 | 8 | 10 | 12 | 14 |
| Занятие МКУ | 2 | 4 | 6 | 10 | 12 | 14 | |
| В МКУ транзакты | 1 | 1,3 | 1,3,4 | 6 | 6,7 | 6,7,8 | |
| Удаление | 7.5 | 7.5 | 16 | 16 | |||
| Освобождение МКУ | 7 | 7.5 | 7.5 | 15 | 16 | 16 | |
| Вывод из модели | 7 | 7.5 | 7.5 | 8 | 15 | 16 | 16 |
Коэффициент использования ( Util.) МКУ Sist равен 0,375. Он рассчитывается по формуле:
где $$n$$ - число транзактов, занимавших МКУ за время Т моделирования;
$$Е$$ - число каналов МКУ (емкость);
$$\alpha_i$$ - число каналов, занимаемых i - м транзактом;
$$\Delta t_i $$ - промежуток времени, в течение которого $$i$$ - м транзактом было занято $$\alpha_i $$ каналов, рассчитывается как
$$\Delta t_i =t_{2i} - t_{1i}$$$$t_{1i}$$ и $$t_{2i}$$ - абсолютное модельное время занятия и освобождения соответственно $$\alpha _{i} $$ каналов МКУ.
Для рассматриваемого примера п. 6.8.1 (см. табл. 6.4) имеем:
$$E=7,\,\,T=16,\,\,\alpha=2;\\ \Delta t_1=7-2=5,\,\,\Delta t_2=7.5-4=3.5,\,\,\Delta t_3=7.5-6=1.5,\,\,\Delta t_4=0;\\ \Delta t_5=15-10=5,\,\,\Delta t_6=16-12=4,\,\,\Delta t_7=16-14=2;\\ k_1=\cfrac{2(5+3.5+1.5+0+5+4+2)}{16\cdot 7}=\cfrac{2\cdot 21}{16\cdot 7}=\cfrac{3}{8}=0.375.$$Таким образом, коэффициент использования МКУ рассчитан с учетом времени занятия его полностью обработанными транзак-тами и временем, затраченным на обработку тех транзактов, обслуживание которых было прервано.
Если в результате моделирования требуется определить коэффициент использования МКУ без учета удаленных из него тран-зактов, т. е. транзактов, обслуживание которых было прервано, пользователь может это сделать самостоятельно. Для этого нужно знать, сколько заявок будет обслужено полностью. Введем в модель следующие строки:
KIsp VARIABLE (Zap#N$Met9#5)/(Emk#16) SAVEVALUE KIsp,V$KIsp
Получим $$k_1=\cfrac{2(5+5)}{16\cdot 7}=\cfrac{5}{28}=0.179$$.
LINK и UNLINK.CLEAR и RESET.L сообщений). В соответствии с этим откорректируйте программу модели решения прямой задачи (п. 6.3.1). Запустите модель и получите результаты.Модель разрабатывается на языке
Текстовый объект ( текстовый файл
Кроме этого комплекса в составе
Чтобы обеспечить правильную последовательность обработки событий во времени, имеются системные часы, хранящие значения абсолютного модельного времени
Объекты в моделируемой системе предназначены для различных целей. Совершенно не обязательно, чтобы в одной модели участвовали все типы объектов. Необходимо лишь наличие блоков и транзактов, иначе модель работать не будет.
Объекты подразделяются на 7 категорий и 15 типов, которые представлены в табл. 6.1.
| Категории | Типы объектов |
|---|---|
| Динамическая | Транзакты |
| Операционная | Блоки |
| Аппаратная | Одноканальные устройства, памяти (многоканальные |
| устройства), логические ключи (переключатели) | |
| Вычислительная | Переменные, функции, генераторы случайных чисел |
| Статистическая | Очереди, таблицы |
| Запоминающая | Ячейки, матрицы ячеек |
| Группирующая | Числовые группы, группы транзактов, списки |
Рассмотрим назначение объектов
Динамическими объектами являются транзакты, которые создаются в определенных точках модели, продвигаются планировщиком через блоки, а затем уничтожаются. Транзакты являются аналогами единиц - потоков в реальной системе. Они могут представлять собой различные элементы даже в одной модели. С каждым транзактом связаны параметры, которые используются для конкретных данных. Каждый транзакт может иметь любое число параметров. Параметры нумеруются или им даются имена. Номера параметров и имена используются для ссылок на значения, присвоенные параметрам. Транзактам может присваиваться приоритет.Приоритет определяет предпочтение, которое получает транзакт, когда он и другие транзакты претендуют на один и тот же ресурс.
Объекты аппаратной категории - это абстрактные элементы, на которые может быть декомпозирована реальная система. Воздействуя на эти объекты, транзакты могут изменять их состояние и влиять на движение других транзактов. К объектам этого типа относятся одноканальные устройства, памяти (многоканальные устройства) и логические ключи.
Одноканальные устройства (ОКУ) представляют собой оборудование, которое в любой момент времени может быть занято только одним транзактом. Например, один
Многоканальные устройства (МКУ) предназначены для имитации оборудования, осуществляющего параллельную обработку. Они могут быть использованы одновременно несколькими тран-зактами. МКУ можно использовать в качестве аналога, например, многоканального ремонтного органа, нескольких каналов связи.
Для моделирования такого оборудования, как переключатели, имеющие только два состояния, в
Операционные объекты, т. е. блоки, задают логику функционирования модели системы и определяют пути движения транзактов между объектами аппаратной категории. В блоках могут происходить события четырех основных типов:
В зависимости от назначения блоки подразделяются на несколько групп.
GENERATE, SPLIT, TERMINATE, ASSEMBLE ;ADVANCE ;MATCH и нескольких GATHER транзактов;PRIORITY ;ASSIGN, INDEX, MARK, PLUS.DISPLACE , TRANSFER, LOOP, TEST, GATE.ADOPT, ALTER, EXAMINE , JOIN, REMOVE, SCAN.SEIZE, RELEASE, PREEMPT, RETURN, FUNAVAIL, FAVAIL ;ENTER, LEAVE, SAVAIL, SUNAVAIL ;LOGIC.SAVEVALUE, MSAVEVALUE.QUEUE, DEPART ;TABULATE .LINK, UNLINK.OPEN / CLOSE ;READ / WRITE ;SEEK.BUFFER, COUNT, EXECUTE, INTEGRATION, SELECT, TRACE, UNTRACE.Вычислительная категория служит для описания таких ситуаций в процессе моделирования, когда связи между компонентами моделируемой системы посредством процессом наиболее просто и компактно выражаются в виде математических (аналитических и логических) соотношений. Для этих целей в качестве объектов вычислительной категории введены арифметические и булевы переменные и функции.
Переменные представляют собой сложные выражения, которые включают константы, системные числовые атрибуты (СЧА), библиотечные
Выражения могут применяться в переменных и операторах
Каждому объекту соответствуют атрибуты, описывающие его состояние в данный момент времени. Они доступны для использования в течение всего процесса моделирования и называются системными числовыми атрибутами (СЧА). Например, объект вычислительной категории - генератор случайных чисел имеет СЧА - число, вычисляемое генератором равномерно распределенных случайных чисел номер n ; у объекта динамической категории - транзакта СЧА: PR - приоритет обрабатываемого в данный момент транзакта; Pi - значение i -го параметра активного транзакта и др. Всего в
Булевы переменные позволяют пользователю проверять в одном блоке
С помощью функций пользователь может производить вычисления непрерывных или дискретных функциональных зависимостей между аргументом функции (независимая величина) и зависимым значением функции.
Кроме библиотечных арифметических функций
Объекты запоминающей категории обеспечивают обращения к сохраняемым значениям. Ячейки сохраняемых величин и матрицы ячеек сохраняемых величин используются для сохранения некоторой числовой информации. Любой активный транзакт может произвести запись информации в эти объекты. Впоследствии записанную в эти объекты информацию может считать любой транзакт. Матрицы могут иметь до шести измерений.
К статистическим объектам относятся очереди и таблицы. В любой системе движение потока транзактов может быть задержано из-за недоступности устройств. В этом случае задержанные транзакты ставятся в очередь - еще один тип объектов
Для облегчения табулирования статистической информации в
К группирующей категории относятся три типа объектов: числовая группа, группа транзактов и списки.
При моделировании транзакты хранятся в списках. Существует пять видов списков, только в одном из которых в любой момент времени может находиться транзакт:
Одноканальное устройство имеет:
Многоканальное устройство имеет:
Список пользователя содержит транзакты, удаленные пользователем из списка текущих событий и помещенные в список пользователя как временно неактивные. Списки пользователя используются для организации очередей с дисциплинами, отличными от дисциплины "первым пришел - первым обслужен".
Для представления собственно обслуживания используются определенные элементы. Такими элементами могут быть либо люди, либо какие-то предметы. Независимо от этого подобные элементы в
Рассмотрение методов построения моделей с устройствами начнем с имитации функционирования ОКУ.
При моделировании возможны следующие режимы организации функционирования ОКУ:
вспомним, что потоки, существующие в реальных системах, в моделях имитируют транзакты. Поэтому сначала узнаем, как вводятся транзакты в модель и как выводятся из нее. А так как построение самых простейших моделей невозможно без некоторых блоков
GENERATE - это блок, через который транзакты входят в модель. Блок GENERATE имеет следующий формат записи:
GENERATE [A],[B],[C],[D],[E]
Скобки [ ] означают, что данный операнд является необязательным. Не существует ограничений на число различных блоков GENERATE в одной модели.
Интервалы времени между последовательными появлениями транзактов блока GENERATE называют интервалом поступления. Все разработчики должны задавать спецификацию распределения интервалов времени поступления в блоке GENERATE. Информация, необходимая для этого, задается операндами А и B. Все возможные виды распределения интервалов времени поступления в
Операнд А - средний интервал времени между последовательными поступлениями транзактов в модель.
Операнд B - задает модификатор, который изменяет значения интервала генерации транзактов по сравнению с интервалом, указанным операндом А. Есть два типа модификаторов: модификатор-интервал и модификатор-функция.
С помощью модификатора-интервала задается равномерный закон распределения времени между генерацией транзактов.
Операнды А и B могут быть именем, положительным числом, выражением в скобках или непосредственно СЧА.
При вычислении разности значений (А-В), заданных операндами А и B, получается нижняя граница интервала, а при вычислении суммы (А+В) - верхняя граница. После генерации очередного транзакта выбирается число из полученного интервала, это и будет значение времени, через которое следующий транзакт выйдет из блока GENERATE.
Когда операнды А и B задают в виде констант ( B - модификатор-интервал), они должны быть неотрицательными числами, т. е. интервал времени может быть выражен числами, например, 4.1,…,12.7. Предположим, что транзакт входит в модель - блок GENERATE - в момент модельного времени 25.6. После того, как этот транзакт попадет в следующий блок модели, планировщик
Пусть разыгранным значением будет число 9.7. Тогда планировщик планирует приход следующего транзакта в блок GENERATE в момент времени 25.6+9.7=35.3.
Можно выбрать для розыгрыша генератор равномерно распределенных случайных чисел. Это устанавливается на странице " Random Numbers " ( Случайные числа ) в журнале настроек модели. Нужно выбрать Edit/Settings ( Правка/Настройка ) и страницу " Random Numbers " ( Случайные числа ), на которой в поле ввода " GENERATE " ввести номер генератора - любое положительное целое число. По умолчанию используется генератор равномерно распределенных случайных чисел номер 1.
Операнды А и В не обязательно должны быть заданы. Когда один или оба операнда не указаны, по умолчанию предполагается их нулевое значение. Например, А=16.4, В=0. Поскольку операнд В=0, то интервалы времени распределены равномерно, $$16.4\pm 0$$, т. е. интервал времени поступления равен 16.4. Это пример того, как может быть задано детерминированное значение интервалов времени.
Более сложные интервалы времени поступления транзактов (не по равномерному закону) могут быть заданы с использованием модификатора-функции или встроенных генераторов случайных чисел. Под действием модификатора-функции значение операнда А умножается на значение функции, заданной операндом В.
При любом способе вычисления интервала времени значение операнда В не должно превышать значения операнда А, в противном случае в блоке GENERATE может быть получен отрицательный интервал времени, который вызовет останов по ошибке "Отрицательное время задержки".
Рассмотрим три дополнительных операнда: С - смещение интервалов, D - ограничитель, Е - уровень приоритета.
Смещение интервалов (первоначальная задержка) С - это момент времени, в который в блоке GENERATE должен появиться первый транзакт. После этого первого прихода все остальные приходы транзактов возникают в соответствии с распределением интервалов времени, задаваемых операндами А и B. Операнд С можно использовать как для ускорения, так и для замедления прихода первого транзакта или для указания прихода в нужный момент времени. Начальная задержка может быть меньше, равна или больше среднего времени, заданного операндом А. Когда операнд С не используется, интервалы генерирования определяются операндами А и B (они не оказывают влияния на задержку). Операнд С может быть таким же как и операнды А и B.
Операнд D задает граничное значение общего числа транзак-тов, которые могут войти в модель через данный блок GENERATE в течение времени моделирования. Когда это число достигнуто, данный блок GENERATE перестает быть активным. Если не определено граничное значение (операнд D не используется), блок GENERATE остается активным в течение всего времени моделирования, т. е. по умолчанию ограничения на количество создаваемых транзактов нет.
Операнд Е устанавливает класс приоритета каждого из транзак-тов, входящих в модель через данный блок GENERATE. Для задания приоритетов c целью повышения эффективности работы 0, 1, 2, 3,… вместо, например, 37, 43, 88, 122,... Чем выше число, тем выше приоритет. Если операнд Е не используется, по умолчанию приоритет генерируемых данным блоком GENERATE транзактов равен нулю.
Операнды D и Е могут задаваться также как и операнды А, B и С, но при этом принимать значения только целых положительных и целых чисел соответственно.
В любом блоке GENERATE должен быть обязательно задан либо операнд А, либо операнд D. Нельзя использовать в качествеоперанда параметры транзактов. Необходимо также помнить, что транзакт не должен входить в блок GENERATE. Если транзакт пытается это делать, возникает ошибка выполнения. Приведем примеры записи блоков GENERATE:
АGENERATE 38.6 GENERATE X$IntPostTran GENERATE MX$VrPost(3,6) GENERATE V$Prom GENERATE (Exponential(11,0,X$Mat)) GENERATE IntPostTran
А и BGENERATE 73.25,X$Otk GENERATE X$Sredne,FN2 GENERATE Sredne,FN4 GENERATE (V$Post+7.1),FN$Mod
А и CGENERATE 7.3,,4.1 GENERATE 7.3,,X$VrSm GENERATE V$IntP,,MX2(X$Stroka,X$Stolbez) GENERATE (Normal(3,X$Sre,X$SreOtk)),,Sme
А, B, EGENERATE 13.3,2.8,,,1 GENERATE (Normal(8,X$Sr,X$SrOtk)),Post,,1 GENERATE V$IntPostTran,(V1-12.3),,12
Приведенные примеры демонстрируют различные способы задания операндов блока GENERATE. Однако при этом нужно помнить следующее.
В начальный момент времени в каждом блоке GENERATE производится подготовка к выходу одного транзакта. На этой стадии модель еще полностью не инициализирована для выполнения, т. е. не все переменные получили значения. Но описанные в блоке GENERATE, должны быть уже определены - инициализированы. Поэтому в модели блоку GENERATE должны предшествовать команды определения EQU, INITIAL, FUNCTION, VARIABLE, FVARIABLE. Это делается для того, чтобы СЧА в блоке GENERATE, который ссылается на них, давали нужные для ввода транзактов в модель результаты.
Например:
SrIntPost EQU 47.2
StanOtkl EQU 28.6
INITIAL X$KolTrans,43
. . .
GENERATE SrIntPost,StOtk,,X$KolTrans
Как видно из примера, блоку GENERATE предшествуют присвоения командой EQU именам числовых значений и командой INITIAL начального значения сохраняемой ячейке с именем Kol-Trans.
Транзакты удаляются из модели, попадая в блок TERMINATE (завершить).
Блоки TERMINATE всегда позволяют войти всем транзактам, которые пытаются это сделать. В модели может быть любое число блоков TERMINATE. Блок имеет следующий формат записи:
TERMINATE [A]
Значением операнда А является число единиц, на которое блок TERMINATE уменьшает содержимое счетчика завершения, определяющего момент окончания моделирования. Операнд А может быть именем, положительным целым числом, выражением в скобках, СЧА или СЧА*<параметр>. По умолчанию значение операнда А равно нулю. В этом случае транзакт уничтожается, а значение счетчика завершения не меняется.
Счетчик завершения представляет собой ячейку памяти с именем TG1, которая хранит положительное целое число. Это число записывается в ячейку TG1 командой START в начале процесса моделирования.
В процессе моделирования транзакты попадают в блок TERMINATE и в соответствии со значением операнда А вычитают определенное число из счетчика завершения. При достижении содержимым счетчика нуля моделирование завершается. В модели может быть много блоков TERMINATE, но счетчик завершения только один.
Когда пользователь подготавливает модель, он задает время моделирования, указывая в операторе START значение счетчика завершения. Поскольку пути прохождения транзактов в модели имеют различный физический смысл, каждый блок TERMINATE может либо уменьшать, либо не уменьшать содержимое счетчика завершения.
Рассмотрим пример, в котором блок TERMINATE и команда START используются для управления временем моделирования. Предположим, что разработчик выбрал в качестве единицы времени 1 мин. Он хочет промоделировать поведение системы в течение 10 часов, затем моделирование должно быть закончено. За единицу модельного времени возьмем 1 мин, тогда время моделирования равно 10*60=600 единицам.
Любая модель на
GENERATE и TERMINATE ;TERMINATE в качестве операнда А использует 1 ;TERMINATE модели использует операнд А по умолчанию (однако возможны и другие варианты, т. е. и в других блоках TERMINATE операнд А может быть 1 ).В процессе моделирования транзакты, которые двигаются в других сегментах модели, время от времени выводятся из модели в других блоках TERMINATE, но они не оказывают воздействия на счетчик завершения. В момент модельного времени 600 транзакт в приведенном выше сегменте попадает в блок GENERATE и сразу же переходит в следующий блок TERMINATE.
Поскольку операнд А блока содержит 1, то из счетчика завершения вычитается 1. Предположим, что в команде START было указано число 10, т. е. десять прогонов модели, и в счетчик завершений записано число 10: TG1 = 10. После первого вычитания содержимое ячейки TG1 = 9, т. е. не равно нулю. Поэтому моделирование продолжается. После десяти прогонов, т. е. вычитания десяти единиц, TG1 = 0. Планировщик прекращает моделирование.
Команда START используется для запуска процесса моделирования. Она имеет следующий формат записи:
START A,[B],C,[D]

Операнд А задает значение счетчика завершения, определяющего момент окончания прогона модели. Может быть только целым положительным числом. Операнд B - операнд вывода статистики. Он может быть NP ("нет вывода данных") либо опущен. При задании NP стандартный отчет не выводится. По умолчанию выводится стандартный отчет. Операнд С не используется и сохранен для совместимости с описаниями ранних версий D определяет необходимость вывода содержимого списков событий. Если операнд D указать любым положительным целым числом, например, 1, то списки текущих и будущих событий включаются в стандартный отчет и выводятся.
Если операнд D опущен, то по умолчанию списки в стандартном отчете не выводятся.
Команду START можно сразу указывать в конце программы модели при ее подготовке и в таком виде записывать на магнитный носитель. Тогда после трансляции модели, т. е. создания объекта "процесс моделирования", сразу начинается моделирование. Этот же оператор можно вводить в программу модели в интерактивном режиме.
Однако может возникнуть необходимость завершить моделирование не по истечении какого-то времени, а после обработки определенного количества транзактов, имитирующих, например, изготовленные детали, переданные по каналу связи сообщения и т. д. В этом случае сегмент задания времени моделирования не нужен. Для организации такого способа завершения моделирования необходимо сделать следующее. В блоках TERMINATE, которые выводят из модели транзакты, имеющие смысл тех же изготовленных деталей или переданных сообщений, указать число, на которое уменьшается счетчик завершения моделирования. В команде START также указать число, деление которого на указанное в блоке TERMINATE число даст требуемое количество изготовленных деталей или переданных сообщений. Например, требуется завершить моделирование после изготовления 100 деталей. В модели это может быть так:
. . . TERMINATE 1 . . . TERMINATE 1 . . . TERMINATE START 100
Блоков TERMINATE, которые выводят из модели транзакты, соответствующие изготовленным деталям, может быть несколько. Все эти блоки должны иметь 1 в качестве операнда А. У остальных блоков TERMINATE, если они есть в модели, операнд А должен быть опущен.
Итак, транзакты введены в модель. Но аналоги транзактов - элементы потоков в реальных системах имеют различные характеристики. Рассмотрим, как эти же характеристики присваиваются транзактам.
Каждый транзакт может иметь любое число параметров. Интерпретация смысла параметров произвольная. В момент генерации транзактов все его параметры нулевые (только те, которые используются в модели). Блок ASSIGN является основным средством для задания значений параметров транзактов.
Формат записи:
ASSIGN A,B,[C]
Операндом А задается номер параметра, которому присваивается значение. Операнд А может быть именем, положительным целым числом, выражением в скобках, СЧА, СЧА*параметр и следующими за ними знаками + (если нужно увеличить), - (если нужно уменьшить).
Операнд B определяет значение, которое следует добавить, вычесть или которым следует заменить значение в параметре, заданном операндом А. Если такой параметр не существует, то он создается со значением, равным 0. Операнд B может быть таким же как и операнд А, кроме того, числом и строкой.
Операнд С задает номер модификатора-функции. При использовании операнда С значение операнда B умножается на значение модификатора-функции. Полученное произведение становится значением, которое изменяет значение параметра, заданного операндом А. Следует отметить, что операнд С определяет номер функции или ее имя (не нужно использовать СЧА FN или FN$ перед ним). Если используется СЧА FN, например, FN3, вычисляется функция номер 3

для определения второй функции B. Приведем примеры записи блока ASSIGN:
ASSIGN 1,754.3 ASSIGN 4+,Q5 ASSIGN 3-,5.85,7 ASSIGN Name,"Plan" ASSIGN Tr1-,(Normal(32,Sred,SrOtkl),Expdis
В первом примере параметру 1 присваивается 754.3. Во втором примере к значению параметра 4 прибавляется значение длины текущей очереди номер 5. В третьем примере из значения параметра 3 вычитается произведение 5.85 на вычисленное значение функции номер 7. В четвертом примере параметру с именем Name присваивается строка Plan. В пятом примере вычисляются выражение в скобках и функция с именем Expdis, перемножаются и полученное произведение вычитается из значения параметра с именем Tr1.
В
Блок, обладающий этими свойствами, является блоком SEIZE (занято). Вход транзакта в блок SEIZE моделирует занятие ОКУ.
После обслуживания (блок, имитирующий обслуживание, будет рассмотрен в п. 6.2.3) вход того же транзакта в другой блок моделирует освобождение ОКУ. Назначением этого блока является изменение состояния ранее занятого ОКУ с "занято" в "незанято". Этим блоком является блок RELEASE (освободить).
Форматы блоков:
SEIZE A RELEASE A
В обоих блоках операнд А - это имя занимаемого (освобождаемого) ОКУ. Может быть именем, положительным целым числом, выражением в скобках, СЧА, СЧА*параметр. Планировщик автоматически обеспечивает возникновение транзактов и ОКУ, когда этого требует логика модели. В то время как транзакты находятся в модели временно, ОКУ, используемые в модели, существуют постоянно в течение всего процесса моделирования. Прежде чем освободить ОКУ, транзакт может пройти через неограниченное число блоков. Например:
SEIZE Can . . . RELEASE Can
Если ОКУ с именем Can не занято, активный транзакт занимает его. Если ОКУ занято, транзакт помещается в список задержки данного ОКУ позади транзактов с таким же приоритетом. Этот транзакт не входит в блок SEIZE. Транзакту также отказывается во входе в блок SEIZE, если ОКУ с именем CAN находится в недоступном состоянии (режим недоступности ОКУ рассматривается в п. 4.2).
ОКУ, как уже отмечалось, может иметь имя или номер. В данном случае разрешается записывать вместо операнда А номер непосредственно без предварительного присвоения его имени командой EQU. Например:
SEIZE 5 . . . RELEASE 5
Блоки SEIZE и RELEASE при необходимости создания других версий модели могут переопределяться. Для этого они должны иметь метки (не путайте с операндами А этих блоков).
Обычно транзакт занимает ОКУ для того, чтобы немедленно начать на нем обслуживание, которое длится некоторый промежуток модельного времени. В течение этого времени транзакт должен прекратить двигаться по модели. Только по истечении времени обслуживания он должен попасть в блок RELEASE для освобождения ОКУ.
Для задержки транзакта в течение некоторого интервала модельного времени используется блок ADVANCE. Чаще всего этот интервал задается случайной переменной. Как и при использовании блока GENERATE информация, необходимая для описания соответствующего времени обслуживания и его распределения, задается операндами А и B. Формат записи блока ADVANCE следующий:
ADVANCE A,[B]
Здесь А - среднее время обслуживания, а B - способ модификации операнда А. Каждый из операндов А и B может быть именем, числом, выражением в скобках, СЧА или СЧА*параметр.
Как и в блоке GENERATE, модификаторы могут быть двух типов: модификатор-интервал и модификатор-функция, т. е. блок ADVANCE вычисляет время задержки (приращения модельного времени) такими же способами.
Если задан только операнд А, он вычисляется и используется в качестве времени задержки. Например:
ADVANCE (Normal(12,X$Sredn,X$SreOtk))
Время задержки распределено по нормальному закону со средним значением и среднеквадратическим отклонением, предварительно записанными командой INITIAL в сохраняемые ячейки с именами Sredn и SreOtk соответственно. Для генератора нормального распределения источником случайных чисел, равномерно распределенных в интервале [0, 1], является генератор номер 12.
При задании операндов А и B, и B не определяет функцию, оба операнда вычисляются (если они не константы) и в качестве времени задержки выбирается случайное число, равномерно распределенное в интервале (А-В, А+В). Для розыгрыша может быть выбран любой генератор равномерно распределенных случайных чисел. Делается это так же, как и при выборе генератора для блока GENERATE. Только номер генератора на странице "ADVANCE. По умолчанию используется генератор случайных чисел номер 1. Например
ADVANCE 56.7,23.2
В данном примере входящий транзакт задерживается на время, равномерно распределенное в интервале от 33.5 до 79.9.
Так же, как и в блоке GENERATE, при любых способах вычисления времени задержки значение операнда B не должно превышать значение операнда А. Если в приведенном выше примере операнд B взять равным 56.8, в процессе моделирования произойдет останов по ошибке "Отрицательное приращение времени".
Для задания времени задержки по другому закону, отличному от равномерного, в операнде B записывается модификатор-функция. При обращении к функции определяется некоторое число - значение функции. Оно умножается на значение операнда А. Результат используется как время задержки. Например:
ADVANCE Ring,FN$Exper
В примере вычисляется значение функции с именем Exper и умножается на значение переменной пользователя Ring, которой предварительно должно быть присвоено числовое значение командой EQU.
Как отмечалось ранее, в блоке GENERATE можно использовать функции и арифметические переменные, предварительно определенные командами FUNCTION и VARIABLE или FVARIABLE. Но в этих командах не должны были быть ссылки на параметры транзактов, так как транзактов еще нет. В операндах блока ADVANCE ссылки на параметры транзактов возможны. Естественно, что этим параметрам пользователем должны быть предварительно присвоены соответствующие значения. Например:
ADVANCE P1 ADVANCE (Exponental(7,0,MX$Sred(P2,P$Stolb))) ADVANCE SrIntPost,FN*2
В первом примере транзакт задерживается на время, равное значению параметра 1. Во втором примере время задержки определяется по экспоненциальному закону. При этом среднее значение выбирается из элемента матрицы, номера строки и столбца которого содержатся в параметре 2 и параметре с именем Stolb соответственно. Для генератора экспоненциального распределения источником равномерно распределенных случайных чисел в интервале [0, 1] является генератор номер 7 (RN7).
В третьем примере время задержки находится как произведение значения переменной пользователя SrIntPost и вычисленного значения функции, номер которой содержится в параметре 2 активного транзакта.
Блок ADVANCE никогда не препятствует входу транзакта. Любое число транзактов может находиться в этом блоке одновременно.
Приведем пример использования блоков SEIZE, ADVANCE и RELEASE (см. блок-диаграмму).
Транзакт, войдя в блок SEIZE, займет ОКУ с символическим именем Rем1, задержится там благодаря блоку ADVANCE на 21±7 единиц времени и затем покинет его. После того, как транзакт войдет в блок RELEASE, планировщик попытается продвинуть транзакт в следующий блок модели, и следующий транзакт попытается использовать ОКУ, называемое Rем1.
Блок ADVANCE можно располагать в любых местах модели, а не только между блоками SEIZE и RELEASE.
Время задержки может быть также равным нулю. Если время равно нулю, транзакт в блоке ADVANCE не задерживается и переходит в следующий блок.
GENERATE и ADVANCE позволяют поместить транзакты в список будущих событий. С помощью этих блоков моделируется продолжительность какого-либо события или промежуток времени между наступлением каких-либо событий.Представим себе, что в какой-либо системе, модель которой вы собираетесь разработать, имеются, например, два
В
Формат записи:
GATE X A,[B]

Блок GATE работает в двух режимах:
При работе в режиме отказа блок GATE не пропускает транзакты, если соответствующий объект не находится в требуемом состоянии. Если же поставленное в блоке GATE условие удовлетворяется, то активный транзакт входит в него и затем переходит к следующему по порядку блоку. Операнд А определяет имя или номер ОКУ.
Условие задается одним из следующих условных операторов X, связанных с ОКУ:
NU - ОКУ, заданное операндом А, свободно;
U - ОКУ, заданное операндом А, занято.
Как видно, тип проверяемого объекта неявно задается условным оператором (позже мы рассмотрим применение блока GATE для проверки и других объектов аппаратной категории).
Операнд B содержит номер следующего блока для входящего транзакта, когда условный оператор имеет значение "ложь". Операнды А и B могут быть именем, положительным целым числом, выражением в скобках, СЧА, СЧА*параметр. Если операнд B не используется, то проверка проводится в режиме отказа. Если результат этой проверки не будет "истина", то транзакт помещается в список повторных попыток проверяемого объекта. Когда состояние любого из объектов меняется, заблокированный транзакт снова активизируется, повторяется проверка заданного блоком GATE условия. Если это условие выполняется, транзакту разрешается войти в блок GATE и далее перейти к следующему по порядку блоку. Например:
GATE U Zrk GATE NU (FN$Expert+4) GATE NU Bat,Oper
В первом примере блок GATE не пропустит транзакт при условии незанятости ОКУ с именем Zrk. Во втором случае - когда занято ОКУ, номер которого определяется как результат вычисления и последующего округления выражения в скобках FN$Expert+4. В третьем примере в случае занятости ОКУ с именем Вat транзакт будет направлен к блоку с именем Oper.

Следует отметить, что несмотря на удобство применения блока GATE, в некоторых случаях это может привести при отсутствии операнда B к увеличению машинного времени за счет проведения проверок для заблокированных транзактов. Уменьшение числа проверок и исключение из проверяемых тех транзактов, для которых вряд ли когда-нибудь результат проверки будет истинным, может быть организовано с помощью блоков LINK и UNLINK. Методы применения этих блоков будут рассмотрены позже.
Для проверки состояния различных объектов, в том числе и ОКУ, можно использовать также булевы переменные и блок TEST.
В
Формат записи блока QUEUE следующий:
QUEUE A,[B]
Блок QUEUE увеличивает длину очереди. Операнд А задает номер или имя очереди, к длине которой добавляются единицы.
Операнд B определяет число единиц, на которое увеличивается текущая длина очереди. Если операнд B не используется, то прибавляется единица.
Рассмотрим примеры записи блока QUEUE.
QUEUE RemQ
Увеличивает длину очереди RemQ на единицу при входе каждого транзакта.
QUEUE Р14,Р1
Увеличивает длину очереди, номер или имя которой задан в параметре Р14 транзакта, на число единиц, заданных в параметре Р1.
Формат записи блока DEPART имеет вид:
DEPART A,[B]
Блок DEPART служит для уменьшения длины очереди. Операнд А задает номер или имя очереди, длину которой надо уменьшить. Операнд B задает число единиц, на которое уменьшается длина очереди. Это число не должно превышать текущую длину очереди. Если операнд B не используется, то по умолчанию длина очереди уменьшается на 1. Операнды А и B в блоках QUEUE и DEPART могут быть именем, положительным целым числом, выражением в скобках, СЧА или СЧА*параметр.
Приведем примеры записи блока DEPART.
DEPART RemQ
Уменьшает длину очереди RemQ на единицу. DEPART V3,(V4+3.7)
Операнды А и B заданы арифметической переменной V3 и выражением в скобках, которое также содержит арифметическую переменную V4. При входе транзакта в блок DEPART переменная и выражение в скобках вычисляются и округляются. После этого длина очереди, номер которой есть значение переменной V3, уменьшается на значение выражения в скобках (V4+3.7).
Очереди, как и ОКУ, разрешается записывать вместо операнда А номер без предварительного присвоения его имени командой EQU. Например:
QUEUE 5 … DEPART 5
Рассмотрим использование блоков QUEUE и DEPART в модели на примере представленной блок-диаграммы. Ожидание может возникнуть ввиду занятости ОКУ с именем Rem1. Для сбора статистики об ожидании введем регистратор очереди и дадим ему имя RemQ.
Если транзакт вошел в сегмент в момент, когда ОКУ Rem1 не занято, транзакт входит в блок QUEUE. Далее транзакт пытается войти в блок SEIZE и, поскольку Rem1 свободно, эта попытка оказывается успешной. Состояние Rem1 меняется на "занято", и далее транзакт сразу попадает в блок DEPART. Выполняется соответствующая подпрограмма и транзакт попадает в блок ADVANCE, где задерживается на некоторое время, вычисленное в соответствии с распределением $$21\pm 7$$.
Предположим теперь, что ОКУ Rem1 находится в занятом состоянии и следующий транзакт входит в сегмент модели. Он проходит в блок QUEUE и получает далее отказ, поскольку Rem1 находится в занятом состоянии. Транзакт перестает двигаться, оставаясь в блоке QUEUE.
Позднее, когда транзакт, находящийся на обслуживании в устройстве, покидает его, ожидающий транзакт опять попытается войти в блок SEIZE. На этот раз попытка окажется успешной. Двигаясь дальше, транзакт войдет в блок DEPART, уменьшая значение счетчика содержимого очереди на 1 (по умолчанию, так как операнд B не используется).
Длина очереди не может быть отрицательной. Если такое произойдет, происходит останов по ошибке "Запрещенная попытка сделать содержимое очереди отрицательным".
Останов по ошибке "Недопустимое отрицательное число в операторе
Например:
QUEUE Server,3
Для получения плотности распределения, ее интегральных относительных частот, среднего значения и стандартного отклонения некоторых аргументов, которыми могут быть СЧА (например, времени нахождения транзакта в модели или задержки в ее отдельных частях, длин очередей, содержимого МКУ, коэффициентов использования устройств и т. д.), используются статистические таблицы TABLE и QTABLE.
Команда описания таблицы TABLE имеет следующий формат:
Name TABLE A,B,C,D
Команда определяет аргумент, а также число и ширину частотных интервалов (классов). Метка Name определяет имя таблицы.
Операндом А задается аргумент таблицы - элемент данных, чье частотное распределение будет табулироваться. Операнд может быть именем, выражением в скобках или СЧА.
Операндом B задается верхний предел первого частотного интервала.
Операнд С задает ширину частотного интервала - разницу между верхней и нижней границей каждого частотного класса.
Операнды B и С могут быть числами или strinq.
Операндом D задается число частотных интервалов (положительное целое число).
Для сбора данных транзакт должен войти в блок TABULATE с тем же именем таблицы, которое определено в блоке TABLE. Блок помещается в ту точку модели, которая соответствует исследуемому объекту.
Блок имеет следующий формат:
TABULATE A,[B]
Операндом А задается имя таблицы, в которую табулируется значение аргумента.
Операндом B ( весовой коэффициент ) задается число единиц, которые должны быть занесены в тот частотный интервал, в который попало значение аргумента. Если операнд B отсутствует, то по умолчанию эта величина равна 1.
Операнды А и B могут быть именем, выражением в скобках, СЧА или СЧА*параметр. Кроме того, операнд А может быть только положительным целым числом, а операнд B - положительным числом. Например,
VrRem TABLE P$ReaLvs,8.2,5.5,10
. . .
TABULATE VrRem
Оператором TABLE описывается таблица с именем VrRem. Аргументом таблицы является СЧА P$ReaLvs с верхним пределом первого интервала 8.2, шириной 5.5 и числом интервалов 10. Каждое значение табулируемого аргумента P$ReaLvs, меньшее или равное 8.2, увеличивает частоту первого частотного класса таблицы на 1. Если аргумент таблицы не попадает в первый частотный класс, класс определяется делением значения аргумента на операнд С оператора TABLE. Например, значение P$ReaLvs равно 30.25. Тогда 30.25/5.5=5.5 и будет увеличена на 1 частота шестого класса.
Если аргумент A таблицы больше B+C#D=8.2+5.5#10= =63.2, изменен будет на 1 последний (десятый) класс. Одновременно корректируются текущие значения СЧА таблицы: счетчик входов в таблицу ТС, среднее время ожидания ТВ и стандартное отклонение времени ожидания TD. Собранная в таблице статистика выводится в стандартный отчет.
При использовании в операнде B блока весового коэффициента, например:
TABULATE VrRem,3
последний будет добавляться к значению частоты частотного класса. Весовой коэффициент применяется также для среднего и стандартного отклонения, что равносильно нескольким входам в блок .
Таким образом, команда TABLE вместе с блоком служат для табулирования любого СЧА.
Кроме таблиц TABLE могут использоваться Q -таблицы, являющиеся средством получения распределения только времени пребывания транзакта в очереди. Формат команды описания Q -таблицы такой же, как и TABLE. Отличие состоит в том, что операндом А задается имя очереди. Назначение операндов B, С, D такое же, что и в команде описания TABLE. Операнд B может быть нулем или положительным числом. Для создания в модели такой таблицы ее нужно предварительно определить с помощью команды QTABLE формата:
Name QTABLE A,B,C,D
Например:
VTime QTABLE Dlina,18.2,4.3,6
Dlina - имя очереди к устройству, а не СЧА, как в случае использования TABLE.
При прохождении транзакта через блоки QUEUE и DEPART его время ожидания фиксируется, и к счетчику частотного интервала таблицы, в который попало это время, добавляется 1. Одновременно в таблице накапливается информация для вычисления среднего значения и среднеквадратического отклонения времени ожидания. Следует обратить внимание, что при использовании QTABLE информация в таблицу заносится автоматически при входе транзакта в блоки QUEUE и DEPART и никаких специальных мер, т. е. блока , при этом не требуется.
По окончании моделирования собранная в таблице информация также выводится в стандартном отчете
Для изменения маршрутов движения транзактов в модели применяются блоки , LOOP, GATE, TEST и TRANSFER. Здесь мы рассмотрим методы применения блоков TRANSFER и .
Блок TRANSFER (передать) предназначен для передачи входящего в него транзакта в любой другой блок модели. Он имеет следующий формат:
TRANSFER [A],[B],[C],[D]
Все режимы блока TRANSFER, кроме безусловного, выборочные, т. е. отличаются друг от друга способом выбора очередного блока, к которому должен быть направлен активный транзакт. Операнд А задает этот режим выбора. Существуют следующие девять режимов работы блока TRANSFER:
ALL - последовательный выбор одного из нескольких блоков;PICK - выбор случайным образом одного из нескольких блоков;FN - функциональный;P - параметрический;SBR - подпрограммный;SIM - одновременный.Операнд А может принимать указанные выше значения, а также может быть именем, положительным целым числом, выражением в скобках, СЧА, СЧА*параметр.
Операнды B и С задают возможные значения номеров следующих блоков или их положение. Они могут быть такими же, как и операнд А. Использование этих значений будет описано ниже при рассмотрении указанных выше режимов работы. Если операнд B опущен, то планировщик записывает вместо него номер блока, следующего за блоком TRANSFER.
Рассмотрим режимы безусловной передачи и статистической передачи блока TRANSFER, как наиболее часто используемые в моделях.
Режим безусловной передачи. B режиме безусловной передачи операнд А не используется. Операнд B указывает имя блока, в который транзакт должен попытаться войти. Блок TRANSFER не может отказать транзакту во входе.
Например:
TRANSFER ,Oper
После входа транзакт сразу же пытается войти в блок с меткой Oper. Если этот блок отказывает во входе, транзакт остается в блоке TRANSFER.
Рассмотрим еще один пример использования безусловного режима блока TRANSFER. Пусть требуется поток обслуженных транзактов перед удалением из модели разделить на четыре составляющие. Первый параметр каждого транзакта имеет одно из четырех присвоенных ранее значений: 1, 2, 3 или 4. Вначале для разделения потока используем блок TEST.
. . .
TEST E P1,1,Met2
Met2 TERMINATE
TEST E P1,2,Met3
TERMINATE
Met3 TEST E P1,3,Met4
TERMINATE
Met4 TERMINATE

Теперь этот же фрагмент модели перепишем с использованием блока TRANSFER.
. . .
Met1 TRANSFER ,(Met1+P1)
TERMINATE
TERMINATE
TERMINATE
TERMINATE
В блоке TRANSFER в качестве операнда B указано выражение в скобках. При входе активного транзакта выражение вычисляется, т. е. к номеру, который присвоен планировщиком блоку с меткой Met1, прибавляется значение первого параметра. В итоге получается номер блока, к которому и направляется транзакт.
Режим статистической передачи. Когда операнд А используется и не является зарезервированным словом, блок TRANSFER работает в
Значение операнда А, записываемого после точки, рассматривается как трехзначное число, показывающее (в долях от тысячи), какая доля входящих в блок транзактов должна быть направлена в блок С. Остальные транзакты направляются в блок B или к следующему по номеру блоку, если операнд B опущен.
Числовое значение операнда А может быть задано любым СЧА. При этом возможны следующие случаи:
А меньше или равно нулю;А равно или больше 1 000 ;А больше нуля, но меньше 1 000.Если вычисленное значение операнда А меньше или равно нулю, то будет производиться безусловная передача транзакта к блоку B. Если значение операнда А больше или равно 1 000, то будет осуществляться безусловная передача транзакта к блоку С. В третьем случае блок TRANSFER работает в обычном режиме.
Например:
TRANSFER .P5,,Rrw
Трехзначное число, записанное в параметре 5 транзакта, входящего в блок TRANSFER, интерпретируется как вероятность (в долях от тысячи) того, что транзакт будет передаваться блоку Rrw, а в остальных случаях - следующему блоку, так как операнд B не используется.
Режим статистической передачи удобно использовать, например, в таких случаях. При моделировании работы цеха по производству деталей известно, что 12,5% изготовленных деталей бракуется. В модели это можно реализовать так:
. . . TRANSFER .125,Sam,Wzw . . .
Транзакты, имитирующие изготовленные в цехе детали, в 12,5% случаев будут направлены к блоку с
меткой Wzw, а в остальных 87,5% случаях - к блоку с меткой Sam.
Можно указать генератор - источник случайных чисел. Для этого нужно выбрать Edit/Settings ( Правка/Настройки ). Затем выбрать страницу Random Numbers ( Случайные числа ) и ввести номер генератора в поле ввода, отмеченное TRANSFER. После инсталляции по умолчанию используется генератор номер 1.
Блок DISPLACE предназначен для нахождения любого тран-закта и перемещения его к новому блоку. Блок имеет формат:
DISPLACE A,B,[C],[D]
Операнд А - номер транзакта, который нужно переместить.
Операнд B - метка блока, к которому перемещается транзакт, указанный операндом А.
Операнд С - номер параметра перемещаемого транзакта, в который записывается оставшееся до конца его обслуживания время, если он находился в списке будущих событий.
Операнд D - метка альтернативного блока для транзакта.
Операнды А, B, С и D могут быть именем, положительным целым числом, выражением в скобках, СЧА или СЧА*параметр. Например:
DISPLACE (P2+32),Term3,Ostatok,Met2
Операнд А указан выражением в скобках. Это выражение вычисляется и округляется до целого. Полученный результат является номером транзакта, который следует переместить. Далее блок отыскивает этот транзакт. При этом возможны случаи:

Term3. Во втором случае определяется время, оставшееся до его повторного ввода в процесс моделирования, и записывается в параметр с именем Ostatok. Если параметра с таким именем нет, он создается. Транзакт также перемещается к блоку с меткой Term3. В третьем случае, т. е. когда в модели нет транзакта с нужным номером, активный транзакт, вошедший в блок , направляется к блоку с меткой Met2. Если операнда D нет, активный транзакт переходит к следующему блоку.
Когда транзакт перемещается к новому блоку, он исключается из списков:
При перемещении прерванные выполнения в устройствах не сбрасываются.
Это означает, что перемещаемый транзакт продолжает занимать устройство. Следовательно, если необходимо, нужно освободить устройство.
Пример использования блока приведен в п. 6.8.2.
Если на входе ОКУ образуется очередь, выбор транзакта для ОКУ занятия после его освобождения происходит:
Е блока GENERATE.При этом очередной транзакт с большим приоритетом ждет окончания обслуживания предыдущего транзакта независимо от его приоритета. Приоритет учитывается только в образующейся очереди. В ней транзакты выстраиваются в приоритетном порядке.
Такой режим функционирования ОКУ организуется блоками SEIZE и RELEASE, рассмотренными в п. 6.2.2.
Однако может возникнуть необходимость смоделировать ситуацию, когда очередной транзакт должен занять ОКУ, прервав обслуживание предыдущего транзак-та. Такое прерывание называется "захватом" ОКУ и моделируется блоком PREEMPT (захватить). Формат блока:
PREEMPT A,[B],[C],[D],[E]
Операнд А - имя или номер захватываемого ОКУ.
Когда ОКУ свободно (см. блок-диаграмму), блок PREEMPT работает также, как и блок SEIZE.
При занятом ОКУ блок PREEMPT функционирует либо в приоритетном режиме, либо в режиме прерывания. Режимы определяются операндом B:
PR - приоритетный;B не используется) - режим прерывания.В приоритетном режиме прервать обслуживание предыдущего (обслуживаемого) транзакта, т. е. "захватить" ОКУ, может только транзакт с большим приоритетом. Если приоритет претендующего на занятие ОКУ транзакта равен или ниже приоритета обслуживаемого транзакта, он помещается в список задержки ОКУ последним в своем приоритете.
Что делать с транзактом, обслуживание которого прерывается? Это определяют операнды С, D и Е.
Операнд С - имя или номер блока, куда должен быть направлен прерванный транзакт.
Операнд Е при значении RE определяет режим удаления прерванного транзакта.

Операнд D - номер параметра прерванного транзакта, в который записывается оставшееся до завершения обслуживания время.
Операнды А, С, D и Е могут быть именем, положительным целым числом, выражением в скобках, СЧА или СЧА*параметр.
Транзакт, захвативший ОКУ, освобождает его от захвата вхождением в блок RETURN.Формат блока:
RETURN A
Операнд А - имя или номер освобождаемого ОКУ. Например:
RETURN Rem1
Освободить от захвата ОКУ Rem1.
Применение блоков PREEMPT и RETURN показано в п. 6.5.5.
В режиме "захвата", если ОКУ уже используется, активный транзакт помещается в список отложенных прерываний или "захватывает" ОКУ. Прерывание обслуживания сразу, а не помещение транзакта в список, происходит тогда, когда список отложенных прерываний пуст и обслуживаемый транзакт сам не является "захватчиком".
Транзактам из списка отложенных прерываний предоставляется право занять ОКУ ранее, чем прерванным транзактам или транзак-там из списка задержки ОКУ.
Проверка состояния ОКУ в приоритетном режиме может проводиться блоком GATE, а также с использованием булевой переменной и блока TEST.
Рассмотрим проверку состояния ОКУ блоком GATE.
Условие проверки задается одним из следующих условных операторов Х:
I - ОКУ, заданное операндом А, прервано;NI - ОКУ, заданное операндом А, не прервано.Например:
GATE I Stan GATE NI (V$Rasp-3) GATE I Print,Udal GATE I *1
В первом примере блок GATE пропустит транзакт, когда ОКУ Stan будет прервано. Во втором примере транзакт пройдет к следующему блоку, когда не прервано ОКУ, номер которого определяется как результат вычисления и последующего округления до целого выражения в скобках ( V$Rasp-3 ). В третьем примере в случае прерывания ОКУ Print транзакт будет направлен к блоку с меткой Udal.
В первом и втором примерах блок GATE работает в режиме отказа во входе в случае невыполнения условия. Здесь также остается справедливым замечание, сделанное в п. 6.2.4: отсутствие операнда В может привести к увеличению машинного времени моделирования. Однако в некоторых случаях такой режим, наверное, можно использовать.
Для моделирования неисправностей ОКУ и других ситуаций в PREEMPT ). Однако при этом транзакты, вызывающие прерывания (имитирующие отказы ОКУ), учитываются в статистике, как и транзакты, обслуженные при исправном функционировании ОКУ. А это неправильно, вследствие чего и искажается статистика ОКУ.
Недоступность ОКУ моделируется блоком FUNAVAIL (символ F означает ОКУ, - недоступный). При использовании этого блока статистика ОКУ не искажается.
Формат блока:
FUNAVAIL A,[B],[C],[D],[E],[F],[G],[H]
Блок делает недоступным ОКУ с именем или номером, указываемым операндом А (см. блок-диаграмму).
Все транзакты, обрабатываемые блоком FUNAVAIL, разделяются на три класса, которые и определяют назначение операндов:
SEIZE или PREEMPT ) в момент перевода его в недоступное состояние (операнды B, C, D );E, F );G, H ).Операндом B задаются режимы обработки транзакта, занимающего ОКУ в момент перевода его в недоступноcть:
СО - режим продолжения: продолжить обработку занимающего ОКУ транзакта во время недоступности;RE - режим удаления: удалить и направить занимающий ОКУ транзакт к блоку, метка которого должна быть указана операндом С;Операнд С - метка блока, в который будет направлен в режиме удаления транзакт, занимавший ОКУ в момент перевода его в недоступное состояние.
Операнд D - номер или имя параметра транзакта, занимавшего ОКУ в момент перевода его в недоступное состояние; если он будет удален (режим RE ), т. е. исключен из СБС, в этот параметр будет записано время, оставшееся удаленному транзакту до конца обслуживания.
Операндом Е задаются режимы обработки транзактов, находящихся к моменту перевода ОКУ в недоступное состояние в списке прерываний, т. е. тех транзактов, обслуживание которых на данном ОКУ было ранее прервано:
СО - режим продолжения: продолжить работу ОКУ во время недоступности - обслуживать транзакты из списка прерываний;RE - режим удаления: удалить и направить транзакты из списка прерываний к новому блоку, метка которого должна быть указана операндом F ;
Операнд F указывает метку блока, к которому будут направлены транзакты из списка прерываний ОКУ, из-за чего они не могут находиться в СБС, поэтому для них нет возможности занесения в их параметры времени, оставшегося до конца обслуживания.
Операнд F может использоваться и тогда, когда отсутствует операнд E (по умолчанию). В этом случае для перемещенных к новому блоку транзактов прерывание обслуживания сохраняется.
Операндом G задаются режимы обработки транзактов, находящихся к моменту перевода ОКУ в недоступное состояние в списке отложенных прерываний, т. е. ожидающих выполнения с прерыванием, и в списке задержки:
СО - режим продолжения: продолжить работу ОКУ во время недоступности - обслуживать транзакты из списка отложенных прерываний и списка задержки;RE - режим удаления: удалить и направить транзакты из списка отложенных прерываний и списка задержки к новому блоку, метка которого должна быть указана операндом H ;Операндом H указывается метка нового блока, к которому в режиме удаления ( RE ) направляются транзакты из списка отложенных прерываний и списка задержки. Когда операнд G не используется, нельзя использовать и операнд H.
Недоступность ОКУ сохраняется до тех пор, пока транзакт, вызвавший переход в недоступное состояние, не войдет в блок
FAVAIL A
Блок FAVAIL изменяет состояние ОКУ на доступное, т. е. восстанавливает обычный режим вхождения транзактов в ОКУ. Все транзакты, ожидающие доступного состояния ОКУ, указанного операндом А, активизируются и могут попытаться занять его.
Применение блоков FUNAVAIL и FAVAIL показано в п. 6.7.5.
B …Н относятся только к транзактам указанных ранее трех классов. Другие транзакты, которые пытаются прервать ОКУ, уже находящееся в недоступном состоянии, в эти классы не входят и операнды B …Н не имеют к ним никакого отношения.Проверка состояния ОКУ в режиме недоступности проводится блоком GATE. Формат блока см. п. 6.2.4.
Условие проверки задается одним из следующих условных операторов Х:
FNV - ОКУ, заданное операндом А, недоступно ;
FV - ОКУ, заданное операндом А, доступно.
Например:
GATE FNV Stan GATE FV (FN$Rasp-X$Col) GATE FNV Print,Udal
В первом примере блок GATE пропустит транзакт, когда ОКУ Stan будет недоступно.
Во втором примере транзакт пройдет к следующему блоку, когда доступно ОКУ, номер которого определяется как результат вычисления и последующего округления до целого выражения в скобках (FN$Rasp-X$Col).
В третьем примере в случае доступности ОКУ Print, т. е. не выполнения заданного в блоке GATE условия, транзакт будет направлен к блоку с меткой Udal.
В первом и втором примерах блок GATE работает в режиме отказа, если условия не выполняются. Здесь также остается справедливым замечание, сделанное в п. 6.2.4: отсутствие операнда В может привести к увеличению времени моделирования.
При движении по модели транзакты могут быть заблокированы, например, как отмечалось ранее, при проверке состояния ОКУ блоками GATE и TEST. Если заблокированные транзакты находятся в списке текущих событий (СТС), то при большом их количестве планировщик расходует много времени на просмотр СТС с целью выбора очередного транзакта для продвижения.
Для экономии машинного времени заблокированные транзакты целесообразно помещать в списки пользователя и оставлять их там до тех пор, пока не будут выполнены условия, позволяющие дальнейшее продвижение этих транзактов. Кроме того, этим предоставляется возможность организовать различные дисциплины очередей, отличающиеся от дисциплины FIFO, реализованной в списке текущих событий.
Список пользователя представляет собой некоторый буфер, в который могут временно помещаться транзакты, выведенные из СТС. В отличие от списков текущих и будущих событий тран-закты вводятся в список пользователя и выводятся из него не автоматически, а по решению пользователя в соответствии с логикой модели при помощи специальных блоков.
Для ввода транзактов в список пользователя служит блок LINK (ввести в список), который может быть использован в режимах:
В безусловном режиме, блок LINK имеет формат записи: [имя] LINK A,B
Операндом А задается имя или номер списка пользователя, в который безусловно помещается транзакт, вошедший в блок LINK.
Операнд B определяет, в какое место списка пользователя следует поместить вошедший транзакт. Допустимые значения:
FIFO - транзакт помещается в конец списка;LIFO - транзакт помещается в начало списка;PR - транзакты помещаются по убыванию приоритета;Р - транзакты помещаются позади тех транзактов, значения соответствующего параметра которых меньше (в порядке возрастания значения параметра);М1 - транзакты помещаются в порядке возрастания относительного времени их пребывания в модели.
В качестве операнда B могут использоваться и другие СЧА, кроме указанных ранее СЧА транзактов: арифметическая переменная, функция, а также выражение в скобках. В этом случае выполняется вычисление указанного операндом B для активного транзакта и для всех остальных транзактов, уже находящихся в списке пользователя, начиная с начала очереди. После этого производится упорядочивание транзактов в списке пользователя по убыванию вычисленного значения. Например, блок
LINK 3,FIFO
помещает транзакты в конец списка пользователя с номером 3 в порядке их поступления в блок. Блок
LINK Otst,P$Pol
помещает транзакты в список пользователя с именем Otst, упорядочивая их по возрастанию значения параметра с именем .
Условия, при которых транзакт помещается в список пользователя, в безусловном режиме проверяются средствами, предусмотренными разработчиком модели. Например, направить транзакт в список пользователя в случае занятости ОКУ можно так, как показано ниже.
. . .
GATE NU Rem1,Wait
SEIZE Rem1
. . .
Wait LINK Otst,FIFO
. . .
Если ОКУ Rem1 занято, блок GATE не впускает транзакт в блок SEIZE, а направляет его в блок LINK с именем Wait, и тран-закт вводится в конец списка пользователя с именем Otst.
В том же фрагменте модели список пользователя можно разместить и иначе.
. . .
GATE U Rem1,Met1
LINK Otst,FIFO
Met1 SEIZE Rem1
. . .
Здесь ОКУ Rem1 проверяется на занятость. Если ОКУ занято, транзакт проходит к следующему блоку LINK и помещается в список пользователя с именем Otst. В случае незанятости ОКУ, транзакт направляется к блоку SEIZE с меткой Met1 и занимает свободное ОКУ.
В только что рассмотренных примерах предполагается, что список пользователя неограничен, т. е. в него может помещаться любое количество транзактов. При моделировании реальных систем список пользователя может использоваться для имитации, например, входного накопителя, емкость которого, как правило, ограничена. Это ограничение можно реализовать следующим образом.
Emk EQU 10
. . .
GATE NU Rem1,Wait
SEIZE Rem1
. . .
Wait TEST L CH$Otst,Emk,Term1
LINK Otst,LIFO
Если ОКУ Rem1 занято, то блок GATE не впускает транзакт в блок SEIZE, а направляет его в блок TEST с меткой Wait, находящийся перед блоком LINK. Если текущее содержимое списка пользователя с именем Otst меньше заданной емкости Emk, тран-закт проходит в список пользователя, в противном случае направляется к блоку с меткой Term1.
Приведем еще возможный вариант этого же фрагмента модели.
Emk EQU 10
. . .
GATE U Rem1,Met1
TEST L CH$Otst,Emk,Term1
LINK Otst,LIFO
Met1 SEIZE Rem1
Если ОКУ Rem1 занято, блок GATE пропускает транзакт к блоку TEST. Если текущее содержимое списка пользователя с именем Otst меньше заданной емкости Emk, транзакт проходит в список пользователя, в противном случае направляется к блоку с меткой Term1. Если ОКУ незанято, транзакт направляется к блоку SEIZE с меткой Met1 и занимает свободное ОКУ Rem1.
Для вывода одного или нескольких транзактов из списка пользователя и помещения их обратно в список текущих событий служит блок UNLINK (вывести из списка), имеющий следующий формат:
[имя] UNLINK X A,B,C,[D],[E],[F]
Операндом А указывается имя или номер списка пользователя.
Операнд B - метка блока, в который переходят выведенные из списка пользователя транзакты.
Операндом С указывается число выводимых транзактов или ключевое слово ALL для вывода всех находящихся в списке транзактов. По умолчанию, т. е. когда не используется операнд С, берется слово ALL.
Операнды D и E вместе с условным оператором Х определяют способ и условия вывода транзактов из списка пользователя. Значения оператора Х те же, что и в блоке TEST. В случае, когда условный оператор Х должен использоваться, но не указан, по умолчанию он принимает значение Е (равенство). Если операнды D и Е не используются, не указывается и условный оператор Х. В этом случае транзакты выводятся с начала списка, а количество выводимых транзактов определяется обязательным операндом С.
Операнд D может быть:
BACK.Если операнд D является булевой переменной, операнд Е и оператор Х не используются. Булева переменная вычисляется относительно транзакта, находящегося в списке пользователя. Если результат не нуль, т. е. условие вывода выполняется, транзакт выводится. Количество выводимых транзактов определяется операндом С. Однако выведено может быть и меньше, чем указано операндом С: по числу не нулевых результатов вычисления булевой переменной. Кроме того и транзактов в списке пользователя может быть меньше, чем указано операндом С.
Если операндом D указано ключевое слово BACK, также операнд Е и условный оператор Х не используются, а транзакты выводятся с конца списка в количестве, определяемом обязательным операндом С.
Если операнд D не булева переменная и не ключевое слово BACK, должны быть указаны операнд Е и условный оператор Х. Операнд D вычисляется относительно транзакта, находящегося в списке пользователя, и используется в качестве номера параметра, значение которого сравнивается с результатом вычисления операнда Е.

Если операнд D задает параметр, а операнд Е не используется, значение параметра транзакта из списка пользователя сравнивается со значением такого же параметра выводящего транзакта. Если они равны, транзакт выводится из списка пользователя. И в этом случае количество выводимых транзактов определяется операндом С.
Операндом F указывается имя блока, куда переходит транзакт, выходящий из блока UNLINK, если из списка пользователя не выведен ни один транзакт. Если операнд F не используется, выходящий транзакт переходит в следующий блок независимо от количества выведенных транзактов.
Например, блок
UNLINK 4,Apd,1
выводит из списка пользователя с номером 4 один транзакт с начала списка и направляет его в блок с меткой Apd. Блок
UNLINK Otst,Mars,1,BACK
выводит из списка пользователя с именем Otst один транзакт с конца списка и направляет его в блок с меткой Mars. Блок
UNLINK E P$Wiw,App1,ALL,App2,P$App2,App3
выводит из списка пользователя, номер которого записан в параметре Wiw выводящего транзакта, и направляет в блок с меткой App1 все транзакты, содержимое параметра App2 которых равно содержимому одноименного параметра выводящего транзакта. Если таких параметров в списке не окажется, выводящий транзакт будет направлен в блок с меткой Аpp3, в противном случае - к следующему блоку.
Примеры применения списков пользователя (блоков LINK и UNLINK ) показаны в п. 6.3 и 6.7.
UNLINK. Во-первых, если операнды D и Е содержат ссылки на СЧА транзактов, операнд D вычисляется относительно транзак-тов в списке пользователя, а операнд Е - относительно активного транзакта. Во-вторых, после вывода транзактов из списка пользователя планировщик продолжает или начинает продвижение тран-закта с наивысшим приоритетом, а при равенстве приоритетов отдает предпочтение транзакту-инициатору вывода, т. е. первым выводит этот транзакт.Два или более обслуживающих устройств могут быть промоделированы на
Однако часто различные параллельно работающие устройства являются однородными.
МКУ определяется до его использования командой STORAGE. Формат команды:
Name STORAGE A
Name - имя МКУ. Символическому имени может быть поставлен в соответствие номер командой EQU. Это необходимо, если требуется обращаться к нескольким МКУ в блоках SELECT и COUNT или в других случаях. Операнд А может быть только целым положительным числом. Иные способы задания емкости вызывают ошибку.
В модели можно организовать функционирование МКУ в двух режимах:
Занятие и освобождение МКУ имитируется блоками ENTER (войти) и LEAVE (выйти). Форматы блоков:
ENTER A,[B] LEAVE A,[B]
Операнд А в обеих блоках используется для указания имени, соответствующего МКУ. Операнд B задает число устройств (элементов памяти), которое должно быть занято в блоке ENTER или освобождено в блоке LEAVE. По умолчанию операнд В = 1. При В = 0 блок считается неработоспособным.
Когда транзакт входит в блок ENTER, операнд А используется для нахождения МКУ с указанным именем. Если такого МКУ нет, происходит останов по ошибке "Обращение к несуществующей памяти". Если МКУ существует и задан операнд B, он вычисляется, округляется до целого и полученный результат используется для оценки свободной емкости. Транзакт может войти в блок ENTER, если МКУ находится в доступном состоянии и достаточно емкости для выполнения запроса. В противном случае транзакт помещается в список задержки устройства в соответствии с приоритетом.
Когда транзакт входит в блок ENTER (см. блок-диаграмму), планировщик выполняет следующие действия:
B (по умолчанию на 1 ) текущее содержимое МКУ;B (по умолчанию на 1 ) доступную емкость МКУ.Если транзакт при входе в блок ENTER запрашивает больше устройств (элементов памяти), чем определено командой STORAGE, т. е. ее операнд А меньше операнда B блока ENTER, возникает ошибка "Запрос элементов памяти превышает ее общую емкость".
МКУ никогда не может быть удалено из текущей модели, даже если команда STORAGE удаляется из рабочей программы. МКУ можно переопределить, т. е. изменить емкость другой командой STORAGE с тем же самым именем. Например:
Batr STORAGE 18
Повторное описание:
Batr STORAGE 24
Имитация обслуживания транзакта в течение какого-то промежутка времени также осуществляется блоком ADVANCE.

Пример 1.
Nak STORAGE 20
. . .
ENTER Nak,2
ADVANCE 120,40
LEAVE Nak,2
. . .
Командой STORAGE определяется МКУ с именем емкостью 20 единиц. При входе транзакта в блок ENTER занимается 2 единицы и столько же освобождается в блоке LEAVE при выходе из МКУ.
Пример 2.
Nak STORAGE 20 . . . ENTER Nak,21 ADVANCE 120,40 LEAVE Nak,2 . . .
При входе транзакта в блок ENTER произойдет останов по ошибке, так как транзакт будет пытаться занять больше каналов (21), чем определено (20) командой STORAGE. То же самое произойдет, если при выходе из блока LEAVE транзакт будет пытаться освободить каналов больше, чем определено командой STORAGE.
Пример 3.
Pun1 EQU 1 Pun2 EQU 2 Pun3 EQU 3 Pun1 STORAGE 6 Pun2 STORAGE 5 Pun3 STORAGE 3 . . . ENTER *1 ADVANCE MX$NorVr(P2,P3) LEAVE *1 . . .
В данном примере определены три МКУ с именами Pun1, Pun2, Pun3 и емкостями 6, 5 и 3 соответственно. Именам командами EQU поставлены в соответствие номера 1, 2 и 3.
Предполагается, что при входе транзакта в блок ENTER в его первом параметре (ссылка *1) содержится какой-либо один из трех номеров. Согласно этому номеру и занимается МКУ, а затем освобождается. Операнд B в блоках ENTER и LEAVE не используется, поэтому транзактом занимается и освобождается одна единица емкости МКУ.
Ранее (см. табл. 6.1) для МКУ был употреблен термин "память". Это связано с тем, что блоки ENTER и LEAVE могут быть использованы для имитации функционирования запоминающих устройств, например, оперативного или внешних устройств памяти. В этом случае в качестве операнда B этих блоков может быть использован один из параметров транзакта, имитирующего, например, сообщение, содержащий количество занимаемых (освобождаемых) ячеек памяти. Пример такого использования блоков ENTER и LEAVE приведен в 6.7.5.
Недоступность МКУ моделируется блоком SUNAVAIL (символ S означает МКУ, - недоступный). Формат блока:
SUNAVAIL A
Операнд А - имя или номер МКУ, может быть именем, положительным целым числом, выражением в скобках, СЧА, СЧА*параметр.
Например:
SUNAVAIL Batr
Когда транзакт входит в этот блок, МКУ Batr становится недоступным. Если при переводе в недоступное состояние в МКУ находились транзакты, т. е. текущее содержимое МКУ не равнялось нулю, то обслуживание этих транзак-тов продолжается, пока текущее содержимое не станет равным нулю.
Транзакты, которые пытаются занять МКУ во время нахождения его в недоступном состоянии, не входят в блок ENTER и помещаются в список задержки МКУ.
Нахождение в недоступном состоянии продолжается до тех пор, пока транзакт не войдет в блок SAVAIL.
Формат блока:
SAVAIL A

Операнд А - имя или номер МКУ. Может быть таким же, как операнд А в блоке SUNAVAIL.
Если в момент перевода МКУ в доступное состояние в его списке задержки были транзакты, им предоставляется возможность занять МКУ в соответствии с дисциплиной "first-fit-with-skip" (первый подходящий с пропусками).
Транзакты, которым будет отказано в занятии МКУ, остаются в его списке задержки.
SUNAVAIL и SAVAIL невозможна. Такая имитация возможна с использованием блока DISPLACE (см. п. 6.8.2).Состояние МКУ, как и состояние ОКУ, проверяется блоком GATE такого же формата
GATE X A,[B]
Отличие состоит в значениях условного оператора Х, которые могут быть следующими:
SE - МКУ, заданное операндом А, пусто;SF - МКУ, заданное операндом А, заполнено;SNE - МКУ, заданное операндом А, не пусто;SNF - МКУ, заданное операндом А, не заполнено;SNV - МКУ, заданное операндом А, не доступно;SV - МКУ, заданное операндом А, доступно. Блок GATE также работает в двух режимах:Например:
GATE SNF Can,Met5
Если МКУ с именем Can не заполнено, т. е. имеются свободные каналы (элементы памяти), заданное в блоке GATE условие выполняется, и транзакт будет направлен к следующему блоку. Если МКУ заполнено, транзакт будет направлен к блоку с меткой Met5.
Блок GATE позволяет только определить состояние не заполненности МКУ, т. е. наличие свободных каналов, но достаточно ли их для удовлетворения запроса, он не определяет.
Для проверки состояния МКУ могут также использоваться булева переменная и блок TEST [5]. Их использование позволяет расширить возможности по осуществлению проверок состояния, а также сократить машинное время, так как в одном блоке с помощью булевой переменной может проверяться сразу несколько условий.
Для моделирования такого оборудования как переключатели, имеющие только два состояния, в
ON или 1 );OFF или 0 ). В зависимости от состояния ключа изменяется направление движения транзактов.Логический ключ моделируется блоком LOGIC. Формат блока:
LOGIC X A
Операнд А - имя или номер логического ключа. Может быть именем, положительным целым числом, выражением в скобках, СЧА или СЧА*параметр.
Логический оператор Х - состояние логического ключа устанавливается в зависимости от следующих его значений:
S - ключ, заданный операндом А, включается;R - ключ, заданный операндом А, выключается;I - логический ключ инвертируется, т. е. состояние его меняется на противоположное, например, если был включен, будет выключен.Состояние логического ключа проверяется также блоком GATE. Блок GATE имеет такой же формат, как и при проверке состояний ОКУ и МКУ, и два режима работы:
GATE X A,[B]
Операнд А - имя или номер проверяемого ключа. Может быть именем, положительным целым числом, выражением в скобках, СЧА или СЧА*параметр.
Операнд B - метка блока, к которому будет направлен тран-закт при невыполнения условия, заданного оператором Х.
Условный оператор может принимать значения:

LS - равен 1, если логический ключ, заданный операндом А, включен; 0 - если выключен;LR - равен 1, если логический ключ, заданный операндом А, выключен; 0 - если включен.При имитационном моделировании с использованием специальных инструментальных средств, например,
Прямая задача заключается в нахождении
Обратная задача состоит в определении
Решение этих задач, особенно обратной задачи, имеет свои особенности. Рассмотрим эти особенности на примере.
Пример 6.1. Сервер обрабатывает запросы, поступающие с автоматизированных рабочих мест (АРМ) с интервалами, распределенными по показательному закону со средним значением T1= 2 мин. Вычислительная сложность запросов распределена по нормальному закону с математическим ожиданием S1 = 6 x 107 оп и среднеквадратическим отклонением S2 = 2*105 Производительность сервера Q = 6*105 оп /c. В случае занятости сервера поступающий запрос теряется.
Сервер представляет собой однофазную систему массового обслуживания разомкнутого типа с отказами.
Прямая задача.Построить имитационную модель для определения T = 1 час, и
Обратная задача.Построить имитационную модель для определения
Рассчитаем количество прогонов, которые нужно выполнить в каждом наблюдении, т. е. проведем так называемое тактическое планирование эксперимента. Пусть результаты моделирования (вероятность обработки запросов) нужно получить с
В модели для имитации источника запросов следует использовать блок GENERATE, для имитации сервера как одноканального устройства - блоки SEIZE и RELEASE, для имитации обработки запросов - блок ADVANCE.
В модели должны быть следующие элементы:
Серверу дадим имя Server. Для вывода из модели транзактов, имитирующих обработанные и потерянные запросы, используем блоки TERMINATE с метками ObrZap и PotZap соответственно. Для счета количества всех запросов используем метку KolZap.
Построим блок-диаграмму модели для решения прямой задачи, т. е. сегмент имитации поступления и обработки запросов и сегмент задания времени моделирования и расчета результатов моделирования (рис. 6.1).
Блок-диаграмма представляет собой набор стандартных блоков [5]. Она строится так. Из множества блоков выбирают нужные и далее выстраивают их в диаграмму для того, чтобы в процессе функционирования модели они как бы взаимодействовали друг с другом. Диаграмма сопровождается необходимыми комментариями. Использование блоков при построении моделей зависит от логических схем работы реальных систем, моделируемых на ЭВМ.
Теперь приступим к написанию программы модели.
(рис 6.1) Блок-диаграмма модели
Для задания исходных данных используем переменные пользователя. Они задаются с помощью команды EQU. Переменным пользователя даны такие же имена, как и в постановке задачи, но добавлен знак подчеркивания. Например, T1_, S1_ и т. д. Время моделирования зададим переменной пользователя VrMod.
Арифметическая переменная для расчета времени обработки VrObr запроса на сервере:
VrObr VARIABLE (Normal(2,S1_#Koef,S2_#Koef))/Q_
Переменная пользователя Koef введена для удобства изменения (пропорционального изменения) характеристик нормального закона распределения, которому подчиняется вычислительная сложность запросов. Особенно целесообразно использование этой переменной при проведении экспериментов. Примеры применения приведены в главе 7.
Вероятность обработки VerObr запросов на сервере будем определять как отношение количества обработанных N$ObrZap запросов к количеству всего поступивших N$KolZap запросов:
VerObr VARIABLE N$ObrZap/N$KolZap
В арифметическом выражении VerObr, например, N$ObrZap - системный числовой атрибут - количество транзактов, вошедших в блок с меткой ObrZap, а N$KolZap - количество транзактов, вошедших в блок с меткой KolZap.
Все необходимое для написания программы модели имеется. Напишем программу решения прямой задачи.
; Обработка запросов сервером. Прямая задача ; Задание исходных данных T1_ EQU 120 ; Средний интервал поступления запросов, с S1_ EQU 60000000 ; Среднее значение вычислительной сложности запросов, оп S2_ EQU 200000 ; Стандартное отклонение вычислительной сложности запросов, оп Q_ EQU 600000 ; Среднее значение производительности сервера, оп/с Koef EQU 1 ; Коэффициент изменения характеристик нормального распределения VrObr VARIABLE (Normal(2,(S1_#Koef),(S2_#Koef))/Q_ VerObr VARIABLE N$ObrZap/N$KolZap VrMod EQU 3600 ; Время моделирования, 1 ед. мод. времени = 1 с. ; Сегмент имитации обработки запросов GENERATE (Exponential(1,0,T1_)) ; Источник запросов KolZap GATE NU Server,PotZap ; Свободен ли сервер? Если да, то SEIZE Server ; занять сервер ADVANCE V$VrObr ; Имитация обработки запроса RELEASE Server ; Освободить сервер ObrZap TERMINATE ; Обработанные запросы PotZap TERMINATE ; Потерянные запросы ; Сегмент задания времени моделирования и расчета результатов GENERATE VrMod TEST L X$Prog,TG1,Met1 ; Если X$Prog < TG1, SAVEVALUE Prog,TG1 ; то X$Prog = TG1 Met1 TEST E TG1,1,Met2 ; Если TG1 = 1, то SAVEVALUE VerObr, V$VerObr ; расчет и сохранение в ячейке VerObr вероятности обработки запросов SAVEVALUE Res,(INT(N$ObrZap/X$Prog)) ; расчет и сохранение в ячейке Res количества обработанных запросов Met2 TERMINATE 1 START 1000,NP ; Прогоны до установившегося режима RESET ; Сброс накопленной статистики START 9604 ; Количество прогонов модели
При расчете количества обработанных запросов
SAVEVALUE Res,(INT(N$ObrZap/X$Prog))
в арифметическом выражении N$ObrZap/X$Prog используется число прогонов. В арифметическом выражении указано не явное число прогонов, а в виде содержимого ячейки X$Prog. Число прогонов заносится предварительно в эту ячейку по завершении первого прогона модели, но до того момента, когда из счетчика завершений TG1 будет вычтена первая единица. В этом случае арифметическое выражение не зависит от числа прогонов, которое может меняться на различных этапах создания и эксплуатации модели, в том числе и в зависимости от исходных данных, а также от точности и достоверности результатов моделирования. Поскольку количество обработанных запросов не может быть дробным числом, то для получения целого числа, записываемого в ячейку Res, используется процедура INT из встроенной библиотеки.
Для уменьшения машинного времени расчет искомых показателей производится не после каждого прогона, а после завершения последнего прогона, т. е. когда содержимое счетчика завершений будет равно единице ( TG1 = 1 ).
Т1_ нужно нажать клавишу [Tab]. Интервалы табуляции установлены по умолчанию.В результате решения прямой задачи получим, что за один час сервером будет обработано N=16 запросов, а вероятность обработки составит VerObr = 0,546. Если не использовать процедуру INT - выделения целого числа с отбрасыванием дробной части, будет обработано 16,345 запроса.
Для N =16 - результат решения прямой задачи.
Программа модели приведена ниже.
; Обработка запросов сервером. Обратная задача ; Задание исходных данных T1_ EQU 120 ; Средний интервал поступления запросов, с S1_ EQU 60000000 ; Среднее значение вычислительной сложности запросов, оп S2_ EQU 200000 ; Стандартное отклонение вычислительной сложности запросов, оп Q_ EQU 600000 ; Среднее значение производительности сервера, оп/c Koef EQU 1 ; Коэффициент изменения характеристик нормального распределения Koef1 EQU 1 ; Коэффициент учета дробной части N_ EQU 16 ; Количество запросов ; Сегмент имитации обработки запросов GENERATE (Exponential(1,0,T1_)) ; Источник запросов KolZap GATE NU Server,PotZap ; Свободен ли сервер? Если да, то SEIZE Server ; занять сервер ADVANCE ((Normal(2,(S1_#Koef),(S2_#Koef)))/Q_) ; Имитация обработки запроса RELEASE Server ; Освободить сервер TRANSFER ,ObrZap ; Запрос отправляется в сегмент завершения моделирования PotZap TERMINATE ; Потерянные запросы ; Сегмент организации завершения моделирования и расчета результатов ObrZap TEST L X$Prog,TG1,Met1 ; Если X$Prog < TG1, SAVEVALUE Prog,TG1 ; то X$Prog = TG1 SAVEVALUE NZap,0 ; Обнуление счетчика обработанных запросов Met1 SAVEVALUE NZap+,1 ; Счет количества обработанных запросов TEST E X$NZap,N_,Ter1 ; Если X$NZap = N_, то TEST E TG1,1,Met2 ; если TG1 = 1, то SAVEVALUE VerObr,(N$ObrZap/N$KolZap) ; расчет и сохранение в ячейке VerObr вероятности обработки запросов SAVEVALUE TimeNZap,((AC1-X$AC2)/(X$Prog#Koef1)) ;расчет и сохранение в ячейке TimeNZap времени обработки запросов SAVEVALUE AC2,AC1 ; Запомнить абсолютное модельное время в ячейке АС2 Met2 SAVEVALUE NZap,0 ; Обнуление счетчика обработанных запросов TERMINATE 1 Ter1 TERMINATE START 1000,NP ; Прогоны до установившегося режима RESET ; Сброс накопленной статистики START 9604 ; Количество прогонов модели
При решении обратной задачи один прогон определяется заданным количеством запросов N_, а не временем моделирования. Для этого организован счетчик обработанных запросов в виде сохраняемой ячейки NZap. Как только содержимое X$NZap = N_, из счетчика завершений вычитается единица.
Для расчета времени обработки заданного количества запросов используется арифметическое выражение (AC1-X$AC2)/X$Prog. В состав этого выражения входят абсолютное модельное время АС1 и опять количество прогонов. Запоминается количество прогонов также как и при решении прямой задачи.
Кроме этого, в арифметическом выражении есть сохраняемая ячейка X$AC2. Дело в том, что команда RESET не влияет на абсолютное модельное время АС1. Время же выполнения 1000 прогонов до установившегося режима не должно участвовать в расчете. Поэтому оно запоминается, а затем вычитается из абсолютного модельного времени выполнения 1000 + 9604 = 10604 прогонов. Количество прогонов до установившегося режима может быть и другим.
В результате моделирования получим время обработки 16 запросов 3523,658 с.
Фрагмент из отчета моделирования приведен ниже:
SAVEVALUE RETRY VALUE PROG 0 9604.000 NZAP 0 0 VEROBR 0 0.546 TIMENZAP 0 3523.658
А почему не 3600 с? Ведь это же время моделирования было задано при решении прямой задачи. Потому что мы отбросили дробную часть, т. е. взяли 16, а не 16,345. Как же поступить, чтобы учесть и отброшенную дробную часть? Ведь в счетчике фиксируются обработанные запросы только целыми числами, а не дробными?
Для учета десятых долей дробной части зададим N_ = 163, т. е. увеличим в 10 раз. Это нужно учесть и в арифметическом выражении: ((AC1-X$AC2)/(X$Prog#Koef1)). Переменной пользователя Koef1 задается значение 10. По завершении моделирования получим 3586,504. Этот результат уже ближе к 3600.
Для учета сотых долей дробной части зададим N_ = 1634, а Koef1 = 100. Получим 3595,399 с.
Вероятность обработки запросов во всех случаях практически одна и та же, т. е. 0,546. Однако время моделирования существенно возрастает: 4 с, 39 с и 6 мин 29 c, т. е. в 10 и 100 раз соответственно.
В примере
Например (см. сегмент организации завершения моделирования и расчета результатов):
ADVANCE ((Normal(2,(S1_#Koef),(S2_#Koef)))/Q_) ; Розыгрыш времени обработки запроса SAVEVALUE VerObr,(N$ObrZap/N$KolZap)) ; Расчет вероятности обработки запросов SAVEVALUE TimeNZap,((AC1-X$AC2)/(X$Prog#Koef1)) ;Расчет среднего времени обработки запросов
Предприятие имеет $$n_{1}$$ цехов, производящих $$n_{1}$$ типов блоков, т. е. каждый цех производит блоки одного типа. Интервалы выпуска блоков $$T_{1}, T_{2} , ..., T_{n1} $$ - случайные. Из $$n_{1}$$ типов блоков собирается одно изделие.
Перед сборкой каждый тип блоков проверяется на $$n_{11}, n_{12} , ..., n_{1n }$$ соответствующих постах. Длительности контроля одного блока $$T_{11}, T_{12} , ..., T_{1n}$$ случайные. На каждом посту бракуется $$q_{11}, q_{12} , ..., q_{1n} %$$ блоков соответственно. Эти блоки в дальнейшем процессе сборки не участвуют и удаляются с постов контроля.
Прошедшие контроль, т. е. не забракованные блоки поступают на один из $$n_{2}$$ пунктов сборки. На каждом пункте сборки одновременно собирается только одно изделие. Сборка начинается только тогда, когда имеются все необходимые $$n_{2}$$ блоков различных типов. Время сборки $$T_{c}$$ случайное.
После сборки изделие поступает на один из $$n_{3}$$ стендов выходного контроля. На одном стенде одновременно проверяется только одно изделие. Время проверки $$T_{n}$$ случайное. По результатам проверки бракуется $$q_{2} %$$ изделий.
Забракованное изделие направляется в цех сборки, где неработоспособные блоки заменяются новыми. Время замены $$T_{c}$$ случайное. После замены блоков изделие вновь поступает на один из стендов выходного контроля.
Прошедшие стенд выходного контроля изделия поступают в отдел приемки. Время приемки $$T_{пр}$$ одного изделия случайное. По результатам приемки бракуется $$q_{4} %$$ изделий, которые направляются вновь на стенд выходного контроля. Принятые приемкой изделия направляются на склад предприятия.
Разработать имитационную модель процесса изготовления изделий на предприятии.
Вариант 1 .Исследовать влияние интервалов выпуска блоков из цехов, времени сборки и проверки на стенде выходного контроля (табл. 6.2) на количество принятых приемкой изделий в течение недели (40 часов). Результаты моделирования необходимо получить с точностью $$\varepsilon = 1 $$ и
| Уровни факторов | Факторы | |||||
|---|---|---|---|---|---|---|
K1_ |
T2_ |
K3_ |
T4_ |
Kc_ |
Kpr_ |
|
| Нижний | 0,4 | 8 | 0,6 | 10 | 0,5 | 0,7 |
| Верхний | 1,6 | 20 | 1,4 | 24 | 1,5 | 1,3 |
T2_ и T4_ соответствуют $$T_2$$ и $$T_4$$.Т1, Т01, Т3, Т03 соответственно) и нормального ( $$T_{c},$$ $$T_{0c }$$, $$T _{пр}$$, $$T_{0пр}$$, в модели Тс, Т0с, Тpr, Т0pr соответственно) законов распределения производится изменением значений коэффициентов K1_, K3_, Kc_, Kpr_ соответственно. В этом случае среднее значение и сред-неквадратическое отклонение изменяются пропорционально соответствующему коэффициенту, например, T1_#K1_, T01_#K1_.Вариант 2. При исходных данных, указанных в п. 6.4.1.2, исследовать влияние качества изготовления блоков и сборки изделий (табл. 6.3) на количество принятых приемкой изделий в течение недели (40 часов).
| Уровни факторов | Факторы | |||||
|---|---|---|---|---|---|---|
q11_ |
q12_ |
q13_ |
q14_ |
q2_ |
q4_ |
|
| Нижний | 0.4 | 8 | 0.6 | 10 | 0.5 | 0.7 |
| Верхний | 1.6 | 20 | 1.4 | 24 | 1.5 | 1.3 |
Сделать выводы о работе подразделений предприятия и необходимых мерах по повышению их эффективности.
Результаты моделирования необходимо получить с точностью $$\varepsilon = 1$$ и
Предприятие при изготовлении блоков и сборки из них изделий может быть представлено как многофазная многоканальная разомкнутая система массового обслуживания с ожиданием, так как оно имеет все ее элементы (рис. 6.2):
Для имитации МКУ следует использовать блоки ENTER и LEAVE, для ОКУ - SEIZE и RELEASE. Для имитации ОКУ, а в данном случае это пункт приема изделий, можно также использовать МКУ, описав его командой STORAGE с емкостью 1. Тогда при увеличении количества пунктов приема собранных изделий нужно будет только изменить команду STORAGE, записав в ней вместо 1 новое значение емкости МКУ.
(рис 6.2) Предприятие как система массового обслуживанияДля исходных данных в программе модели возьмем те же идентификаторы, что и в постановке задачи, но для предотвращения случаев совпадения с зарезервированными символами
Например, q11_, n1_. Сделаем это для отличия от зарезервированных символов q - системный числовой атрибут, означающий очередь, n -используется в качестве ссылки при определении количества транзактов, вошедших в какой-либо блок программы. Добавление символа подчеркивания предотвратит ошибку, которая в противном случае будет выявлена на этапе создания объекта "Процесс моделирования". Другие идентификаторы будем вводить по мере уяснения задачи, а также в ходе разработки блок-диаграммы и программы модели.
Для моделирования необходимо привести в соответствие время протекания реального процесса изготовления блоков и сборки изделий на предприятии и в модели. Это осуществляется введением масштабного коэффициента, например, если для условий рассматриваемой задачи его взять равным 1, а в реальном процессе измерять время в минутах, то 1 мин будет соответствовать 1 ед. мод. вр. Тогда время моделирования VrMod = 60 # 40 = 2400 ед. мод. вр. Временные параметры изготовления и контроля блоков, сборки, контроля и приемки изделий даны в минутах, поэтому при выбранном масштабном коэффициенте 1 они не изменятся.
В модели, как процесса, протекающего в СМО (см. рис. 6.2), необходимо иметь:
Модели функционирования систем на
При этом отдельные элементы модели и модель в целом имеют достаточно различимое подобие. Для получения такого вывода сравните рис. 6.2 и 6.3: состав и блок-диаграмму модели функционирования предприятия.
Это подобие может быть также усилено разработчиком за счет продуманного на этапе разработки разделения исследуемого объекта на элементы, на процессы, протекающие в них, а модели - на сегменты.
Однако возможно и другое. В данном примере в каждом цехе имеются свои посты контроля блоков. Поэтому, казалось, в модели должны были бы быть сегменты, имитирующие работу цеха и его постов контроля. По предложенному же составу модели видно, что в нее входят сегменты, имитирующие работу каждого из цехов без постов контроля, и сегмент имитации работы всех постов контроля. Т. е. как бы все посты контроля блоков объединены в отдельное подразделение предприятия, но функциональное предназначение соответствующих постов контроля осталось прежним.
Объединение сделано в интересах частичной универсальности модели. Предположим, количество цехов увеличилось. В первом случае нужно было бы добавлять сегменты имитации работы цехов и постов контроля, т. е. количество блоков в модели увеличилось бы. Во втором случае добавляются только сегменты имитации работы цехов и необходимые исходные данные. При этом сегмент имитации функционирования постов контроля блоков изделий остается неизменным.
Списки пользователя применяются для имитации работы складов готовых блоков. Предполагается наличие такого склада у каждого цеха.
Для розыгрыша брака блоков и изделий используется блок TRANSFER в статистическом режиме.
Обратите внимание, что в сегменте имитации сборки изделий блок TEST используется в режиме, который рекомендуется избегать вследствие того, что проверяемое условие может не выполниться. Однако здесь этого не должно быть, так как в противном случае будут отсутствовать готовые блоки для сборки изделий. По мере готовности блоков условие обязательно выполняется и блоки - транзакты направляются на сборку. Первые три транзакта уничтожаются, а четвертый транзакт имитирует собранное из четырех блоков изделие. Он направляется для проверки работоспособности на пункт приема изделий.
(рис 6.3) Блок-диаграмма модели (лист 1)
(рис 6.3) Блок-диаграмма модели (продолжение, лист 2)
(рис 6.3) Блок-диаграмма модели (продолжение, лист 3)
(рис 6.3) Блок-диаграмма модели (продолжение, лист 4)
(рис 6.3) Блок-диаграмма модели (окончание, лист 5)
Программа модели построена в соответствии с блок-диаграммой (см. рис. 6.3). В ней, кроме, как уже отмечалось, раскрытия методов использования ОКУ, МКУ и списков пользователя демонстрируется применение номеров МКУ вместо их имен.
Этот метод дает возможность иметь в модели один сегмент имитации работы постов контроля блоков вместо подобного сегмента для каждого цеха, т. е. сократить число блоков в модели.
Обратите внимание, что в программе присвоение номеров именам МКУ указывается в самом начале и только потом, не обязательно следом, определение МКУ командой STORAGE. Если вы построите программу так, что поменяете порядок: вначале определение МКУ командой STORAGE, а потом - присвоение командой EQU номеров именам МКУ, то на этапе выполнения программы модели возникнет ошибка: "Обращение к несуществующей памяти". На этапе создания объекта "Процесс моделирования" ошибка изменение этого порядка не обнаруживается.
; Модель функционирования предприятия. Прямая задача ; Замена имен МКУ номерами Kontr1 EQU 1 Kontr2 EQU 2 Kontr3 EQU 3 Kontr4 EQU 4 ; Задание исходных данных q11_ EQU 0.02 ; Доля брака блоков на постах n11 q12_ EQU 0.03 ; Доля брака блоков на постах n12 q13_ EQU 0.04 ; Доля брака блоков на постах n13 q14_ EQU 0.06 ; Доля брака блоков на постах n14 q2_ EQU 0.05 ; Доля брака изделий на пункте вых. контроля q4_ EQU 0.03 ; Доля забракованных изделий приемкой TipBl EQU 4 ; Максимальное количество типов блоков VrMod EQU 2400 ; Время моделирования, 1 ед. мод. вр. = 1 мин T1_ EQU 19 ; Средний интервал выпуска блоков типа 1 T01_ EQU 6 ; Стандартное отклонение времени выпуска блоков типа 1 T2_ EQU 11 ; Средний интервал выпуска блоков типа 2 T3_ EQU 15 ; Средний интервал выпуска блоков типа 3 T03_ EQU 8 ; Стандартное отклонение времени выпуска блоков типа 3 T4_ EQU 18 ; Средний интервал выпуска блоков типа 4 T11_ EQU 12 ; Среднее время контроля на постах n11 T011_ EQU 6 ; Стандартное отклонение времени контроля на постах n11 T12_ EQU 16 ; Среднее время контроля на постах n12 T13_ EQU 21 ; Среднее время контроля на постах n13 T14_ EQU 17 ; Среднее время контроля на постах n14 Tc_ EQU 22 ; Среднее время сборки изделия T0c_ EQU 2 ; Стандартное отклонение времени сборки изделия Tp_ EQU 15 ; Среднее время проверки изделия Tpr_ EQU 18 ; Среднее время приема изделия T0pr_ EQU 2 ; Стандартное отклонение времени приема изделия ; Коэффициенты изменения параметров законов распределения K1_ EQU 1 ; Коэффициент изменения T1_ и T01_ K2_ EQU 1 ; Коэффициент изменения T2_ и T02_ K3_ EQU 1 ; Коэффициент изменения T3_ и T03_ K4_ EQU 1 ; Коэффициент изменения T4_ и T04_ Kc_ EQU 1 ; Коэффициент изменения Tс_ и T0с_ Kp_ EQU 1 ; Коэффициент изменения Tp_ и T0p_ Kpr_ EQU 1 ; Коэффициент изменения Tpr_ и T0pr_ ; Задание количества пунктов сборки и постов контроля Sbor STORAGE 2 ; Количество пунктов сборки Kontr1 STORAGE 3 ; Количество постов n11 Kontr2 STORAGE 2 ; Количество постов n12 Kontr3 STORAGE 2 ; Количество постов n13 Kontr4 STORAGE 2 ; Количество постов n14 Kontsb STORAGE 2 ; Количество стендов выходного контроля ; Описание арифметических выражений KolIzd VARIABLE INT(N$Term7/X$prog) ; Количество готовых изделий KolGotBl VARIABLE (INT(CH*1/X$Prog)) ; Количество готовых блоков всех типов, оставшихся на складах KolBrBl VARIABLE (INT(X*1/X$Prog)) ; Количество забракованных блоков всех типов TIzd VARIABLE (AC1/X$Prog)/X$KolIzd ; Среднее время подготовки одного изделия ;Сегмент имитации работы цеха 1 без постов контроля GENERATE (T1_#K1_),(T01_#K1_) ASSIGN 1,1 ; Код 1 в параметре 1 транзакта - тип 1 блока ASSIGN 2,((T11_-T01_)+2#T011_#(RN27/1000)) ; Розыгрыш времени контроля и запись в Р2 ASSIGN 9,q11_ ; Запись в Р9 доли брака блоков после постов контроля TRANSFER ,Met1 ; Сегмент имитации работы цеха 2 без постов контроля GENERATE (Exponential(32,0,(T2_#K2_))) ASSIGN 1,2 ; Код 2 в параметре 1 транзакта - тип 2 блока ASSIGN 2,(Exponential(23,0,T12_)) ; Розыгрыш времени контроля и запись в Р2 ASSIGN 9,q12_ ; Запись в Р9 доли брака блоков после постов контроля TRANSFER ,Met1 ; Сегмент имитации работы цеха 3 без постов контроля GENERATE (T3_#K3_),(T03_#K3_) ASSIGN 1,3 ; Код 3 в параметре 1 транзакта - тип 3 блока ASSIGN 2,(Exponential(22,0,T13_)) ; Розыгрыш времени контроля и запись в Р2 ASSIGN 9,q13_ ; Запись в Р9 доли брака блоков после постов контроля TRANSFER ,Met1 ; Сегмент имитации работы цеха 4 без постов контроля GENERATE (Exponential(32,0,(T4_#K4_))) ASSIGN 1,4 ; Код 4 в параметре 1 транзакта - тип 4 блока ASSIGN 2,(Exponential(22,0,T14_)) ; Розыгрыш времени контроля и запись в Р2 ASSIGN 9,q14_ ; Запись в Р9 доли брака блоков после постов контроля ; Сегмент имитации работы постов контроля блоков Met1 QUEUE P1 ; Встать в очередь с номером в Р1 ENTER P1 ; Занять МКУ с номером в Р1 DEPART P1 ; Покинуть очередь с номером в Р1 ADVANCE P2 ; Имитация контроля с временем в Р2 LEAVE P1 ; Освободить МКУ с номером в Р1 ASSIGN 10,0 ; Подготовка к циклу Met21 ASSIGN 10+,1 ; Начало цикла по числу типов блоков TEST E P10,P1,Met21 ; Какой тип блока подготовлен? TRANSFER P9,,Met14 ; Отправить брак блоков к Met14 LINK P1,FIFO ; Готовые блоки на склад с номером в Р1 ; Сегмент имитации сборки изделий GENERATE ,,,1 Met3 ASSIGN 1,0 ; Подготовка к циклу Met13 ASSIGN 1+,1 ; Начало цикла по числу типов блоков TEST L P1,TipBl,Met4 ; Все ли типы блоков? TEST NE CH*1,0 ; Есть на складе готовые блоки? UNLINK P1,Term5,1 ; Да TEST G P1,TipBl,Met13 ; Блоки всех типов есть? Если да, Met4 UNLINK P1,Met5,1 ; то, отправить блоки на сборку TRANSFER ,Met3 ; Вернуться для проверки наличия всех типов блоков для следующего изделия Met5 QUEUE Sbor ; Занять очередь на пункты сборки ENTER Sb ; Занять пункт сборки DEPART Sbor ; Освободить очередь на пункт сборки ADVANCE (Normal(15,(Tc_#Kc_),(T0c_#Kc_))) ; Имитация сборки LEAVE Sb ; Освободить пункт сборки ; Сегмент имитации работы стендов выходного контроля Met9 QUEUE KSbor ; Занять очередь на стенд выходного контроля ENTER KSb ; Занять стенд выходного контроля DEPART KSbor ; Освободить очередь на стенд выходного контроля ADVANCE (Exponential(11,0,(Tp_#Kp_))) ; Имитация работы стенда выходного контроля LEAVE KSb ; Освободить стенд выходного контроля TRANSFER q2_,,Met5 ; Направить в приемку, а брак - для замены на пункт сборки ; Сегмент имитации работы приемки QUEUE Opr ; Занять очередь на пункт приемки SEIZE KPr ; Занять пункт приемки DEPART Opr ; Освободить очередь пункта приемки ADVANCE (Normal(11,(Tpr_#Kpr_),(T0pr_#Kpr_))) ; Имитация работы приемки RELEASE KPr ; Освободить пункт приемки TRANSFER q4_,,Met9 ; Готовые изделия - на склад ; Сегмент счета блоков и изделий Term7 TERMINATE ; Количество готовых изделий Met14 SAVEVALUE P1+,1 ; Количество брака блоков всех типов TERMINATE Term5 TERMINATE ; Задание времени моделирования и расчет результатов моделирования GENERATE VrMod ; Задание времени моделирования TEST L X$Prog,TG1,Met10 ; Если X$Prog< содержимого счетчика завершений, то SAVEVALUE Prog,TG1 ; записать в X$Prog содержимое счетчика завершений Met10 TEST E TG1,1,Met12 ; Если содержимое счетчика завершений равно 1, то расчет результатов моделирования SAVEVALUE KolIzd,V$KolIzd ; Количество готовых изделий ASSIGN 1,0 ; Подготовка к циклу Met15 ASSIGN 1+,1 ; Начало цикла по числу типов блоков SAVEVALUE (10+P1),V$KolGotBl ; Количество готовых блоков всех типов, оставшихся на складах SAVEVALUE P1,V$KolBrBl ; Количество забракованных блоков всех типов ASSIGN 11,(20+P1) ; Задание номера Х и запись его в Р11 TEST GE P1,TipBl,Met15 ; Все ли типы блоков? SAVEVALUE TIzd,V$TIzd ; Среднее время подготовки одного изделия Met12 TERMINATE 1
Отладьте модель. Выполните моделирование, указав в команде START 1000 прогонов. В отчете, фрагмент которого приведен ниже,
SAVEVALUE RETRY VALUE KOLIZD 0 122.000 TIZD 0 19.512
найдите, что за 40 часов подготовлено 122 изделия, а среднее время подготовки одного изделия ? 20 мин (19,51 мин).
После изучения материала главы 7 вернитесь к данной задаче и проведите два отсеивающих эксперимента (
При необходимости внесите в эти данные свои изменения. По результатам экспериментов сделайте выводы.
Постановка задачи аналогична постановке задачи п. 6.4.1.1 при тех же исходных данных (п. 6.4.1.2).
Отличие состоит в том, что нужно построить имитационную модель для определения N_ - количество изделий, время изготовления которых нужно оценить.
В программе модели те же сегменты (п. 6.4.1.6), только вместо сегмента задания времени моделирования и расчета результатов включен сегмент организации завершения моделирования и расчета результатов моделирования.
Один прогон наблюдения завершается подготовкой N_ изделий, т. е. поступлением их на склад. Поэтому соответствующие этим изделиям транзакты не выводятся сразу из модели, как в прямой задаче, а поступают в сегмент организации завершения моделирования и расчета результатов моделирования.
В блоке
Met10 SAVEVALUE NIzd+,1
подсчитывается количество подготовленных изделий. Если это количество равно N_, т. е. выполняется условие
TEST E X$NIzd,N_,Term5
фиксируется один прогон.
С целью сокращения машинного времени расчет результатов моделирования производится один раз по накопленной статистике за все прогоны. Программа, как и в п. 6.3.2.2, построена так, чтобы расчет результатов моделирования не требовал ее изменения при различном числе прогонов, задаваемом пользователем.
Ниже приведена программа обратной задачи.
; Модель функционирования предприятия. Обратная задача ; Замена имен МКУ номерами Kontr1 EQU 1 ; Замена имени МКУ Kontr1 номером Kontr2 EQU 2 ; Замена имени МКУ Kontr2 номером Kontr3 EQU 3 ; Замена имени МКУ Kontr3 номером Kontr4 EQU 4 ; Замена имени МКУ Kontr4 номером ; Задание исходных данных q11_ EQU 0.02 ; Доля забракованных блоков на постах n11 q12_ EQU 0.03 ; Доля забракованных блоков на постах n12 q13_ EQU 0.04 ; Доля забракованных блоков на постах n13 q14_ EQU 0.06 ; Доля забракованных блоков на постах n14 q2_ EQU 0.05 ; Доля брака изделий на пункте выходного контроля q4_ EQU 0.03 ; Доля забракованных изделий приемкой TipBl EQU 4 ; Максимальное количество типов блоков, изготавливаемых цехами T1_ EQU 19 ; Средний интервал выпуска блоков типа 1 T01_ EQU 6 ; Стандартное отклонение времени выпуска блоков типа 1 T2_ EQU 11 ; Средний интервал выпуска блоков типа 2 T3_ EQU 15 ; Средний интервал выпуска блоков типа 3 T03_ EQU 8 ; Стандартное отклонение времени выпуска блоков типа 3 T4_ EQU 18 ; Средний интервал выпуска блоков типа 4 T11_ EQU 12 ; Среднее время контроля на постах n11 T011_ EQU 6 ; Стандартное отклонение времени контроля на постах n11 T12_ EQU 16 ; Среднее время контроля на постах n12 T13_ EQU 21 ; Среднее время контроля на постах n13 T14_ EQU 17 ; Среднее время контроля на постах n14 Tc_ EQU 22 ; Среднее время сборки изделия T0c_ EQU 2 ; Стандартное отклонение времени сборки изделия Tp_ EQU 15 ; Среднее время проверки изделия Tpr_ EQU 18 ; Среднее время приема изделия T0pr_ EQU 2 ; Стандартное отклонение времени приема изделия N_ EQU 122 ; Количество изделий, которое необходимо подготовить ; Задание количества пунктов сборки и контроля Sbor STORAGE 2 ; Количество пунктов сборки Kontr1 STORAGE 3 ; Количество постов n11 Kontr2 STORAGE 2 ; Количество постов n12 Kontr3 STORAGE 2 ; Количество постов n13 Kontr4 STORAGE 2 ; Количество постов n14 Kontsb STORAGE 2 ; Количество пунктов сборки ; Сегмент имитации работы цеха 1 без постов контроля GENERATE T1_,T01_; Источник блоков типа 1 ASSIGN 1,1 ; Код 1 в параметре 1 транзакта - тип 1 блока ASSIGN 2,((T11_-T011_)+2#T011_#(RN27/1000)) ; Розыгрыш времени контроля и запись в Р2 ASSIGN 9,q11_ ; Запись в Р9 доли брака блоков после постов контроля TRANSFER ,Met1 ; Сегмент имитации работы цеха 2 без постов контроля GENERATE (Exponential(32,0,T2_)); Источник блоков типа 2 ASSIGN 1,2 ; Код 2 в параметре 1 транзакта - тип 2 блока ASSIGN 2,(Exponential(23,0,T12_)) ; Розыгрыш времени контроля и запись в Р2 ASSIGN 9,q12_ ; Запись в Р9 доли брака блоков после постов контроля TRANSFER ,Met1 ; Сегмент имитации работы цеха 3 без постов контроля GENERATE T3_,T03_ ; Источник блоков типа 3 ASSIGN 1,3 ; Код 3 в параметре 1 транзакта - тип 3 блока ASSIGN 2,(Exponential(22,0,T13_)) ; Розыгрыш времени контроля и запись в Р2 ASSIGN 9,q13_ ; Запись в Р9 доли брака блоков после постов контроля TRANSFER ,Met1 ; Сегмент имитации работы цеха 4 без постов контроля GENERATE (Exponential(32,0,T4_)) ; Источник блоков типа 4 ASSIGN 1,4 ; Код 4 в параметре 1 транзакта - тип 4 блока ASSIGN 2,(Exponential(22,0,T14_)) ; Розыгрыш времени контроля блока и запись в Р2 ASSIGN 9,q14_ ; Запись в Р9 доли брака блоков после постов контроля ; Сегмент имитации работы постов контроля блоков Met1 QUEUE P1 ; Встать в очередь с номером в Р1 ENTER P1 ; Занять МКУ с номером в Р1 DEPART P1 ; Покинуть очередь с номером в Р1 ADVANCE P2 ; Имитация контроля качества блока с временем контроля в Р2 LEAVE P1 ; Освободить МКУ с номером в Р1 ASSIGN 10,0 ; Подготовка к циклу Met21 ASSIGN 10+,1 ; Начало цикла по числу типов блоков TEST E P10,P1,Met21 ; Какой тип блока подготовлен? TRANSFER P9,,Met14 ; Отправить брак блоков к Met14 LINK P1,FIFO ; Готовые блоки на склад с номером в Р1 ; Сегмент имитации сборки изделий GENERATE ,,,1 Met3 ASSIGN 1,0 ; Подготовка к циклу Met13 ASSIGN 1+,1 ; Начало цикла по числу типов блоков TEST L P1,TipBl,Met4 ; Все ли типы блоков? TEST NE CH*1,0 ; Есть на складе готовые блоки? UNLINK P1,Term5,1 ; Да TEST G P1,TipBl,Met13 ; Блоки всех типов есть? Если да, Met4 UNLINK P1,Met5,1 ; то отправить блоки на сборку TRANSFER ,Met3 ; Вернуться для проверки наличия всех типов блоков для следующего изделия Met5 QUEUE Sbor ; Занять очередь на пункты сборки ENTER Sb ; Занять пункт сборки DEPART Sbor ; Освободить очередь на пункт сборки ADVANCE (Normal(15,Tc_,T0c_)) ; Имитация сборки LEAVE Sb ; Освободить пункт сборки ; Cегмент имитации работы стендов выходного контроля Met9 QUEUE KSbor ; Занять очередь на стенд выходного контроля ENTER KSb ; Занять стенд выходного контроля DEPART KSbor ; Освободить очередь на стенд выходного контроля ADVANCE (Exponential(11,0,Tp_)) ; Имитация работы стенда выходного контроля LEAVE KSb ; Освободить стенд выходного контроля TRANSFER q2_,,Met5 ; Направить изделие в приемку, а брак -на замену на пункт сборки ; Сегмент имитации работы приемки QUEUE Opr ; Занять очередь на пункт приемки SEIZE KPr ; Занять пункт приемки DEPART Opr ;Освободить очередь пункта приемки ADVANCE (Normal(11,Tpr_,T0pr_)) ; Имитация работы приемки RELEASE KPr ; Освободить пункт приемки TRANSFER q4_,,Met9 ; Готовые изделия - на склад ; Сегмент организации завершения моделирования и расчета результатов моделирования TEST L X$Prog,TG1,Met10 ; Если X$Prog< содержимого счетчика завершений, то SAVEVALUE Prog,TG1 ; записать в X$Prog содержимое счетчика завершений - количество прогонов из TG1 SAVEVALUE NIzd,0 Met10 SAVEVALUE NIzd+,1 ; Счет и сохранение в ячейке NIzd количества принятых приемкой изделий TEST E X$NIzd,N_,Term5 ; Если принято N_изделий, зафиксировать один прогон TEST E TG1,1,Met12 ; Если содержимое счетчика завершений равно 1, то расчет результатов моделирования ASSIGN 1,0 ; Подготовка к циклу Met15 ASSIGN 1+,1 ; Начало цикла по числу типов блоков SAVEVALUE (10+P1),(INT(CH*1/X$Prog)) ; Количество готовых блоков всех типов, оставшихся на складах SAVEVALUE P1,(INT(X*1/X$Prog)) ; Количество забракованных блоков всех типов ASSIGN 11,(20+P1) ; Задание номера сохраняемой ячейки и запись его в Р11 TEST GE P1,TipBl,Met15 ; Все ли типы блоков для подготовки изделия имеются на складах цехов? SAVEVALUE TIzd,((AC1/X$Prog)/60) ; Расчет и сохранение в ячейке TIzd времени подготовки N_изделий, час SAVEVALUE STIzd,((X$TIzd/N_)#60) ; Расчет и сохранение в ячейке STIzd среднего времени подготовки одного изделия, мин Met12 SAVEVALUE NIzd,0 ; Обнуление X$NIzd - подготовка к очередному прогону TERMINATE 1 Met14 SAVEVALUE P1+,1 ; Количество брака блоков всех типов TERMINATE Term5 TERMINATE ; Вывод вспомогательных транзактов
Отладьте модель. Запустите модель, указав в команде START 1000 прогонов. По окончании моделирования в отчете, фрагмент которого приведен ниже,
SAVEVALUE RETRY VALUE TIZD 0 39.438 STIZD 0 19.396
получите, что среднее время подготовки N_=122 изделий составляет 40 ч (39,438) при среднем времени подготовки одного изделия 20 мин (19,396). Как видно, эти результаты согласуются с исходными данными и результатами решения прямой задачи.
Результаты
START TIME END TIME BLOCKS FACILITIES STORAGES 0.000 2366280.440 74 1 6
Разделите END TIME (абсолютное модельное время АС1) на количество прогонов и минут в одном часе, т. е. на 60 000, получите ?40 ч.
Теперь в программе модели укажите командой EQU количество изделий N_=244:
N_ EQU 244
Выполните моделирование, указав, как и в предыдущем случае, в команде START 1000 прогонов. Из отчета
| SAVEVALUE | RETRY | VALUE |
|---|---|---|
| TIZD | 0 | 78.863 |
| STIZD | 0 | 19.393 |
видно, что время подготовки, как и число изделий, увеличивается в два раза при неизменном времени изготовления одного изделия.
Сделайте выводы: влияет ли стохастичность, как и при решении прямой задачи, на результаты моделирования.
Автоматическая телефонная станция (АТС) обслуживает $$n_{1}$$ телефонных аппаратов (ТА) первой категории (ТА1), $$n_{2}$$ ТА второй категории (ТА2) и имеет $$n_{3}$$ выходов в сеть связи. Интервал времени $$T_{1} /n_{1}$$ между звонками с ТА1 случайный. Вероятность звонка с i-го ТА1 $$p_{1i} =1/ n_{1}.$$ Вероятность того, что при этом для разговора потребуется внешняя линия связи $$p_{2} = n_{3} / (n_{2} + n_{3} ),$$ соединение с ТА2 $$p_{3} = n_{2} / (n_{2} + n_{3} ).$$ При этом может быть занята любая свободная линия связи, а вероятность звонка на $$j$$ -й ТА2 $$p_{4j} =1/ n_{2}.$$ Длительность $$t_{1}$$ разговора с ТА1 случайная. Время $$t_{ож1}$$ ожидания при занятости ТА или внешних линий связи случайное. Вероятность того, что ТА2 не ответит, $$p_{5}.$$ При этом время $$t_{ож2}$$ случайное.
Интервал времени $$T_{2} /n_{2}$$ между звонками с ТА2 случайный. Вероятность звонка с $$k$$ -го ТА2 $$p_{6k} =1/ n_{2}.$$ Вероятности того, что при этом для разговора потребуются внешняя линия связи $$p_{7} = n_{3} / (n_{1} + n_{3} ),$$ соединение с ТА1 $$p_{7} = n_{1} / (n_{1} + n_{3} ).$$ Для разговора может быть занята любая свободная внешняя линия связи, а вероятность звонка на $$l$$ -й ТА1 $$p_{9l} =1/ n_{1}.$$ Длительность $$t_{2} $$ разговора с ТА2 случайная. Время $$t_{ож3}$$ при занятости ТА или внешних линий связи случайное. Вероятность того, что ТА1 не ответит, $$p_{10}.$$ При этом время $$t_{ож4}$$ также случайное.
Звонки с ТА1 обладают абсолютным приоритетом по отношению к звонкам с ТА2 при занятости внешнего выхода в сеть связи. Поэтому, если при поступлении с ТА1 заявки на разговор по внешнему выходу все внешние выходы будут заняты разговорами также с ТА1, прерывания разговоров не происходит и заявка считается потерянной. Если же некоторые внешние выходы будут заняты разговорами с ТА2, после $$t_{ож1}$$ один из этих разговоров прерывается (теряется) и начинается разговор по этому выходу с ТА1.
Разработать имитационную модель функционирования АТС. Исследовать зависимость вероятности разговоров абонентами ТА1 от интервалов времени T1, T2, времени t1, t2 разговоров и вероятностей р5 и р10 ответа на звонки абонентов ТА2 и ТА1 соответственно.
Результаты моделирования необходимо получить с точностью $$\varepsilon = 0,01$$ и \alpha = 0,99.
Модель функционирования АТС должна иметь:
Телефоны и внешние выходы в модели нужно представить ОКУ, а заявки на разговоры - транзактами. Казалось бы, что в целях сокращения программы модели нужно использовать МКУ, однако МКУ не дает возможности идентифицировать каждый свой канал. Что касается сокращения, то этого можно достичь и с ОКУ.
В программе п. 6.5.1.6 (сегмент имитации работы постов контроля) был продемонстрирован метод сокращения блоков модели за счет замены имен МКУ номерами. Язык
Но для одноканального устройства это возможно. Дадим, используя переменные пользователя, номера ОКУ, предварительно не указывая их имена:
1 … N1_ ;(N1_+1) … (N1_+N2_) ;(N1_+N2_+1) … (N1_+N2_+N3_).Нумерацию будем использовать в блок-диаграмме и программе модели. За счет этого при увеличении числа ТА1, ТА2 и внешних выходов программа модели не потребует внесения каких-либо изменений.
Конечно, можно также определить арифметические выражения для вычисления (N1_+N2_), (N1_+N2_+N3_) и затем ссылаться на них в программе модели, например:
Num1 VARIABLE N1_+N2_ Num2 VARIABLE N1_+N2_+N3_
В больших моделях этот вариант предпочтителен. Для лучшего понимания построения модели ее
В программе демонстрируется возможность
Для имитации прерывания телефонных разговоров абонентов ТА2 звонками абонентов с ТА1 используются блоки PREEMPT и RETURN.
Блок-диаграмма модели представлена ниже (рис. 6.4).
(рис 6.4) Блок-диаграмма модели АТС (лист 1)
(рис 6.4) Блок-диаграмма модели АТС (продолжение, лист 2)
(рис 6.4) Блок-диаграмма модели АТС (продолжение, лист 3)
(рис 6.4) Блок-диаграмма модели АТС (продолжение, лист 4)
(рис 6.4) Блок-диаграмма модели АТС (окончание, лист 5)
В программе модели для задания исходных данных используются переменные пользователя. Значения им присваиваются командой EQU. Это позволяет проводить эксперименты с использованием встроенных генераторов, так как факторы в них должны быть только переменными пользователя.
Рассмотрим работу сегмента имитации телефонных разговоров с ТА1.
Генератор этого сегмента вводит в модель транзакты со средним интервалом времени (T1_/ N1_ ). Поскольку звонки с ТА1 имеют абсолютный приоритет, то блоком GENERATE транзактам присваивается приоритет 1. Генератор сегмента имитации телефонных разговоров с ТА2 вводит в модель транзакты с нулевым приоритетом.
После ввода транзакта в модель, имитирующего заявку на звонок, производится определение номера звонящего ТА1. Группа событий - звонки с ТА1 - рассматривается как
Определенный в результате розыгрыша номер ТА1 заносится в параметр Р3 транзакта. Однако возможно, что с этого телефона уже звонят. Поэтому блоком GATE производится проверка: свободен ли ТА1 с данным номером? Если нет, заявка теряется.
Если телефон свободен, то далее определяется: куда звонок? На ТА2 или требуется внешний выход? Ответ на этот вопрос находится розыгрышем единичного события (см. п. 3.6).
Пусть требуется внешний выход. Поиск свободного внешнего выхода производится в цикле от номера (N1_+ N2_)+1) до номера ( N1_+ N2_+ N3_). Предположим, что найден свободный
внешний выход, номер которого занесен в параметр Р4. Тогда последовательностью блоков, начиная с метки Мет4, имитируется ведение разговора с ТА1 без прерывания разговора по внешнему выходу с ТА2. После занятия свободного выхода в сохраняемую ячейку с тем же номером, что и номер занятого внешнего выхода, заносится уровень приоритета, в данном случае это 1.
Разговор с ТА1 по внешнему выходу состоялся. Транзакт выводится из модели блоком TERMINATE с меткой Ter2.
Вернемся к поиску свободного внешнего выхода. Пусть все внешние выходы заняты. Далее отыскивается внешний выход, занятый разговором с ТА2. Поиск производится также в цикле от номера (N1_+ N2_) +1 до номера ( N1_+ N2_+ N3_). Однако при этом проверяется содержимое сохраняемых ячеек с такими же номерами, как и номера внешних выходов. Если содержимое проверяемой ячейки равно 1, то внешний выход занят ТА1. Если все внешние выходы заняты ТА1, т. е. во всех проверяемых сохраняемых ячейках 1, заявка на звонок теряется - транзакт отправляется на метку Мет23.
Пусть найден внешний выход, занятый ТА2, т. е. в соответствующей сохраняемой ячейке 0. Транзакт переходит к последовательности блоков, начинающихся с метки Мет22. Эта последовательность имитирует прерывание разговора с ТА2 и ведение разговора с ТА1 по внешнему выходу. По окончании разговора тран-закт выводится из модели блоком TERMINATE с меткой Ter1.
Возвратимся к последовательности блоков, разыгрывающей номер ТА1, с которого поступает заявка на звонок. Пусть теперь требуется не внешний выход, а нужно позвонить одному из абонентов ТА2. В этом случае транзакт направляется к последовательности блоков, начинающейся с метки Мет2. Эта последовательность имитирует определение номера ТА2, на который звонят с ТА1. Номер ТА2 разыгрывается также, как и ранее рассмотренный розыгрыш номера ТА1. После определения номера ТА2 проверяется: свободен ли ТА2 с данным номером? Если не свободен, фиксируется несостоявшийся разговор выводом транзакта из модели блоком TERMINATE с меткой Ter3.
Если же ТА2 свободен, транзакт направляется к последовательности блоков, начинающейся с метки Мет6. Эти блоки имитируют ведение разговора абонентами ТА1 и ТА2. По окончании разговора транзакт выводится из модели блоком TERMINATE с меткой Ter4.
Сегмент имитации телефонных разговоров с ТА2 отличается от только что рассмотренного тем, что в нем отсутствует последовательность блоков, имитирующей прерывание разговоров с ТА2 заявками на разговор с ТА1 при отсутствии свободных внешних выходов.
; Модель функционирования автоматической телефонной станции ; Задание исходных данных VrMod EQU 3600 ; Время моделирования, 1 ед. мод. вр. = 1 с N1_ EQU 10 ; Количество ТА1 N2_ EQU 20 ; Количество ТА2 N3_ EQU 3 ; Количество внешних выходов T1_ EQU 40 ; Время для расчета интервалов между звонками с ТА1 T2_ EQU 50 ; Время для расчета интервалов между звонками с ТА2 Tog1 EQU 3.5 ; Среднее время ожидания при занятости внешних линий Tog01 EQU 0.5 ; Среднеквадратическое отклонение времени ожидания Tog2 EQU 3 ; Среднее время ожидания при звонке с ТА1 на ТА2 Tog02 EQU 0.5 ; Среднеквадратическое отклонение времени ожидания Tog3 EQU 2.5 ; Среднее время ожидания при занятости внешних линий Tog03 EQU 0.4 ; Среднеквадратическое отклонение времени ожидания Tog4 EQU 2 ; Среднее время ожидания при звонке с ТА2 на ТА1 Tog04 EQU 0.3 ; Среднеквадратическое отклонение времени ожидания Trazg1 EQU 3 ; Среднее время разговора с ТА1 Trazg2 EQU 5 ; Среднее время разговора с ТА2 P5_ EQU 0.7 ; Вероятность того, что ТА2 не ответит P10_ EQU 0.3 ; Вероятность того, что ТА1 не ответит ; Сегмент имитации телефонных разговоров с ТА1 GENERATE (Exponential(333,0,(T1_/N1_))),,,,1 ; Определение номера звонящего ТА1 Met0 ASSIGN 7,(RN43/1000) ; Обращение к генератору RN Met1 ASSIGN 3+,1 ; Начало цикла определения номера звонящего ТА1 TEST LE P7,(P3#(1/N1_)),Met1 ; Если условие выполнено, то номер ТА1 запомнить в Р3 GATE NU P3,Met9 ; Свободен ли телефон с данным номером? Если да, SEIZE P3 ; то звонят с него ASSIGN 7,(RN343/1000) ; Обращение к генератору RN TEST LE P7,(N3_/(N2_+N3_)),Met2 ; Если условие выполнено, то нужен внешний выход ; Поиск свободного внешнего выхода ASSIGN 4,(N1_+N2_) ; Подготовка к циклу Met3 ASSIGN 4+,1 ; Начало цикла определения номера свободного внешнего выхода GATE U P4,Met4 ; Свободен ли внешний выход? TEST GE P4,(N1_+N2_+N3_),Met3 ; Все ли внешние выходы проверены и не найдено свободного? ADVANCE Tog1,Tog01 ; Если да, то задержаться и ; Поиск внешнего выхода, занятого ТА2 ASSIGN 4,(N1_+N2_) ; подготовка к циклу Met21 ASSIGN 4+,1 ; Начало цикла определения номера внешнего выхода, занятого ТА2 TEST E X*4,1,Met22 ; Равно ли значение сохраняемой ячейки 1? Если нет, то перейти к прерыванию разговора TEST GE P4,(N1_+N2_+N3_),Met21 ; Все ли сохраняемые ячейки проверены? Не найдено ни одной, значение которой равно 0? Если да, то TRANSFER ,Met23 ; все внешние выходы заняты звонками с ТА1 ; Прерывание разговора с ТА2 Met22 PREEMPT P4,PR,Met24,,RE ; Прервать разговор с ТА2 по внешнему выходу без права продолжения SAVEVALUE *4,PR ; Сохранить PR в ячейке с номером в Р4 ADVANCE (Exponential(222,0,Trazg1)) ; Имитация разговора с ТА1 по внешнему выходу RETURN P4 ; Освободить внешний выход с номером в Р4 RELEASE P3 ; Освободить ТА1 с номером в Р3 Ter1 TERMINATE ; Состоявшиеся разговоры с ТА1 по внешним выходам с прерыванием разговоров с ТА2 Met23 RELEASE P3 ; Освободить ТА1, разговор с которого по внешнему выходу не состоялся TERMINATE ; Несостоявшиеся разговоры с ТА1 по внешним выходам из-за занятости их ТА1 ; Имитация ведения разговоров с ТА1 без прерывания Met4 SEIZE P4 ; Занять свободный внешний выход с номером в Р4 SAVEVALUE P4,PR ; Занести в ячейку с номером в Р4 уровень приоритета ADVANCE (Exponential(222,0,Trazg1)) ; Имитация разговора с ТА1 RELEASE P4 ; Освободить внешний выход с номером в Р4 RELEASE P3 ; освободить ТА1 с номером в Р3 Ter2 TERMINATE ; Состоявшиеся разговоры с ТА1 по внешним выходам ; Определение номера ТА2, на который звонят с ТА1 Met2 ASSIGN 7,(RN343/1000) ; Обращение к генератору RN ASSIGN 6,0 ; Подготовка к циклу Met5 ASSIGN 6+,1 ; Начало цикла определения номера ТА2, на который звонят с ТА1 TEST LE P7,(P6#(1/N2_)),Met5 ; Если условие выполнено, то номер ТА2 запомнить в Р6 GATE NU (N1_+P6),Met7 ; Свободен ли телефон с данным номером? Если да, ASSIGN 7,(RN343/1000) ; то ответит ли он? TEST LE P7,P5_,Met6 ; Если условие выполнено, то не ответит. Тогда Met7 ADVANCE Tog2,Tog02 ; задержаться и RELEASE P3 ; освободить ТА1 с номером в Р3 Ter3 TERMINATE ; Несостоявшиеся разговоры между абонентами ТА1 и ТА2 ; Имитация разговоров абонентов ТА1 и ТА2 Met6 SEIZE (N1_+P6) ; Занять ТА2 с номером в (N1_+Р6) ADVANCE (Exponential(222,0,Trazg1)) ; Имитация разговора между абонентами ТА1 и ТА2 RELEASE (N1_+P6) ; Освободить ТА2 с номером в (N1_+Р6) RELEASE P3 ; Освободить ТА1 с номером в Р3 Ter4 TERMINATE ; Состоявшиеся разговоры между абонентами ТА1 и ТА2 Met9 TERMINATE ; ТА1 уже был занят, поэтому разговор не состоялся Met24 RELEASE (N1_+P3) ; Прерванные разговоры с ТА2 TERMINATE ; Сегмент имитации телефонных разговоров с ТА2 GENERATE (Exponential(493,0,(T2_/N2_))) ; Определение номера звонящего ТА1 Met10 ASSIGN 7,(RN413/1000) ; Обращение к генератору RN ASSIGN 3,0 ; Подготовка к циклу Met11 ASSIGN 3+,1 ; Начало цикла определения номера звонящего ТА2 TEST LE P7,(P3#(1/N2_)),Met11 ; Если условие выполнено, то номер ТА2 запомнить в Р3 GATE NU (N1_+P3),Met19 ; Свободен ли телефон с данным номером? Если да, SEIZE (N1_+P3) ; то звонят с него ; Поиск свободного внешнего выхода ASSIGN 7,(RN343/1000) ; Обращение к генератору RN TEST LE P7,(N3_/(N1_+N3_)),Met12 ; Если условие выполнено, то нужен внешний выход ASSIGN 4,(N1_+N2_) ; Подготовка к циклу Met13 ASSIGN 4+,1 ; Начало цикла определения номера свободного внешнего выхода GATE U P4,Met14 ; Свободен ли внешний выход? TEST GE P4,(N1_+N2_+N3_),Met13 ; Все ли внешние выходы проверены и не найдено свободного выхода? ADVANCE Tog3,Tog03 ; Если да, то задержаться и RELEASE (N1_+P3) ; Освободить телефон с номером (N1_+P3) Ter5 TERMINATE ; Несостоявшиеся разговоры с ТА2 из-за занятости внешних выходов Met14 SEIZE P4 ; Занять свободный внешний выход SAVEVALUE P4,PR ; Запомнить приоритет абонента, ведущего разговор ADVANCE (Exponential(222,0,Trazg2)) ; Имитация разговора между абонентами ТА2 по внешним выходам RELEASE P4 ; Освободить внешний выход RELEASE (N1_+P3) ; Освободить ТА2 Ter6 TERMINATE ; Состоявшиеся разговоры с ТА2 по внешним выходам ; Определение номера ТА1, на который звонят с ТА2 Met12 ASSIGN 7,(RN343/1000) ; Обращение к генератору RN ASSIGN 6,0 ; Подготовка к циклу Met15 ASSIGN 6+,1 ; Начало цикла определения номера ТА1, на который звонят с ТА2 TEST LE P7,(P6#(1/N1_)),Met15 ; Если условие выполнено, то номер ТА1 запомнить в Р6 GATE NU P6,Met17 ; Свободен ли телефон с данным номером? Если да, ASSIGN 7,(RN343/1000) ; то ответит ли он? TEST LE P7,P10_,Met16 ; Если условие выполнено, то не ответит. Тогда Met17 ADVANCE (Normal(211,Tog2,Tog02)) ; задержаться и RELEASE (N1_+P3) ; освободить телефон с номером N1_+P3 Ter7 TERMINATE ; Несостоявшиеся разговоры с ТА2 из-за занятости ТА1 ; Имитация разговоров абонентов ТА2 и ТА1 Met16 SEIZE P6 ; Занять ТА1 с номером в Р6 ADVANCE (Exponential(222,0,Trazg2)) ; Имитация разговора между абонентами ТА2 и ТА1 RELEASE P6 ; Освободить ТА1 с номером в Р6 RELEASE (N1_+P3) ; Освободить ТА2 с номером N1_+P3 Ter8 TERMINATE ; Состоявшиеся разговоры между абонентами ТА2 и ТА1 Met19 TERMINATE ; Сегмент задания времени моделирования и расчета результатов моделирования GENERATE VrMod ; Задание времени моделирования TEST E TG1,1,Met20 ; Если содержимое счетчика завершений равно 1, то рассчитать SAVEVALUE Ver1,((N$Ter2+N$Ter4)/N$Met0) ; Вероятность ведения разговоров с ТА1 SAVEVALUE Ver2,((N$Ter6+N$Ter8)/N$Met10) ; Вероятность ведения разговоров с ТА2 Met20 TERMINATE 1 ; Фиксация очередного прогона
Приведем результаты моделирования, полученные после 1000 прогонов.
SAVEVALUE RETRY VALUE VER1 0 0.614 VER2 0 0.396
Вероятность ведения разговоров с ТА2 Ver2 = 0,396 меньше, чем Ver1 = 0,614. Одним из факторов, влияющим на это, является вероятность P10_ = 0,7 того, что абонент ТА1 на звонок абонента ТА2 не ответит.
Оставим без изменений все исходные данные, установим лишь равную вероятность не ответа на звонки абонентами обеих категорий P10_ = P5_ = 0,3.
По окончании моделирования получим:
SAVEVALUE RETRY VALUE VER1 0 0.584 VER2 0 0.625
В условиях рыночных отношений производственная и финансовая деятельность организаций сложна и динамична, что требует применения динамических моделей практически во всех вариантах методик проведения
Накопление опыта в области компьютерного моделирования позволило выделить четыре группы бизнес процессов, обладающих спецификой в отношении построения динамических моделей: процессы реализации проектов, процессы производства, процессы распределения и процессы предоставления услуг.
Процессы предоставления услуг - наиболее распространенная область применения динамических моделей. Такие процессы характерны для организаций, предоставляющих услуги по средствам связи, сервис-центров (рестораны, агентства, поликлиники, ремонтные мастерские и т. п.) и предприятий торговли.
Рассмотрим разработку и реализацию подобных моделей в системе моделирования
На дежурстве находятся n1 средств связи (СС) n2 типов (n21 + n22 + … + n2n2 = n2) в течение n3 часов.
Каждое СС может в любой момент времени выйти из строя. В этом случае его заменяют резервным, причем либо сразу, либо по мере его появления. Тем временем, вышедшие из строя СС ремонтируют, после чего содержат в качестве резервного. Всего количество резервных СС - n4.
Ремонт неисправных СС производят n5 мастеров. Время T1, T2, …, Tn2 ремонта случайное и зависит от типа СС, но не зависит от того, какой мастер это СС ремонтирует. Интервалы времени T21, T22, …, T2n2 между отказами находящихся на дежурстве СС случайные.
Прибыль от СС, находящихся на дежурстве, составляет S1 денежных единиц в час. Почасовой убыток при отсутствии на дежурстве одного СС - S2 денежных единиц. Оплата мастера за ремонт неисправного СС - S31, S32, …, S3n2 денежных единиц в час. Затраты на содержание одного резервного СС составляют S4 денежных единиц в час.
25 суток ( 1000 часов ).Исследовать через промежутки времени $$\Delta T = 5*40=200$$ (пять недель) влияние на ожидаемую прибыль различного количества резервных СС и мастеров.
Определить абсолютные величины и относительные коэффициенты ожидаемой прибыли для каждого промежутка времени. Результаты моделирования (относительный коэффициент прибыли) необходимо получить с точностью $$\varepsilon = 0,01$$ и
Сделать выводы об использовании СС, мастеров по промежуткам времени $$\Delta T$$ и необходимых мерах по совершенст вованию бизнес-процесса.
Вариант исходных данных приведен в программе модели (п. 6.6.3).
Уясним задачу на разработку имитационной модели, предварительно разработав структуру системы предоставления услуг связи (рис. 6.5).
Видно, что система предоставления услуг связи представляет собой многофазную многоканальную систему массового обслуживания замкнутого типа.
(рис 6.5) Структура системы предоставления услуг связиКакие ограничения в системе?
Для моделирования двух первых ограничений используем МКУ, а для третьего и четвертого ограничений - транзакты.
Модель бизнес-процесса должна состоять из следующих сегментов:
Сегмент переопределения блоков модели необходим для изменения версий модели, т. е. изменения количества резервных СС и мастеров-ремонтников в ремонтном подразделении, а также номеров строк и столбцов матриц, в которые записываются результаты моделирования.
Предполагается, что количество типов СС в системе предоставления услуг связи может изменяться от одного до максимального значения n1_. Программа модели построена для n1_ =5.
Для хранения результатов моделирования используются матрицы. В целях придания неизменности программы модели при варьировании количеством типов СС матрицы должны быть пронумерованы. Однако MATRIX не позволяет вместо имени указывать число. Матрицы нужно вначале описать, дав им имена, а затем пронумеровать.
Результаты моделирования для одного типа СС хранятся в трех матрицах, например, для СС типа 1 ( СС1 ) с идентификаторами:
Prib1 - матрица ожидаемой прибыли СС1 ;KPr1 - матрица коэффициентов прибыли СС1 ;KZen1 - матрица коэффициентов использования СС1.Значит, аналогичных матриц будет пятнадцать. Да плюс еще матрица KRem коэффициентов использования мастеров - ремонтников. Именам этим шестнадцати матрицам даны номера.
Три матрицы для хранения суммарных результатов моделирования для СС всех типов не нумеровались:
Pribil - матрица суммарной прибыли;SrKPrib - матрица средних коэффициентов прибыли СС всех типов;SrKIsp - матрица коэффициентов использования СС всех типов.Именам пяти МКУ СС1_, СС2_, СС3_, СС4_ и СС5_, имитирующим по типам СС, находящиеся на дежурстве, даны номера 1 … 5. Это позволяет сократить число блоков в модели за счет того, что вместо пяти (в данном варианте модели) сегментов имитации постановки на дежурство СС используется один сегмент.
Для записи исходных данных (количества СС всех типов (в том числе и резервных), среднего времени наработки до отказа и среднего времени восстановления по типам СС, дохода по типам от одного СС, находящегося на дежурстве, убытка по типам при отсутствии одного СС на дежурстве, стоимости по типам одного резервного СС) используются функции KolSS, KollSSRes, NarOtk, SrVrRem, S1_, S2_, S3_ соответственно. По сравнению с использованием матриц для записи этих же данных программа модели сокращается на двадцать пять строк.
В начале работы модели генератор сразу вырабатывает количество транзактов, равное соответствующему количеству типов СС, и перестает быть активным.
Далее блоками SAVEVALUE и ASSIGN в параметр 1 каждого из транзактов последовательно заносятся коды 1 … n1_ - СС.
Затем каждый из транзактов с помощью блока SPLIT расщепляется (копируется, размножается) по количеству СС (с учетом резервных) соответствующего типа. После расщепления транзакты в соответствии с типом СС сразу занимают все каналы МКУ, имитирующие нахождение СС на дежурстве.
Вышедшее из строя СС снимается с дежурства, поступает в ремонтное подразделение - транзакт либо занимает свободный канал МКУ Rem, если такой есть, либо при отсутствии свободного канала помещается в список задержки этого МКУ - список тран-зактов, ожидающих возможность занять освободившиеся каналы МКУ.
После ремонта СС отправляется либо сразу на дежурство, либо в резерв. В обоих случаях транзакт направляется на метку Met1. Здесь также транзакт либо занимает свободный канал, либо помещается в список задержки МКУ, соответствующего типу СС.
Ниже приводится программа только (в целях сокращения) для моделирования случая три мастера-ремонтника, а резервных СС2 - четыре, пять и шесть. Количество типов СС - n1_ = 4.
; Модель бизнес-процесса ; Задание номеров матрицам Prib1 EQU 1 ; Матрица ожидаемой прибыли СС1 KPr1 EQU 2 ; Матрица коэффициентов прибыли СС1 KZen1 EQU 3 ; Матрица коэффициентов использования СС1 Prib2 EQU 4 ; Матрица ожидаемой прибыли СС2 KPr2 EQU 5 ; Матрица коэффициентов прибыли СС2 KZen2 EQU 6 ; Матрица коэффициентов использования СС2 Prib3 EQU 7 ; Матрица ожидаемой прибыли СС3 KPr3 EQU 8 ; Матрица коэффициентов прибыли СС3 KZen3 EQU 9 ; Матрица коэффициентов использования СС3 Prib4 EQU 10 ; Матрица ожидаемой прибыли СС4 KPr4 EQU 11 ; Матрица коэффициентов прибыли СС4 KZen4 EQU 12 ; Матрица коэффициентов использования СС4 Prib5 EQU 13 ; Матрица ожидаемой прибыли СС5 KPr5 EQU 14 ; Матрица коэффициентов прибыли СС5 KZen5 EQU 15 ; Матрица коэффициентов использования СС5 KRem EQU 16 ; Матрица коэффициентов использования Rem ; Задание номеров МКУ, имитирующих дежурство СС CC1_ EQU 1 ; Задание номера МКУ СС1 CC2_ EQU 2 ; Задание номера МКУ СС2 CC3_ EQU 3 ; Задание номера МКУ СС3 CC4_ EQU 4 ; Задание номера МКУ СС4 CC5_ EQU 5 ; Задание номера МКУ СС5 ; Задание матриц Prib1 MATRIX ,3,5 ; Матрица ожидаемой прибыли СС1 KPr1 MATRIX ,3,5 ; Матрица коэффициентов прибыли СС1 KZen1 MATRIX ,3,5 ; Матрица коэффициентов загрузки СС1 Prib2 MATRIX ,3,5 ; Матрица ожидаемой прибыли СС2 KPr2 MATRIX ,3,5 ; Матрица коэффициентов прибыли СС2 KZen2 MATRIX ,3,5 ; Матрица коэффициентов загрузки СС2 Prib3 MATRIX ,3,5 ; Матрица ожидаемой прибыли СС3 KPr3 MATRIX ,3,5 ; Матрица коэффициентов прибыли СС3 KZen3 MATRIX ,3,5 ; Матрица коэффициентов загрузки СС3 Prib4 MATRIX ,3,5 ; Матрица ожидаемой прибыли СС4 KPr4 MATRIX ,3,5 ; Матрица коэффициентов прибыли СС4 KZen4 MATRIX ,3,5 ; Матрица коэффициентов загрузки СС4 Prib5 MATRIX ,3,5 ; Матрица ожидаемой прибыли СС5 KPr5 MATRIX ,3,5 ; Матрица коэффициентов прибыли СС5 KZen5 MATRIX ,3,5 ; Матрица коэффициентов загрузки СС5 KRem MATRIX ,3,5 ; Матрица коэффициентов загрузки Rem Pribil MATRIX ,3,5 ; Матрица суммарной прибыли SrKPrib MATRIX ,3,5 ; Матрица коэффициентов прибыли СС всех типов SrKIsp MATRIX ,3,5 ; Матрица коэффициентов загрузки СС всех типов KolSS MATRIX ,2,5 ; Матрица количества СС всех типов NarOtk MATRIX ,1,5 ; Матрица среднего времени наработки до отказа по типам СС, час SrVrRem MATRIX ,1,5 ; Матрица среднего ремонта по типам СС, час ; Определение МКУ по числу СС, находящихся на дежурстве CC1_ STORAGE 35 ; Емкость МКУ по количеству СС1 CC2_ STORAGE 100 ; Емкость МКУ по количеству СС2 CC3_ STORAGE 60 ; Емкость МКУ по количеству СС3 CC4_ STORAGE 45 ; Емкость МКУ по количеству СС4 CC5_ STORAGE 60 ; Емкость МКУ по количеству СС5 Rem STORAGE 3 ; Емкость МКУ по числу мастеров-ремонтников ; Исходные данные VrMod EQU 200 ; Время моделирования, 1 ед. мод. вр. = 1 час Stroka EQU 1 ; Номер строки матрицы Stolbez EQU 1 ; Номер столбца матрицы n1_ EQU 5 ; Количество типов СС StoMast FUNCTION P1,D5 ; Стоимость работы одного мастера 1,17/2,18/3,16/4,20/5,21 KolSS FUNCTION P1,D5 ; Количество по типам СС, находящихся на дежурстве 1,55/2,100/3,60/4,45/5,60 KolSSRes FUNCTION P1,D5 ; Количество по типам резервных СС 1,2/2,4/3,4/4,3/5,4 NarOtk FUNCTION P1,D5 ; Среднее время наработки до отказа по типам СС, час 1,373/2,301/3,482/4,325/5,470 SrVrRem FUNCTION P1,D5 ; Среднее время ремонта по типам СС 1,6.5/2,4.2/3,2.8/4,3/5, 5.5 S1_ FUNCTION P1,D5 ; Доход по типам от одного СС, находящегося на дежурстве 1,20/2,24.2/3,32.8/4,23/5, 25.5 S2_ FUNCTION P1,D5 ; Убыток по типам при отсутствии одного СС на дежурстве 1,32/2,34.2/3,37/4,31/5,32.5 S3_ FUNCTION P1,D5 ; Стоимость по типам содержания одного резервного СС 1,21/2,24.2/3,28/4,26/5, 25.5 ; Арифметические выражения для расчета показателей DoxMax VARIABLE VrMod#FN$S1_#FN$KolSS ; Максимальный доход от дежурства СС Ubitok VARIABLE VrMod#FN$KolSS#(1-SR*1/1000)#FN$S2_ ; Убыток от отсутствия на дежурстве СС DoxPol VARIABLE X$DoxMax-X$Ubitok ; Полученный доход от дежурства СС StoRem VARIABLE (VrMod#SM$Rem#FN$StoMast)#(SR$Rem/1000) ; Стоимость ремонта неисправных СС ZatrResSS VARIABLE FN$S3_#FN$KolSSRes#VrMod ; Затраты на содержание резервных СС SumPrib VARIABLE X$DoxPol-(X$StoRem+X$ZatrResSS) ; Прибыль KoefPr VARIABLE MX*3(Stroka,Stolbez)/X$DoxMax ; Коэффициент прибыли ; Сегмент имитации постановки на дежурство СС GENERATE ,,,n1_ SAVEVALUE TipSS+,1 ; Код 1 ... n2_ - признак СС1 ... CCn1 в X$TipSS ASSIGN 1,X$TipSS ; Код 1 ... n2_ - признак СС1 ...CCn2_ в P1 SPLIT (FN$KolSS+FN$KolSSRes-1) ; Число СС + резервные СС ; Сегмент имитации дежурства СС Met1 ENTER P1 ; Встать на дежурство СС типа с номером в Р1 ADVANCE (Exponential(30,0,FN$NarOtk)) ; Имитация выхода из строя СС LEAVE P1 ; Снятие с дежурства из-за выхода из строя СС типа, номер которого в Р1 ; Сегмент имитации работы ремонтного подразделения ENTER Rem ; Занять одного мастера ADVANCE (Exponential(31,0,FN$SrVrRem)) ; Имитация ремонта LEAVE Rem ; Конец ремонта TRANSFER ,Met1 ; Направить исправное СС на дежурство или в резерв ; Сегмент задания времени моделирования и расчета результатов GENERATE VrMod TEST E TG1,1,Met2 Met23 ASSIGN 1+,1 ; Начало цикла изменения типов СС SAVEVALUE DoxMax,V$DoxMax ; Максимально возможный доход от дежурства СС SAVEVALUE Ubitok,V$Ubitok ; Убыток SAVEVALUE DoxPol,V$DoxPol ; Полученный доход от дежурства СС SAVEVALUE StoRem,V$StoRem ; Затраты на ремонт SAVEVALUE ZatrResSS,V$ZatrResSS ; Затраты на резервные СС SAVEVALUE SumPrib,V$SumPrib ; Суммарная прибыль ASSIGN 2,(P1#3) ASSIGN 3,(P2-2) MSAVEVALUE *3,Stroka,Stolbez,X$SumPrib ; Прибыль по типу СС MSAVEVALUE Pribil+,Stroka,Stolbez,X$SumPrib ; Суммарная прибыль по СС всех типов ASSIGN 4,V$KoefPr ; Коэфициент прибыли по типам СС в Р4 ASSIGN 3,(P2-1) MSAVEVALUE *3,Stroka,Stolbez,P4 ; Коэфициент прибыли по типам СС MSAVEVALUE SrKPrib+,Stroka,Stolbez,(P4/n1_) ; Средний коэффициент прибыли по СС всех типов MSAVEVALUE *2,Stroka,Stolbez,(SR*1/1000) ; Коэффициент использования CC MSAVEVALUE SrKIsp+,Stroka,Stolbez,(SR*1/(1000#n1_)) ; Средний коэффициент использования CC всех типов TEST GE P1,n1_,Met23 MSAVEVALUE 16,Stroka,Stolbez,(SR$Rem/1000); Коэффициент использования Rem SAVEVALUE TipSS,0 Met2 TERMINATE 1 START 1000,NP ; Недели 1-5: Резервных СС2=4, мастеров=3 ; Сегмент переопределения блоков - изменения версий модели Stolbez EQU 2 RESET START 1000,NP ; Недели 6-10: Резервных СС2=4, масте-ров=3 Stolbez EQU 3 RESET START 1000,NP ; Недели 11-15: Резервных СС2=4, мас-теров=3 Stolbez EQU 4 RESET START 1000,NP ; Недели 16-20: Резервных СС2=4, мас-теров=3 Stolbez EQU 5 RESET START 1000,NP ; Недели 21-25: Резервных СС2=4, мас-теров=3 KolSSRes FUNCTION P1,D5 ; Количество резервных СС2 1,2/2,5/3,4/4,4/5,4 Stroka EQU 2 Stolbez EQU 1 RESET START 1000,NP ; Недели 1-5: Резервных СС2=5, мастеров=3 Stolbez EQU 2 RESET START 1000,NP ; Недели 6-10: Резервных СС2=5, мастеров=3 Stolbez EQU 3 RESET START 1000,NP ; Недели 11-15: Резервных СС2=5, мастеров=3 Stolbez EQU 4 RESET START 1000,NP ; Недели 16-20: Резервных СС2=5, мастеров=3 Stolbez EQU 5 RESET START 1000,NP ; Недели 21-25: Резервных СС2=5, мастеров=3 KolSSRes FUNCTION P1,D5 ; Количество резервных СС2 1,2/2,6/3,4/4,5/5,4 Stroka EQU 3 Stolbez EQU 1 RESET START 1000,NP ; Недели 1-5: Резервных СС2=6, мастеров=3 Stolbez EQU 2 RESET START 1000,NP ; Недели 6-10: Резервных СС2=6, мастеров=3 Stolbez EQU 3 RESET START 1000,NP ; Недели 11-15: Резервных СС2=6, мастеров=3 Stolbez EQU 4 RESET START 1000,NP ; Недели 16-20: Резервных СС2=6, мастеров=3 Stolbez EQU 5 RESET START 1000 ; Недели 21-25: Резервных СС2=6, мастеров=3
В программе, кроме методов применения матриц и функций, показывается метод изменения версий модели. Изменение версий модели производится переопределением соответствующих блоков. Переопределяться не могут блоки GENERATE. Для переопределения блоков, описывающих ОКУ и МКУ, они должны иметь метки. Однако одного переопределения блоков недостаточно. В RESET и CLEAR.
В рассматриваемом примере в процессе моделирования необходимо собирать статистику по отрезкам времени \Delta T. То есть предшествующую статистику нужно сбросить, но оставить неизменными условия функционирования системы.
Сброс в ноль статистики без удаления транзактов из процесса моделирования осуществляет команда RESET. Команда RESET не имеет операндов:
RESET
Команда также не сбрасывает генераторы случайных чисел, ячейки и матрицы ячеек, не влияет на абсолютное модельное время и нумерацию транзактов. Относительное модельное время (после последней команды RESET ) устанавливается равным нулю. Таким образом, с помощью команды RESET обеспечивается удобное средство сбора статистических данных в типичных условиях функционирования систем.
После того как для данной версии модели выполнено моделирование в течение заданного числа отрезков времени \Delta T (в примере - пять), нужно изменить версию модели и провести моделирование сначала.
Изменение версии в данной модели производится переопределением функции KolSSRes, т. е. изменением количества резервных СС2, например:
KolSSRes FUNCTION P1,D5 ; Количество резервных СС2 1,2/2,5/3,4/4,4/5,4
Процесс моделирования в исходное состояние возвращает команда CLEAR. Формат записи команды:
CLEAR [A]
Операнд А может быть ON либо OFF. По умолчанию - ON.
Команда CLEAR сбрасывает всю накопленные статистические данные, удаляет все транзакты из процесса моделирования и заполняет все блоки GENERATE первым транзактом. ОКУ и МКУ становятся доступными, устанавливаются в незанятое состояние. Содержимое всех блоков становится нулевым. Генераторы случайных чисел не сбрасываются.
Если в команде CLEAR операнд А равен OFF, то сохраняемые ячейки, матрицы и логические ключи остаются без изменений. Поэтому в модели в команде CLEAR используется операнд А, равный OFF, так как нужно сохранить результаты моделирования для предыдущей версии модели.
Однако при этом нужно иметь в виду те ячейки, начальные значения которых должны быть нулевыми в новой версии модели. Необходимо предусмотреть в программе блоки приведения таких ячеек в исходное состояние. В данной модели это показано на примере сохраняемой ячейки TipSS. Если эту ячейку не привести в нулевое состояние, процесс моделирования второй версии будет остановлен по ошибке "Обращение к несуществующей памяти".
Поскольку накопленные и сохраненные в матрицах результаты моделирования нет необходимости выводить на каждом отрезке \Delta T, то в команде START используется операнд B, равный ON. В последней команде START операнд B не используется. Поэтому стандартный отчет выдается после завершения моделирования. В рассматриваемом примере - после пятнадцати наблюдений.
Ниже показан фрагмент журнала с информацией о ходе моделирования. В первых пяти наблюдениях (первой версии модели) команда RESET не влияет на абсолютное модельное время, которое растет от 0 до 1 000 000 единиц модельного времени.
После переопределения (формирования второй версии модели) выполняется команда CLEAR и абсолютное модельное время вновь изменяется от 0 до 1 000 000 единиц модельного времени.
06/05/08 17:29:10 Model Translation Begun. 06/05/08 17:29:10 Ready. 06/05/08 17:29:10 Simulation in Progress. 06/05/08 17:29:15 The Simulation has ended. Clock is 200000.000000. 06/05/08 17:29:15 Simulation in Progress. 06/05/08 17:29:19 The Simulation has ended. Clock is 400000.000000. 06/05/08 17:29:19 Simulation in Progress. 06/05/08 17:29:24 The Simulation has ended. Clock is 600000.000000. 06/05/08 17:29:24 Simulation in Progress. 06/05/08 17:29:28 The Simulation has ended. Clock is 800000.000000. 06/05/08 17:29:28 Simulation in Progress. 06/05/08 17:29:32 The Simulation has ended. Clock is 1000000.000000. 06/05/08 17:29:33 Simulation in Progress. 06/05/08 17:29:37 The Simulation has ended. Clock is 200000.000000. 06/05/08 17:29:37 Simulation in Progress. 06/05/08 17:29:41 The Simulation has ended. Clock is 400000.000000. 06/05/08 17:29:41 Simulation in Progress. … 06/05/08 17:30:17 Reporting in Rem_SS_2.59.1 - REPORT Window.
Для включения в формируемый стандартный отчет матриц необходимо при открытом объекте "Модель" выполнить команду:
Edit/Settings/Reports/Matrices/Применить/Ok
Результаты моделирования после 1000 прогонов приведены ниже. Но опять же в целях сокращения - для СС1 и СС всех типов.
| MATRIX | RETRY | INDICES | VALUE |
|---|---|---|---|
| PRIB1 | 0 | ||
| 1 1 | 181586.183 | ||
| 1 2 | 181251.160 | ||
| 1 3 | 179584.944 | ||
| 1 4 | 181774.706 | ||
| 1 5 | 182291.154 | ||
| 2 1 | 180844.964 | ||
| 2 2 | 181435.896 | ||
| 2 3 | 181478.223 | ||
| 2 4 | 179347.815 | ||
| 2 5 | 179178.486 | ||
| 3 1 | 178683.512 | ||
| 3 2 | 178136.334 | ||
| 3 3 | 179139.261 | ||
| 3 4 | 181934.517 | ||
| 3 5 | 179655.938 | ||
| KPR1 | 0 | ||
| 1 1 | .825 | ||
| 1 2 | .823 | ||
| 1 3 | .816 | ||
| 1 4 | .826 | ||
| 1 5 | .828 | ||
| 2 1 | .822 | ||
| 2 2 | .824 | ||
| 2 3 | .824 | ||
| 2 4 | .815 | ||
| 2 5 | .814 | ||
| 3 1 | .812 | ||
| 3 2 | .809 | ||
| 3 3 | .814 | ||
| 3 4 | .826 | ||
| 3 5 | .816 | ||
| KZEN1 | 0 | ||
| 1 1 | .943 | ||
| 1 2 | .942 | ||
| 1 3 | .937 | ||
| 1 4 | .943 | ||
| 1 5 | .945 | ||
| 2 1 | .941 | ||
| 2 2 | .942 | ||
| 2 3 | .942 | ||
| 2 4 | .936 | ||
| 2 5 | .936 | ||
| 3 1 | .935 | ||
| 3 2 | .933 | ||
| 3 3 | .936 | ||
| 3 4 | .944 | ||
| 3 5 | .937 | ||
| 3 5 | .601 | ||
| KREM | 0 | ||
| 1 1 | .981 | ||
| 1 2 | .982 | ||
| 1 3 | .984 | ||
| 1 4 | .978 | ||
| 1 5 | .981 | ||
| 2 1 | .983 | ||
| 2 2 | .982 | ||
| 2 3 | .982 | ||
| 2 4 | .984 | ||
| 2 5 | .982 | ||
| 3 1 | .985 | ||
| 3 2 | .984 | ||
| 3 3 | .984 | ||
| 3 4 | .979 | ||
| 3 5 | .982 | ||
| PRIBIL | 0 | ||
| 1 1 | 1111897.023 | ||
| 1 2 | 1110398.484 | ||
| 1 3 | 1102062.813 | ||
| 1 4 | 1113459.610 | ||
| 1 5 | 1114232.258 | ||
| 2 1 | 1105731.875 | ||
| 2 2 | 1107881.589 | ||
| 2 3 | 1111610.502 | ||
| 2 4 | 1098478.153 | ||
| 2 5 | 1097605.578 | ||
| 3 1 | 1094679.743 | ||
| 3 2 | 1091129.285 | ||
| 3 3 | 1096084.094 | ||
| 3 4 | 1107311.254 | ||
| 3 5 | 1097609.762 | ||
| SRKPRIB | 0 | ||
| 1 1 | .844 | ||
| 1 2 | .843 | ||
| 1 3 | .837 | ||
| 1 4 | .846 | ||
| 1 5 | .846 | ||
| 2 1 | .839 | ||
| 2 2 | .840 | ||
| 2 3 | .843 | ||
| 2 4 | .833 | ||
| 2 5 | .832 | ||
| 3 1 | .829 | ||
| 3 2 | .826 | ||
| 3 3 | .830 | ||
| 3 4 | .839 | ||
| 3 5 | .831 | ||
| SRKISP | 0 | ||
| 1 1 | .954 | ||
| 1 2 | .953 | ||
| 1 3 | .948 | ||
| 1 4 | .954 | ||
| 1 5 | .955 | ||
| 2 1 | .956 | ||
| 2 2 | .957 | ||
| 2 3 | .959 | ||
| 2 4 | .952 | ||
| 2 5 | .951 | ||
| 3 1 | .955 | ||
| 3 2 | .953 | ||
| 3 3 | .956 | ||
| 3 4 | .962 | ||
| 3 5 | .957 |
На вычислительный комплекс коммутации сообщений (ВККС) поступают сообщения от $$n_{1}$$ абонентов с интервалами времени $$T_{1}, T_{2}, ...,T_{n1}$$. Сообщения могут быть $$n_{2} $$ категорий с вероятностями $$p_{1}, p_{2}, ..., p_{n2} (p_{1} + p_{2} + p_{n2} = 1$$ ) и вычислительными сложностями их обработки $$S_{1}, S_{2}, ..., S_{n2}$$ операций (оп) соответственно. Вычислительные сложности случайные. ВККС имеет входной накопитель емкостью $$L_{1} $$ байт для хранения сообщений, ожидающих передачи. Сообщения 1-й категории обладают относительным приоритетом по отношению к сообщениям остальных категорий при обработке на ВККС. В буфере сообщения размещаются в соответствии с приоритетом.
ВККС обрабатывает сообщения с производительностью $$Q $$ оп/с. После обработки сообщения передаются по $$n_{3}$$ каналам связи. Скорость передачи $$V_{п}$$ бит/с. Сообщения 1-й категории обладают абсолютным приоритетом по отношению к сообщениям других категорий. Поэтому если после обработки сообщения все $$n_{3}$$ каналов связи заняты передачей сообщений 1-й категории, обработанное сообщение помещается в накопитель каналов связи, если в нем есть место, иначе - теряется. Если же по какому-либо каналу передается сообщение другой категории, происходит прерывание передачи этого сообщения и передается сообщение 1-й категории. Емкость накопителя каналов связи ограничена $$L_{2}$$ сообщениями.
ВККС и каналы связи имеют конечную надежность. Интервалы времени $$T_{от1}$$ и $$T_{от2}$$ между отказами ВККС и каналов связи случайные. Длительности восстановления $$T_{в1}$$ и $$T_{в2}$$ ВККС и каналов связи случайные. При отказе канала связи передаваемые сообщения 1-й категории сохраняются в накопителе каналов, если в нем есть место. При выходе из строя ВККС с вероятностью $$p_{c}$$ все сообщения в накопителе ВККС и накопителе каналов связи сохраняются, обрабатываемое сообщение теряется, а прием ВККС и передача сообщений по каналам связи прекращается. Все поступающие в это время сообщения теряются.
Разработать имитационную модель функционирования ВККС. Исследовать влияние емкостей входных накопителей, интервалов времени $$T _{1},T_{2},...,T_{6} $$ и вероятностей $$p _{1}$$ и $$p_{2} $$ на вероятности передачи сообщений по категориям и в целом через ВККС в течение двух часов. Провести дисперсионный и регрессионный анализы. Сделать выводы о загруженности элементов ВККС и необходимых мерах по повышению эффективности его функционирования.
Результаты моделирования необходимо получить с точностью $$\varepsilon = 0,01$$ и
Представим систему, имитационную модель которой предстоит разработать, схемой (рис. 6.6).
Видно, что ВККС - это многофазная
В структуре системы выделен блок контроля состояний ВККС, каналов связи ( GATE ) и их накопителей ( TEST ).
В модели сообщения следует представить транзактами, ВККС и каналы связи - одноканальными устройствами. Так как количество каналов связи может быть любым, то целесообразно идентифицировать их не именами, а номерами. Тогда в ходе моделирования для указания номеров этих устройств нужно будет использовать параметр транзакта, например, номер четыре, предварительно записав в него номер устройства.
Для имитации накопителей будет использоваться список пользователя, т. е. блоки LINK и UNLINK. Но так как емкость накопителя ВККС определяется в байтах, а список пользователя не позволяет вести в них учет, следует ввести сохраняемую ячейку и в ней вести учет текущей емкости накопителя. Также примем, что объем накопителя, занимаемый сообщением, равен его вычислительной сложности.
Для моделирования неисправностей ВККС и каналов связи нужно использовать блоки FUNAVAIL и F AVAIL. В этом случае статистика ОКУ не будет искажена, как это могло быть при использовании блоков PREEMPT и RETURN.
(рис 6.6) ВККС как система массового обслуживания
Программа модели согласно декомпозиции ВККС (рис. 6.6) должна иметь:
Программа модели функционирования ВККС приведена ниже.
; Модель функционирования ВККС ; Задание исходных данных VrMod EQU 7200 ; Время моделирования, 1 ед. мод. вр. = 1с NCan EQU 3 ; Число каналов n1_ EQU 6 ; Количество источников сообщений MaxKat EQU 3 ; Максимальное число категорий сообщений T_ EQU 118.4 ; Средний интервал времени поступления сообщений от источника Q EQU 3600 ; Производительность ВККС, оп/c V_ EQU 5000 ; Скорость передачи, бит/с Pc_ EQU 0.7 ; Вероятность потери сообщений при отказе ВККС L1_ EQU 2500000 ; Емкость накопителя ВККС, байт L2_ EQU 5 ; Емкость накопителя каналов связи, сообщений TOtk1 EQU 3600 ; Среднее время между отказами ВККС TOtk2 EQU 1800 ; Среднее время между отказами каналов TVost1 EQU 3.7 ; Среднее время восстановления ВККС TVost2 EQU 4.2 ; Среднее время восстановления каналов ; Описание функций, задающих исходные данные Kat FUNCTION RN34,D3 ; Вероятности видов категорий .3,1/.5,2/1,3 S_ FUNCTION P1,D3 ; Средние вычислительные сложности сообщений (длины), оп (байт) по категориям 1,53000/2,86000/3,66000 So_ FUNCTION P1,D3 ; Среднеквадратические отклонения вычис- лительных сложностей (длин) сообщений, оп (байт) по категориям 1,6100/2,5000/3,7000 ; Арифметические выражения вычисления DL VARIABLE INT(NORMAL(114,FN$S_,FN$So_)) ; Длин (вычислительных сложностей) сообщений VrPer VARIABLE (P2/V_)#8 ; Времени передачи сообщения VrObr VARIABLE P2/Q_ ; Времени обработки сообщения ; Сегмент имитации поступления сообщений от источников GENERATE (Exponential(11,0,(T_/n1_))) ; Источники сообщений ; Розыгрыш категории сообщения и счета сообщений Met4 ASSIGN 1,FN$Kat ; Запись в Р1 кода категории и счет сообщений всех категорий ASSIGN 10,(P1+MaxKat) ; Запись в Р10 номера Х для счета поступающих сообщений по категориям ASSIGN 11,(P10+MaxKat) ; Запись в Р11 номера Х для счета переданных сообщений по категориям ASSIGN 12,(P11+MaxKat) ; Запись в Р12 номера Х для счета потерянных сообщений по категориям ASSIGN 13,(P12+MaxKat) ; Запись в Р13 номера Х для записи вероятности переданных сообщений по категориям ASSIGN 14,(P13+MaxKat) ; Запись в Р14 номера Х для записи вероятности потерянных сообщений по категориям SAVEVALUE P10+,1 ; Cчет поступающих сообщений по категориям ; Розыгрыш характеристик сообщений Met02 ASSIGN 2,V$DL ; Занесение в Р2 длины (вычислительной сложности) сообщения ASSIGN 3,V$VrPer ; Занесение в Р3 времени передачи сообщения ASSIGN 8,V$VrObr ; Занесение в Р8 времени обработки сообщения ASSIGN 7,0 ; Код 0 в Р7 - признак попадания сообщения в накопитель TEST E P1,1,Met111 ; Если сообщение 1 категории, то PRIORITY 1 ; сообщению 1 категории - высокий приоритет ;Сегмент имитации работы накопителя 1 и ВККС Met111 GATE FV Vkks,Met5 ; Проверка ВККС на исправность GATE U Vkks,Met17 ; Проверка ВККС на занятость TEST LE P2,(L1_-X$TEmk),Met5 ; Есть ли место в накопителе ВККС? SAVEVALUE TEmk+,P2 ; Увеличение текущей емкости накопителя на длину сообщения LINK SVkks,PR ; Поместить сообщение в накопитель ВККС Met17 ASSIGN 7,1 ; Признак: сообщение поступило на ВККС, минуя накопитель Met14 SEIZE Vkks ; Занять ВККС ADVANCE P8 ; Имитация обработки RELEASE Vkks ; Освобождение ВККС TEST E P7,0,Met18 ; Если Р7 =0, то SAVEVALUE TEmk-,P2 ; уменьшить текущую емкость накопителя ВККС на длину обработанного сообщения Met18 UNLINK SVkks,Met111,1 ; Очередное сообщение из накопителя ВККС послать на обработку ; Сегмент имитации работы накопителя 2 и каналов связи Met15 ASSIGN 4,NCan ; Подготовка к циклу Met16 GATE FV P4,Met23 ; Начало цикла поиска исправного и свободного канала. ;Исправен ли канал? Если да, то GATE U P4,Met21 ; занят ли канал? Если нет, на Met21-занять канал TEST E X*4,1,Met61 ; Если канал занят сообщением низкого приоритета, то прервать Met23 LOOP 4,Met16 ; Все ли каналы просмотрены? Если нет, продолжить поиск TEST L CH$SCan_,L2_,Met5 ; Есть ли место в накопителе каналов? LINK SCan_,PR ; Сообщение в накопитель каналов Met21 SEIZE P4 ; Занять канал с номером в Р4 SAVEVALUE P4,P1 ; Занести код категории в ячейку с номером в Р4 ADVANCE P3 ; Имитация передачи сообщения RELEASE P4 ; Освобождение канала с номером в Р4 UNLINK SCan_,Met15,1 ; Очередное сообщение из накопителя каналов на передачу TRANSFER ,Met10 ; Счет переданных сообщений ; Имитация передачи по каналам с прерыванием Met61 SAVEVALUE P4,P1 ; Занести PR в ячейку с номером в Р4 PREEMPT P4,PR,Met62 ; Занять канал с номером в Р4 ADVANCE P3 ; Имитация передачи сообщения RETURN P4 ; Освобождение канала с номером в Р4 UNLINK SCan_,Met15,1 ; Очередное сообщение из накопителя каналов на передачу TRANSFER ,Met10 ; Счет переданных сообщений Met62 RELEASE P4 ; Освободить канал с номером в Р4 TRANSFER ,Met15 ; Отправить в накопитель каналов ;Сегмент имитации отказов ВККС GENERATE ,,,1 Met49 ADVANCE (Exponential(237,0,TOtk1)) ; Розыгрыш времени до очередного отказа ASSIGN 1,(RN35/1000) ; Обращение к датчику RN TEST LE P1,Pc_,Met50 ; Все ли сообщения в накопителях теряются? Met51 FUNAVAIL Vkks,RE,Met115 ; Перевод ВККС в неисправное состояние ADVANCE (Exponential(237,0,TVost1)) ; Имитация восстановления FAVAIL Vkks ; Перевод ВККС в исправное состояние TRANSFER ,Met49 ; Отправить для розыгрыша очередного отказа Met115 RELEASE Vkks ; Освобождение ВККС прерванным сообщением TEST E P7,0,Met5 ; Если Р7=0, то SAVEVALUE TEmk-,P2 ; уменьшить текущую емкость накопителя ВККС на длину потерянного сообщения TRANSFER ,Met5 ; Отправить для счета потерь Met50 UNLINK SVkks,Met5,ALL ; Потеря всех сообщений из накопителя ВККС UNLINK SCan_,Met5,ALL ; Потеря всех сообщений из накопителя каналов SAVEVALUE TEmk,0 ; Значение текущей емкости =0 TRANSFER ,Met51 ; Отправить для перевода ВККС в неисправное состояние ;Сегмент имитации отказов каналов связи GENERATE ,,,NCan ; Число транзактов - по числу каналов связи SAVEVALUE NumCan+,1 ; Записать в X$NumCan последовательно 1, 2, ..., NCan ASSIGN 4,X$NumCan ; Записать в Р4 последовательно 1, 2, ..., NCan Met19 ADVANCE (Exponential(237,0,TOtk2)) ; Розыгрыш времени до очередного отказа GATE FV P4,Met19 FUNAVAIL P4,RE,Met112 ; Перевод канала в неисправное состояние ADVANCE (Exponential(237,0,TVost2)) ; Имитация восстановления канала FAVAIL P4 ; Перевод в исправное состояние TRANSFER ,Met19 ; Отправить для розыгрыша очередного отказа Met112 RELEASE P4 ; Освобождение канала с номером 1 TEST E P1,1,Met5 ; Если сообщение 1 категории, то TRANSFER ,Met15 ; отправить на повторную передачу ; Сегмент счета переданных и потерянных сообщений и расчет вероятностей передачи сообщений Met10 SAVEVALUE P11+,1 ; Cчет и сохранение в ячейке с номером в Р11 переданных сообщений всего и по категориям SAVEVALUE P13,(X*11/X*10) ; Расчет и сохранение в ячейке с номером в Р13 вероятностей передачи по категориям ; SAVEVALUE VPerS,(N$Met10/N$Met4) ; Расчет и сохранение в ячейке VPerS вероятностей передачи сообщений всех категорий TERMINATE Met5 SAVEVALUE P12+,1 ; Cчет и сохранение в ячейке с номером в Р12 потерянных сообщений всего и по категориям SAVEVALUE P14,(X*12/X*10) ; Расчет и сохранение в ячейке с номером в Р14 вероятностей потери сообщений по категориям ; SAVEVALUE VPotS,(N$Met5/N$Met4) ; Расчет и сохранение в ячейке VPotS вероятностей потерь сообщений всех категорий TERMINATE ;Задание времени моделирования GENERATE VrMod ; Задание времени моделирования TERMINATE 1
Для задания исходных данных использованы команда EQU и функции.
Арифметические выражения введены для расчета вычислительных сложностей сообщений, времени их обработки и передачи. Поскольку вычислительная сложность определяется количеством операций, которое не может быть дробным, то для перевода в целое используется встроенная функция INT.
Рассмотрим работу блоковой части модели.
Так как интервалы времени поступления сообщений от источников одинаковы, то блок GENERATE вводит транзакты - сообщения в модель со средним значением интервала (T_/n1_ ).
Предполагается, что число категорий сообщений может изменяться от единицы до определенного максимального значения, поэтому программа модели построена так, чтобы не подвергаться коррекции в таком случае.
Для этого в сегмент имитации поступления сообщений от источников включена последовательность блоков, разыгрывающих категории сообщений. Категория сообщения записывается в параметр Р1 транзакта. Для счета всех поступивших сообщений и в последующем переданных и потерянных сообщений по категориям в параметры Р10…Р14 транзакта записываются номера сохраняемых ячеек. В параметр Р10 записывается номер (Р1+MaxKat), в параметры Р11…Р14 записываются те, которые отличаются в указанной последовательности на максимальное число категорий MaxKat, задаваемое в исходных данных.
Пусть MaxKat = 5. Тогда в зависимости от того, что в Р1:
Р1 = 1; Р10 = 4; Р11 = 7; Р12 = 10; Р13 = 13; Р14 = 16 ;Р1 = 2; Р10 = 5; Р11 = 8; Р12 = 11; Р13 = 14; Р14 = 17 ;Р1 = 3; Р10 = 6; Р11 = 9; Р12 = 12; Р13 = 15; Р14 = 18.Таким образом, распределение номеров сохраняемых ячеек не зависит от количества категорий сообщений.
После счета поступающих сообщений по категориям в сохраняемых ячейках с номерами в параметре Р10 производится розыгрыш и запись характеристик сообщений: вычислительной сложности, времени обработки и времени передачи по описанным ранее арифметическим выражениям. Характеристики записываются в параметры Р2, Р8 и Р3 соответственно.
Если сообщение первой категории, ему присваивается приоритет 1. Все сообщения отправляются на сегмент имитации работы накопителя 1 и ВККС.
Здесь вначале ВККС проверяется на исправность и занятость.
Если ВККС неисправен, сообщение теряется. Транзакт направляется на метку Мет5. Здесь учитывается потерянное сообщение, и рассчитываются вероятности потерь по категориям и в целом по всем категориям. После этого транзакт выводится из модели.
Если ВККС исправен, но занят, проверяется возможность сохранения сообщения в накопителе 1 SVkks. Если достаточно свободной емкости, сообщение помещается в накопитель 1. Его текущая занятая емкость TEmk увеличивается на длину сообщения. Если свободной емкости недостаточно, сообщение теряется. Транзакт направляется на метку Мет5. Здесь выполняются те же действия, что и при возникновении неисправности ВККС.
Если ВККС исправен и свободен, т. е. накопитель 1 пуст, тран-закт направляется на метку Мет17. В параметр Р7 заносится 1 - признак поступления сообщения на обработку, минуя накопитель 1. Транзакт занимает ВККС. После обработки при Р7 = 1 транзакт направляется на Мет18 для вывода очередного сообщения из накопителя 1 (если оно есть) для обработки на ВККС. Выводящий же транзакт - обработанное сообщение направляется в сегмент имитации работы накопителя 2 и каналов связи.
Поиск канала для передачи сообщения организован в цикле Максимально возможное повторение в цикле равно числу каналов связи.
Для организации в модели циклов предназначен блок LOOP. Он имеет следующий формат:
LOOP A,B
Операнд А - параметр транзакта или параметр цикла, в котором содержится число повторений какого-либо участка модели.
Операнд B - метка блока, с которого начинается цикл.
Операнды А и B могут быть именем, положительным целым числом, выражением в скобках, СЧА или СЧА*параметр.
Например, в данной модели блок LOOP используется так:
Met15 ASSIGN 4,NCan ; Подготовка к циклу Met16 GATE FV P4,Met23 ; Начало цикла поиска исправного и свободного канала ; Исправен ли канал? Если да, то GATE U P4,Met21 ; занят ли канал? Если нет, на Met21-занять канал TEST E X*4,1,Met61 ; Если канал занят сообщением низкого приоритета, то прервать Met23 LOOP 4,Met16 ; Все ли каналы просмотрены? Если нет, продолжить поиск
Блок с меткой Мет16 является началом цикла, т. е. расположен раньше блока LOOP. Когда транзакт, пройдя участок модели, начинающийся блоком с меткой Мет16, войдет в блок LOOP, значение его параметра - параметра номер четыре транзакта уменьшается на 1. Если это значение не равно нулю, транзакт переходит к блоку с меткой Мет16, т. е. цикл повторяется. Если же после вычитания 1 значение параметра цикла равно нулю, следовательно, выполнено заданное число повторений, транзакт переходит к следующему блоку.
LOOP значение параметра цикла уменьшается на 1. Значит, значение параметра цикла можно использовать для выбора новых значений каких-либо факторов при очередном повторении. Однако это не всегда удобно, так как величина параметра цикла изменяется от большего к меньшему значению, а не наоборот. В рассматриваемой модели это не имеет принципиального значения.Если в результате поиска находится исправный и свободный канал, транзакт направляется на Мет21 и занимает канал, номер которого содержится в его параметре Р4 (ссылка *4). После имитации передачи транзакт входит в блок UNLINK для вывода очередного сообщения из накопителя 2 на передачу. Выводящий же транзакт - переданное сообщение направляется на метку Мет10. Здесь учитывается переданное сообщение, рассчитываются вероятности передачи сообщений отдельно по категориям и в целом по всем категориям.
Если просмотрены все каналы связи и не найдено свободного канала для передачи сообщения не первой категории, проверяется возможность помещения этого сообщения в накопитель Scan_. При отсутствии свободного места в накопителе Scan_ сообщение теряется, и транзакт направляется на метку Мет5 для учета и вывода из модели.
Если при передаче сообщения первой категории, обладающего абсолютным приоритетом по отношению к сообщениям других категорий, в результате поиска не найдено свободного канала или занятого передачей сообщений более низких
Если же обнаружен канал, занятый передачей сообщения более низкого приоритета, транзакт направляется на метку Мет61. Происходит прерывание сообщения низкого приоритета. Прерванное сообщение направляется на метку Мет15 для проверки возможности размещения его в накопителе каналов связи Scan_. Переданное сообщение выводит из накопителя каналов связи на передачу очередное сообщение и направляется на метку Мет10 для счета.
Теперь рассмотрим сегменты имитации отказов.
Начнем с сегмента имитации отказов ВККС. ВККС в модели представлен ОКУ с именем Vkks. Блок GENERATE вырабатывает один транзакт и становится неактивным. Далее имитация отказов организуется в цикле. Такой метод позволяет уменьшить количество транзактов в модели, сократить машинное время. Ведь можно было бы сделать так, чтобы GENERATE вводил в модель транзакт для имитации каждого отказа ВККС, а блок TERMINATE выводил его после имитации восстановления.
Блоком ADVANCE с меткой Мет49 разыгрывается время до очередного отказа. Затем: все ли сообщения в накопителе теряются? Если да, транзакт направляется на Мет50. Из накопителей SVkks и Scan_ выводятся и теряются все имевшиеся там сообщения. Обнуляется текущая емкость TEmk накопителя SVkks и транзакт направляется к метке Мет51 для перевода ВККС в неисправное (недоступное) состояние. После восстановления транзакт направляется на метку Мет49 для розыгрыша очередного отказа.
Если же не все сообщения теряются, а только те, которые обрабатываются ВККС, он переводится в неисправное состояние. Обрабатываемое сообщение удаляется, и транзакт направляется на метку Мет115.
Если сообщение перед обработкой помещалось в накопитель SVkks, его емкость уменьшается на длину потерянного сообщения. Транзакт направляется на метку Мет5 для счета и уничтожения.
Каналы связи в модели представлены несколькими ОКУ, работающими параллельно. Следовательно, они будут независимо друг от друга выходить из строя. Поэтому блок GENERATE вырабатывает сразу количество транзактов, равное количеству каналов связи NCan_. Далее эти транзакты в соответствии с номером канала, записанным в параметр Р1 каждого из NCan_ транзактов, имитируют выход каналов связи из строя. Предполагается, что время восстановления канала связи значительно меньше времени между его предыдущим и последующим отказами.
После 1000 прогонов получим следующие результаты моделирования:
| SAVEVALUE | RETRY | VALUE |
|---|---|---|
| 1 | 0 | 1.000 |
| 2 | 0 | 1.000 |
| 3 | 0 | 1.000 |
| 4 | 0 | 1094993.000 |
| 5 | 0 | 729783.000 |
| 6 | 0 | 1823763.000 |
| 7 | 0 | 519429.000 |
| 8 | 0 | 320633.000 |
| 9 | 0 | 811566.000 |
| 10 | 0 | 575561.000 |
| 11 | 0 | 409149.000 |
| 12 | 0 | 1012190.000 |
| 13 | 0 | 0.474 |
| 14 | 0 | 0.439 |
| 15 | 0 | 0.445 |
| 16 | 0 | 0.526 |
| 17 | 0 | 0.561 |
| 18 | 0 | 0.555 |
| TEMK | 0 | 2498959.000 |
| VPERS | 0 | 0.453 |
| VPOTS | 0 | 0.547 |
Ранее отмечалось, что осуществить имитацию выхода МКУ из строя, при котором все транзакты, находившиеся в МКУ на обслуживании, теряются, блоками SUNAVAIL и SAVAIL невозможно. Рассмотрим, как это можно осуществить с применением блока на следующем примере.
Многоканальная СМО с отказами без очереди. СМО имеет конечную надежность. При выходе СМО из строя заявки, находившиеся на обслуживании, теряются. Новые заявки на обслуживание не принимаются.
; Модель многоканальной СМО конечной надежности ; Определение МКУ и булевых переменных Emk EQU 7 Zap EQU 2 Sist STORAGE 7 Kont1 BVARIABLE SV$Sist'AND'((7-S$Sist)>=Zap) Kont2 BVARIABLE SE$Sist ; Сегмент имитации поступления и обслуживания заявок GENERATE 2,,,7 ; Источник заявок Met12 TEST E BV$Kont1,1,Met1 ; Есть ли место в МКУ? SAVEVALUE KolPovt,(INT(Emk/Zap)) ENTER Sist,Zap ; Занять МКУ ; Учет номеров транзактов, занявших МКУ ASSIGN KolPovt,X$KolPovt ; Запись в параметр цикла Met5 TEST E X*KolPovt,0,Met4 ; Есть ли в списке место? SAVEVALUE P$KolPovt,XN1 ; Да, записать номер транзакта TRANSFER ,Met6 ; Выйти из цикла Met4 LOOP KolPovt,Met5 ; Повторить или конец цикла ; Met6 ADVANCE 5 ; Имитация обслуживания LEAVE Sist,Zap ; Освободить МКУ ; Учет номеров транзактов, освободивших МКУ ASSIGN KolPovt,X$KolPovt ; Запись в параметр цикла Met8 TEST E X*KolPovt,XN1,Met7 ; Есть ли этот номер транзакта? SAVEVALUE P$KolPovt,0 ; Да, тогда удалить TRANSFER ,Met9 ; Выйти из цикла Met7 LOOP KolPovt,Met8 ; Повторить или конец цикла Met9 TERMINATE 1 ; Обслуженные заявки Met1 TERMINATE 1 ; Потерянные заявки ; Сегмент имитации неисправностей GENERATE ,,,1 Met2 ADVANCE 7.5 ; Интервал отказов SUNAVAIL Sist ; Перевод в недоступность ; Удаление транзактов из МКУ ASSIGN KolPovt,X$KolPovt ; Запись в параметр цикла Met10 TEST NE X*KolPovt,0,Met11 ; Есть ли транзакт в МКУ DISPLACE X*KolPovt,Met3 ; Да, тогда удалить SAVEVALUE P$KolPovt,0 ; Снять с учета Met11 LOOP KolPovt,Met10 ; Повторить или конец цикла TEST E BV$Kont2,1 ; МКУ пуст? ADVANCE 1 ; Да, тогда ремонтируем SAVAIL Sist ; Перевод в доступность TRANSFER ,Met2 Met3 LEAVE Sist,2 ; Освободить МКУ TERMINATE 1 ; Удаленные из МКУ транзакты
В данной модели кроме блока показывается также применение булевых переменных.
Булевы переменные с использованием всего лишь одного блока дают возможность принимать решения в зависимости от состояния и значения атрибутов многих объектов . Булева переменная представляет собой логическое выражение, составленное из различных СЧА, в том числе и других булевых переменных.
Булева переменная определяется командой BVARIABLE.
Формат команды:
Name BVARIABLE A
Name - имя булевой переменной, которое также, как и имя арифметической переменной, по желанию пользователя командой EQU может быть заменено номером.
Операнд А - логическое выражение.
В выражении можно использовать арифметические и логические операторы. Результат преобразуется в целое значение 0, если равен нулю, или в целое значение 1, если отличен от нуля.
Логические операторы связаны с объектами аппаратной категории и используются для определения состояния этих объектов.
Имеются следующие логические операторы:
FVj равен 1, если устройство j доступно, иначе - 0 ;FIj равен 1, если устройство j обслуживает прерывание, иначе - 0 ;SFj равен 1, если МКУ j заполнено полностью, иначе - 0 ;SEj равен 1, если МКУ j пусто, иначе - 0 ;SVj равен 1, если МКУ j доступно, иначе - 0 ;LSj равен 1, если логический ключ j включен, иначе - 0. Под j понимается номер или имя.Например:
Oky BVARIABLE FV$Rem1 Can3 BVARIABLE SF$Usel Prov1 BVARIABLE SV$Pusk Prov2 BVARIABLE LS2
В первом примере булева переменная Oky равна 1, если устройство Rem1 доступно, и - 0, если не доступно. Во втором примере булева переменная Can3 равна 1, если МКУ Usel заполнено полностью. В третьем примере булева переменная Prov1 равна 1, если МКУ Pusk доступно. В четвертом примере булева переменная Prov2 равна 1, если логический ключ номер 2 включен.
Операторы отношения производят алгебраическое сравнение операндов. Например:
Prov1 BVARIABLE V$VseAvt'G'16 Prov2 BVARIABLE Q5$'LE'P3 Prov3 BVARIABLE MX$Plan(Stroka,Stolbez)'GE'P2
Булева переменная Prov1 равна 1, если переменная VseAvt больше 16, иначе равна 0. Во втором примере булева переменная Prov2 равна 1, если текущая длина очереди номер 5 меньше или равна значению параметра 3 транзакта. В третьем примере булева переменная Prov3 равна 1, если значение определенного элемента матрицы Plan больше или равно значению параметра 2.
Булевых операторов два: OR - ИЛИ и AND - И. Оператор ИЛИ проверяет выполнение хотя бы одного из условий, а оператор И требует выполнения обоих условий. Например:
Con1 BVARIABLE FI$Rem"OR"SF4 Con2 BVARIABLE FI$Rem"AND"SF$Pogr Con3 BVARIABLE (V3'G'7)"AND"(FN$Rav"OR"LS7)
Булева переменная Con1 равна 1, если выполняется одно из условий: устройство Rem обслуживает прерывание или память номер 4 не заполнена. Булева переменная Con2 равна 1, если выполняются оба условия: устройство Rem обслуживает прерывание и память с именем Pogr не заполнена. В третьем примере переменная Con3 равна 1, если выполняются оба условия: значение переменной номер 3 больше 7 и логический ключ номер 7 включен.
Скобки в третьем примере нужны только для задания определенных булевых соотношений. Скобки следует использовать только в тех случаях, когда они необходимы.
Если булева переменная задается СЧА, как например
Stan BVARIABLE V$TreAvt
то вычисляется значение арифметической переменной с именем TreAvt и если оно отлично от нуля - значение булевой переменной Stan будет равно 1, в противном случае - 0.
Рассмотрим работу модели.
Блок GENERATE с интервалами две единицы модельного времени генерирует семь транзактов. Следующий за ним блок TEST проверяет МКУ Sist на исправность (доступность) и наличия в нем свободных каналов, достаточных для удовлетворения запроса. Если булева переменная Kont1 равна 1, транзакт пропускается и занимает МКУ Sist. Но перед этим вычисляется и заносится целое число INT(Emk/ в сохраняемую ячейку с именем KolPovt, которое определяет, сколько транзактов может одновременно находится в МКУ.
После выхода транзакта из блока ENTER начинает работать сегмент учета номеров транзактов, занявших МКУ. Блоком ASSIGN в параметр с именем KolPovt - параметр цикла - заносится число, находящееся в сохраняемой ячейке с именем KolPovt. Далее в цикле, тело которого начинается с блока TEST с меткой Met5 и заканчивается блоком LOOP с меткой Met4, находится свободное место в списке для записи номера транзакта. Свободное место определяется блоком TEST как равенство нулю значения какой-либо одной из трех сохраняемых ячеек Х1, Х2 или Х3 (по числу транзактов, одновременно находящихся в МКУ).
Такая ячейка всегда есть и блоком SAVEVALUE в нее записывается номер занявшего МКУ транзакта. А так как сохраняемых ячеек, значения которых равны нулю, может быть несколько (особенно вначале работы модели), после записи номера транзакта осуществляется выход из цикла.
Транзакт направляется к блоку ADVANCE с меткой Met6 и входит в него. Имитируется обслуживание заявки. После обслуживания транзакт освобождает МКУ Sist, пройдя блок LEAVE.
Начинает работать сегмент учета номеров транзактов, освободивших МКУ. Его работа аналогична рассмотренной ранее работе сегмента учета номеров транзактов, занявших МКУ. Отличие состоит в том, что отыскивается сохраняемая ячейка Х1, Х2 или Х3, которая содержит номер обслуженного транзакта. Найденная ячейка обнуляется, т. е. обслуженный транзакт снимается с учета. Так как номер записывается только в одну ячейку, то после ее обнуления осуществляется выход из цикла, тело которого начинается с блока TEST с меткой Met8 и заканчивается блоком LOOP с меткой Met7.
Теперь рассмотрим работу модели при возникновении неисправности МКУ. Транзакт, инициирующий неисправность, после задержки блоком ADVANCE сегмента имитации неисправностей, входит в блок SUNAVAIL, который переводит МКУ Sist в недоступное (неисправное) состояние.
Далее начинается работа сегмента удаления транзактов из МКУ. Суть ее заключается в следующем. В цикле, также организованном с помощью блока LOOP, просматривается список номеров транзактов, занявших МКУ. Если значение какой-либо сохраняемой ячейки Х1, Х2 или Х3 не равно нулю, значит в ней записан номер транзакта, находящегося в данный момент в МКУ. Блоком этот транзакт перемещается к блоку LEAVE с меткой Met3, освобождает МКУ и выводится из модели.
После удаления из МКУ всех транзактов, транзакт - инициатор неисправности входит в следующий за блоком LOOP с меткой Met11 блок TEST. Так как МКУ Sist пусто (булева переменная Kont2 равна нулю), блок TEST пропускает этот транзакт в блок ADVANCE и начинается имитация восстановления работоспособности МКУ.
Результаты моделирования представлены в табл. 6.4.
Из результатов следует, что обслужены только две заявки (первый и шестой транзакты). Пять заявок не обслужены: пятый тран-закт поступил, когда МКУ было неисправным, а третий и четвертый, седьмой и восьмой транзакты потеряны: в моменты возникновения неисправностей ( t = 7,5 и t =16 соответственно) они находились в МКУ.
| События | Транзакты | ||||||
|---|---|---|---|---|---|---|---|
| 1 | 3 | 4 | 5 | 6 | 7 | 8 | |
| Вход в модель | 2 | 4 | 6 | 8 | 10 | 12 | 14 |
| Занятие МКУ | 2 | 4 | 6 | 10 | 12 | 14 | |
| В МКУ транзакты | 1 | 1,3 | 1,3,4 | 6 | 6,7 | 6,7,8 | |
| Удаление | 7.5 | 7.5 | 16 | 16 | |||
| Освобождение МКУ | 7 | 7.5 | 7.5 | 15 | 16 | 16 | |
| Вывод из модели | 7 | 7.5 | 7.5 | 8 | 15 | 16 | 16 |
Коэффициент использования ( Util.) МКУ Sist равен 0,375. Он рассчитывается по формуле:
где $$n$$ - число транзактов, занимавших МКУ за время Т моделирования;
$$Е$$ - число каналов МКУ (емкость);
$$\alpha_i$$ - число каналов, занимаемых i - м транзактом;
$$\Delta t_i $$ - промежуток времени, в течение которого $$i$$ - м транзактом было занято $$\alpha_i $$ каналов, рассчитывается как
$$\Delta t_i =t_{2i} - t_{1i}$$$$t_{1i}$$ и $$t_{2i}$$ - абсолютное модельное время занятия и освобождения соответственно $$\alpha _{i} $$ каналов МКУ.
Для рассматриваемого примера п. 6.8.1 (см. табл. 6.4) имеем:
$$E=7,\,\,T=16,\,\,\alpha=2;\\ \Delta t_1=7-2=5,\,\,\Delta t_2=7.5-4=3.5,\,\,\Delta t_3=7.5-6=1.5,\,\,\Delta t_4=0;\\ \Delta t_5=15-10=5,\,\,\Delta t_6=16-12=4,\,\,\Delta t_7=16-14=2;\\ k_1=\cfrac{2(5+3.5+1.5+0+5+4+2)}{16\cdot 7}=\cfrac{2\cdot 21}{16\cdot 7}=\cfrac{3}{8}=0.375.$$Таким образом, коэффициент использования МКУ рассчитан с учетом времени занятия его полностью обработанными транзак-тами и временем, затраченным на обработку тех транзактов, обслуживание которых было прервано.
Если в результате моделирования требуется определить коэффициент использования МКУ без учета удаленных из него тран-зактов, т. е. транзактов, обслуживание которых было прервано, пользователь может это сделать самостоятельно. Для этого нужно знать, сколько заявок будет обслужено полностью. Введем в модель следующие строки:
KIsp VARIABLE (Zap#N$Met9#5)/(Emk#16) SAVEVALUE KIsp,V$KIsp
Получим $$k_1=\cfrac{2(5+5)}{16\cdot 7}=\cfrac{5}{28}=0.179$$.
LINK и UNLINK.CLEAR и RESET.L сообщений). В соответствии с этим откорректируйте программу модели решения прямой задачи (п. 6.3.1). Запустите модель и получите результаты.Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.