32471_gpss_world_reference
.pdfСвязанные SNA
BVEntnum – результат вычисления логической переменной Entnum.
VEntnum – результат вычислений арифметической переменной или переменной с плавающей точкой.
4.13 Группы чисел
Группа чисел – это набор числовых значений. Группа чисел используется для записи событий или отображения состояния процесса, который моделируется.
Операции группы чисел выполняются быстрее с целыми числами, чем с вещественными.
Связанные блоки
∙JOIN – помещает значение в группу чисел.
∙REMOVE – Удаляет значение из групп чисел.
∙EXAMINE – проверяет корректность значений группы чисел.
Связанные SNA
∙GNEntnum – возвращает количество значений группы чисел Entnum.
4.14 Группа заявок
Группа заявок – это набор заявок. Можно использовать неограниченное число групп заявок, и можно создавать неограниченное число групп для одной заявки. Группы заявок полезно использовать для классификации заявок и организации доступа к ним. Активная заявка может проверить параметры заявки всех членов группы заявок.
Связанные блоки
∙JOIN – помещает заявку в групп заявок.
∙REMOVE – удаляет сообщество членов группы заявок.
∙EXAMINE – проверяет члены группы заявок.
∙SCAN – тестирует и/или изменяет члены группы заявок.
∙ALTER - тестирует и/или изменяет члены группы заявок.
Связанные SNA
∙GTEntnum – Возвращает количество членов группы заявок Entnum.
4.15 Генераторы случайных чисел
Потоки случайных чисел в GPSS World генерируются мультипликативным когерентным алгоритмом с максимальным периодом 32. Период равен 231-2 и не включает 0. Можно использовать любое количество генераторов случайных чисел, не объявляя их. Начальное число генератора совпадает с номером объекта генератора случайных чисел. Но, с помощью выражения RMULTT можно контролировать только генераторы, пронумерованные от 1до 7.
Алгоритм генерации псевдослучайных чисел в GPSS World основан на когерентном мультипликативном алгоритме Лехмера с максимальным периодом. Алгоритм выдает числа в интервале от 0, до 2,147,483,647 и генерируется 2,147,483,646 уникальных неповторяющихся случайных чисел. Существует также дополнительный способ перестановок. Класс SNA RN возвращает 0-999 включительно и вычисления функций использующих числа от 0-999999 включительно.
Важные атрибуты генераторов
Начальное число. Если не было изменено выражением RMULT, то начальное число равно номеру объекта генератора. Например, генератор RN2 стартует с начальным значением 2. Использование системы. GPSS World использует генераторы чисел в определении интервалов времени в фрагментном режиме блоков TRANSFER, а также для выбора случайных чисел для блоков GENERATE и ADVANCE. Можно указать, какой генератора будет использоваться для генерации конкретного случайного числа, на странице «Random» в настройках модели.
81
Значения SNA. При использовании SNA возвращается значение в пределах 0-999. Можно получить и большие значения, используя выражения типа 1000#RN2+RN2 при определении переменной. Новые значения могут быть получены с помощью класса V SNA. Более удобно использовать их в процедурах. Более подробно это описано в главе 8. Значения интерполяции. Дробные значения от 0 до 999999 выдаваемые генератором при использовании интерполяции при непрерывной функции.
Связанные SNA
∙RNEntnum – случайное число. Возвращает случайное число 0-999, полученное от генератора Entnum.
4.16 Потоки данных
Поток данных – это последовательность текстовых строк. Каждый поток определяется своим уникальным номером, несколько потоков могут быть обработаны одновременно в процессе моделирования. Номера потоков – это произвольные положительные целые числа, определяемые пользователем.
Потоки данных могут быть использованы для чтения или записи в файл или для поддерживания прямого доступа к памяти компьютера. Операции открытия, закрытия, чтения, записи и поиска связаны между собой и находятся в процедурах PLUS библиотеки. Блоки обозначаются только заглавными буками, а процедуры преобразовывают только первую букву. Можно выполнять сложные операции вводавывода с помощью PLUS процедур или, используя объекты GPSS более высокого уровня, а также, можно совместить эти два режима. Блоки описаны в главе 7, а процедуры PLUS в главе 8. Для простоты, мы рассмотрим только блоки.
Базовый элемент потока данных – это текстовая строка, состоящая из печатных символов, включая пробелы. Для работы со строками можно использовать встроенную библиотеку процедур для строк. Если при операциях READ или WRITE попадаются непечатные символы, вся строка обрезается.
Элементарные операции, применяемые к потокам данных, такие как READ, WRITE и SEEK, применяются к каждой отдельной строке. При чтении, данные из файла очищаются от специальных символов CR или LF, перед тем как поступить на обработку в модель. Последовательности символов CR и LF добавляются автоматически к любой текстовой строке, написанной в редакторе моделирования.
Существует два типа потока потоков данных:
1.Ввод/вывод (I/O) для доступа к файлам,
2.В потоках памяти для проверки и для прямого доступа в внутренним данным.
Укаждого потока данных есть свойство – « Текущая строка». Это относительный индекс, указатель на следующую строку, с которой будут производиться операции. Например, чтение происходит, когда значение текущей позиции равно 1, то будет получено значение первой строки потока данных. Операция SEEK используется для смены текущей позиции в потоках I/O и потоках памяти.
Запись в файл или в память происходит в двух режимах: Добавление, замещение. При этом, свойство текущей позиции воспринимается немного по-разному.
Для обработки потока данных предусмотрены 5 блоков: OPEN и CLOSE, которые начинают или завершают процесс обработки. READ и WRITE – добавляют или получают текстовые строки из потока данных. SEEK – используется для установки текущей позиции.
4.16.1 Операции потока данных
Каждая из следующих операций может быть представлена как GPSS блок или как процедура PLUS библиотеки. Эти два методы эквивалентны и взаимозаменяемы,
82
исключая режим перезаписи, который доступен в блоке WRITE, но не содержится в процедуре Write() библиотеке. Здесь описано преимущественно работа с блоками.
OPEN
Блок инициализирует работу с потоком данных и устанавливает текущую позицию в 1. Необходимо определить тип потока, указав параметр A. Этот параметр является строковой константой, указывающий на тип потока данных. Необходимо помнить, что строковые константы – это PLUS выражения. Каждое PLUS выражение, должно быть взято в скобки. Потока ввода вывода определяется указанием на файл, а поток памяти – пустой строкой.
Например, в блоке OPEN можно указать:
OPEN ("MYFILE.TXT") – для I/O потока
OPEN (« «) – для потока памяти
Если при создании файлового потока данных указан файл без пути к нему, будет выбрана предполагаемая директория расположения файла. Если указанный файл найден, он загружается в виртуальную память в процессе обработки блока OPEN. В противном случае система создает файл с указанным именем и обработка продолжается.
Можно вызвать операция открытия с помощью процедуры PLUS Open(). После завершения операции, вся информация хранится в объекте моделирования, пока поток не будет закрыт. Все изменения вступят в силу, только после вызова блока CLOSE или процедуры Close().
CLOSE
Блок CLOSE освобождает ресурсы, используемые потоком данных, а также возвращает код ошибки. Для IO потоков, блок записывает данные из виртуальной памяти на диск. Можно вызвать операцию закрытия с помощью PLUS процедуры Close().
READ
Блок READ получает текстовую строку текущей позиции и увеличивает значение текущей позиции на 1. Если следующая строка доступна, активная заявка идет по альтернативному направлению, но не запоминает внутренний код ошибки.
Можно вызвать операцию READ с помощью PLUS процедуры Read().
WRITE
Блок WRITE передает текстовую строку потоку данных.
Операции зависит от того, в каком режиме будет производиться действие. Если параметр D операции WRITE включен, используется режим вставки. Если параметр D отключен, используется режим замены. По умолчанию D включен.
Можно вызывать эту операцию с помощью PLUS процедуры Write(), однако процедура не поддерживает режим замены.
Режим вставки
Режим по умолчанию для операции WRITE. Действие:
1.Перемещает все текстовые строки вниз на одну позицию.
2.Если текущая позиция имеет значение последней строки, устанавливает его в значение после последней строки в потоке данных.
3.Помещает новую строку в текущую позицию.
4.Увеличивает значение текущей позиции.
Режим замены (только для блока WRITE)
Действие:
1.Если значение текущей позиции находится сразу за последней строкой, стирает все промежуточные строки.
2.Удаляет строку в текущей позиции.
3.Помещает строку в текущую позицию.
4.Увеличивает текущую позицию на 1.
83
SEEK
Блок SEEK устанавливает текущую позицию. Текущая позиция не может быть меньше 1. При попытке установить значение 0 будет установлена 1.
Можно вызывать операцию seek с помощью PLUS процедуры Seek(), которая возвращает предыдущее значение позиции, которое было до вызова процедуры. Это значение недоступно, когда используется блок SEEK.
4.16.2 Использование потоков данных
Тип потока данных выбирается указанием параметра A при открытии.
I/O потоки
Создается при указании файла в параметре A. Если не указывается полный путь к файлу, используется директория текущей модели. При операции открытия, весь файл считывается в память компьютера. При закрытии потока, файл записывается на диск. Запись на диск происходит только по операции CLOSE. Если при открытии, указанный файл не найдет, ошибка не возникает. В этом случае, GPSS World считает, что файл должен быть создан. Если необходимо проверить, существует ли файл, следует использовать READ, перед продолжением работы.
Ниже представлен простой пример использования I/O потока. Это маленькая часть модели, которая открывает файл, считывает первую строку, вызывает SEEK, переходит на 20 позицию и записывает текстовую строку, затем закрывает файл.
****************************************************************
*
* Read and Modify MYFILE.TXT
*
****************************************************************
GENERATE 1,,,1
OPEN |
("MYFILE.TXT"),1,Done ;Copy the file to memory |
||
READ |
Text_Parm,1,Done |
;Place text line in parm |
|
SAVEVALUE Opening_Line,P$Text_Parm ;Text line to safeplace |
|||
SEEK |
20,1 |
;Access text line 20 |
|
WRITE |
("New Line 20"),1,Done |
;Replace the line |
|
Done CLOSE Error_Parm,1 |
|
;Copy the file to disk |
|
SAVEVALUE File_Error,P$Error_Parm ;Put in Standard Report
TERMINATE 1
Потоки памяти
Если в параметре A операции OPEN используется пустая строка, создается поток памяти. В этом случае, все строки сохраняются в памяти. При закрытии потока, все строки удаляются.
Все операции потока памяти работают также, как и в потоках I/O с то лишь разницей, что при открытии он не содержит данных, а при закрытии не сохраняет их. Потока должен быть сначала загружен строками, прежде чем с ним можно будет работать.
Потоки памяти предоставляют прямой доступ к данным с помощью SEEK и позволяют проверить данные без доступа к файлу.
4.16.3 Проверка на ошибки
Можно обрабатывать ошибки потоков самостоятельно или же останавливать модель, когда возникает хоть одна ошибка. По умолчанию, при возникновении ошибки, остановка не происходит. Это устанавливается в настройках модели. Чтобы изменить эту опцию, выберите в меню Edit / Settings и установите/снимите галочку I/O Stream Error Stops.
84
При возникновении ошибок и других неожиданных случаев запоминается код ошибки потока данных и, если необходимо, направляет активную заявку по альтернативному пути. С помощью блока CLOSE можно получить код ошибки потока. Запоминается только первый ненулевой код ошибки. Остальные отбрасываются.
Альтернативный путь может быть указан параметром C в блоках OPEN, CLOSE, READ и WRITE. Активная заявка пойдет по альтернативному пути, вместо того, чтобы попасть с следующий последовательный блок, если возникла ошибка. Если эти параметры не указаны, по существу происходит игнорирование ошибок. Вообще, необходимо использовать альтернативные пути, чтобы направить активную заявку в блок CLOSE, которые возвратит код ошибки. Дальше можно будет запомнить этот код и прекратить моделирование.
Когда активная заявка входит в блок CLOSE, код ошибки помещается в параметр заявки. И, если код ошибки ненулевой и указан альтернативный путь в параметре C, активная заявка начинает двигать по нему.
Конец данных
Когда заявка входит в блок READ, но в текущей позиции отсутствует строка, возникает особый случай. В общем случае, это означает, что весь файл прочитан. При этом заявка отправляется по альтернативному пути, но код ошибки не сохраняется.
Коды ошибок
0 – Нет ошибок.
10 – Ошибка открытия. Слишком длинное имя файла. Поток данных не создан. 11 – Ошибка открытия. Ошибка чтения файла. Поток не создан.
12 – Ошибка открытия. Отказано в доступе к памяти при чтении файла. Поток не создан. 21 – Ошибка чтения. Отказано в доступе к памяти при чтении.
22 – Ошибка чтения. Поток не открыт.
31 – Ошибка записи. Отказано в доступе к памяти при записи. 32 – Ошибка записи. Поток не открыт.
41 – Ошибка закрытия. Ошибка записи на диск. 43 – Ошибка закрытия. Поток не открыт.
51 – Ошибка перемещения. Поток не открыт.
4.17 Непрерывное моделирование
GPSS World может автоматически интегрировать системы обычных дифференциальных уравнений. Интегрирование пользовательских переменных происходит чрезвычайно быстро. Необходимо всего лишь определить переменную и записать одно или более INTEGRATE выражений. Интегрирование производится автоматически модифицированием переменной 5 шагами по методы Рунга-Кутта-Фелберга, RKF4(5).
Можно моделировать любой набор простых систем дифференциальных уравнений. Можно строить графики состояний переменных.
4.17.1 Как начать интегрирование
Необходимо сделать две вещи для установки автоматического интегрирования пользовательских переменных. Необходимо задать команду INTEGRATE и определить начальное значение переменной.
Допустим, что имеет простую систему дифференциальных уравнений вида:
y’ = f(-)
где f(-) – выражение представляющее собой системное время, т.е. Систему атрибутов AC1, и другие пользовательские переменные. Производная по времени.
Сначала, заключим производную в круглые скобки и допишем команду INTEGRATE:
Y_ INTEGRATE ( f(-) )
Далее, убедимся, то переменная Y имеет начальное значение, например:
85
Y_ EQU 100.3
Теперь, когда процесс моделирования перейдет к следующему моменту времени, мы увидим, что переменная Y изменить свое значение.
Начиная с некоторой последовательности букв, имена пересекаются с классами SNA, здесь мы будем подчеркивать их, чтобы быть уверенными их уникальности. Все остальные пользовательские переменные, включенные в производную, должны быть обязательно инициализированы. Можно использовать PLUS выражения для задания значений переменным.
Интегрирование автоматически начинается в активном или «включенном» состоянии. Однако, можно включать или выключать интегрирование в процессе моделирования блоками INTEGRATION. Этот способ описан в главе 7.
4.17.2 Базовые концепции
Производная показывает, как быстро изменяется значение переменной. Например, если запасы пополняются на 2 единицы в час, а моделирование происходит единица в секунду, все что нужно сделать, это добавить:
Inventory INTEGRATE ( 2.0 / 3600 )
и
Inventory EQU 100
Степень изменения (производная) позволяет GPSS World автоматически увеличивать значение запаса в процессе моделирования. Когда происходит операция продажи, можно просто уменьшить значение запаса использую процедуру PLUS.
Интегрирование занимает больше компьютерного времени, чем более простые выражения. Например, быстрее будет вычислено значение как функции от времени при передаче ей текущего времени, чем интегрирование пользовательской переменной.
Интегрирование применяется тогда, когда нет другого решения дифференциального уравнения.
4.17.3 Переделы
Интегрированные пользовательские переменные создают заявки, когда пересекают пределы. Это упрощает использование непрерывно моделируемых значений для условий возникновения событий.
Каждая команда INTEGRATE может иметь нулевые, одну или две числовых предела. Параметры B и C используются для определения 1 предела и/или параметры D и E используются для определения 2 предела. Первый параметр пары определяет значение предела, второй показывает блок, который получит сгенерированная заявка.
В процессе интегрирования, если значение интегрированной переменной пересекает значение предела такого же направления, создается новая заявка. Ей выдается нулевой приоритет, и она должна войти в блок, связанный с пределом в команде INTEGRATE. Время пребывания заявки в модели определяется линейной интерполяцией. С целью повышения точности, шаг интеграции уменьшается, когда приближается предел.
Пределы могут быть константами, заключенными в скобки выражениями, или даже содержать вызовы процедур. К тому же, заявка, сгенерированная пересечением предела, может передвигать предел.
Оба предела ведут себя одинаково. Нет необходимости определять один как верхний, другой как нижний. Пересечение предела (в любом направлении), вызывает событие прибытия заявки. Если направление пересечения значимо для модели, необходимо отслеживать состояние интегрированной переменной или проверять направление пересечения, когда происходит соответствующее событие.
86
4.17.4 Уравнения более высокого порядка
Необходимо уменьшать порядок дифференциальных уравнений высокого порядка. Перевод вводом дифференциальных уравнений высокого порядка в GPSS World, необходимо переписать их как систему уравнений первого порядка. Это относительно просто, и требует того, чтобы для каждой промежуточной производной была представлена своя переменная.
Например, если у нас есть:
25 y’’’ - 6 y’ + y = 0.
Допустим u=y’
v = u ‘ = y’’
Для более высоких порядков продолжим подставлять переменные.
Затем, подставляя в оригинальное уравнение и используя только первый порядок производной, имеем:
25 v’ - 6 u + y = 0.
Теперь, у нас есть система уравнений:
y’ = u u’ = v
v’ = 6/25 u - 1/25 y
В GPSS World можно использовать следующие выражения:
Y_ INTEGRATE U_
U_ INTEGRATE V_
V_ INTEGRATE ( (6/25) # U_ - (1/25) # Y_)
Для этого необходимо добавить EQU выражения, которые инициализируют переменные
U_, V_, Y_.
4.17.5 Непрерывное моделирование
Если вы хотите проводить исключительно непрерывное моделирование, необходимо создать условия остановки вхождением в блок TERMINATE. Поэтому включают такой сегмент GPSS как:
GENERATE End_Time
TERMINATE 1
В моделях, которые начинаются с
START 1
4.17.6 Фазы
Моделирование проходит поочередно в непрерывной и дискретной фазах. В любой момент времени, где события запланированы, моделирование проходит в дискретной фазе. Часы моделирования не изменяются без дискретной фазы. Между моментами времени моделирование проходит в непрерывной фазе, в течении которой интегрирование происходит маленьким приращением времени, называемых минишагом. График интегрированной переменной отображает промежуточные значения в конце каждого минишага.
Когда пересечение предела генерирует заявку, моделирование переходит в дискретную фазу. Таким образом, непрерывная и дискретная фазы тесно связаны между собой. Значения пользовательских переменных могут быть установлены в дискретной фазе, даже если они были интегрированы. Это можно сделать, используя команду EQU или PLUS выражения. Если вы хотите, чтобы такие изменения произошли в процессе
87
моделирования, то необходимо объявить PLUS процедуру, которая сделает такие изменения. Например:
PROCEDURE SetPop(Pop_Level)Foxes = Pop_Level ;
Можно переопределить переменную FOXES, вызвав PLUS блок, например:
PLUS (SetPop(200))
или используя выражение в круглых скобках, которое вызывает SetPop() другого типа блока.
4.17.7 Ошибки интегрирования
Настройка модели, называемая «устойчивость интегрирования» используется для ограничения локальное отсечение ошибок интегрирования. Эта настройка применяется для всех интегрирований, выполняемых в процессе моделирования. Если сделать устойчивость меньше, интегрирование будет происходить дольше, но будет более точной. Оно устанавливается в настройках модели.
Выберите Edit / Settings
Затем, выберите страницу Simulate. И укажите желаемое значение в поле «Устойчивость интегрирования». Значение по умолчанию 10-6.
4.17.8 Связанные команды
∙ INTEGRATE – устанавливает автоматическое интегрирование.
Связанные блоки
∙INTEGRATION - устанавливает интегрирование переменных: ON или OFF.
88
Глава 5 – Окна GPSS World
Этот раздел рассматривает все главные окна GPSS World. Главные операции GPSS World, включая меню и диалоги, описывается в главе 2.
Рисунок 5.1 – Главное окно
Рисунок 5.2 – Текстовое окно
89
Рисунок 5.3 – Журнал моделирования
Рисунок 5.4 – Окно отчета
Рисунок 5.5 – Подробный вид блоков
90
