Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МГУПБ. Лаб. практ.мод. сист. в печать конечная...doc
Скачиваний:
5
Добавлен:
01.05.2025
Размер:
4.54 Mб
Скачать

Задание и порядок выполнения работы

  1. Построить многокомпонентную модель CedarBog и задать поведение одного из компонентов при помощи внешней С- функции или С-прцедуры.

  2. Ввести в ранее рассмотренные модели внешние функции-процедуры дискретных событий:

- очистка озера в модели CedarBog;

- отстрела плотоядных животных;

- изменение погодных условий;

- ввод нового более мощного хищника в трофическую модель межвидового взаимодействия;

- изменение экологической обстановки и т.п.

Вопросы для самопроверки

  1. В чем главное отличие процедур и функций, используемых в Simplex3?

  2. Объявление и вызов внешней С-функции в базисном компоненте.

3. Описание и назначение параметров входа и выхода в процедурном элементе.

4. Как осуществляется вызов процедуры-функции с одним и несколькими выходными параметрами?

Требования к отчету

Отчет должен содержать задание с описанием моделируемой системы и среды, описание событий и алгоритмов динамики состояния, структурную блок-схему и MDL-описания базисных и мобильных компонентов и модели в целом, диалоговый интерфейс и формы представления данных с анализом результатов имитационного моделирования.

Литература

1. Ивашкин Ю.А. Мультиагентное имитационное моделирование больших систем : учебное пособие / Ю.А. Ивашкин. – М. : МГУПБ, 2008. – 238 с.

2. Шмидт Б. Искусство моделирования и имитации. Введение в универсальную имитационную систему Simplex3 / Б. Шмидт; перевод с немецкого под редакцией Ю.А. Ивашкина и В.Л. Конюха. – Ghent, Belgium, 2003. – 550 с.

3. Schmidt B. The Art of modelling and simulation / B. Schmidt. – SCS - Europe BVBA, Ghent, Belgium, 2001. – 504 c.

4. http://isgwww.cs.uni-magdeburg.de/sim/its/ws0506/download.html

Лабораторная работа № 13

ОРГАНИЗАЦИЯ ЭКСПЕРИМЕНТА В SIMPLEX 3

С ИСПОЛЬЗОВАНИЕМ ИНТЕРФЕЙСА И ВНЕШНИХ ПРОГРАММ

Целью работы является изучение синтаксиса и команд языка описания эксперимента Simplex-EDL в универсальной имитационной системе Simplex3 и приобретение навыков организации эксперимента для нахождения оптимальных решений с помощью объектно-ориентированной имитационной модели системы.

Теоретическое введение

Для удобства работы с моделью универсальная имитационная система Simplex3 включает в себя специализированный язык описания эксперимента Simplex-EDL (Experiment Description Language), обеспечивающий описание эксперимента с моделью и подключение внешних, автономных программ, написанных на любом языке программирования (Delphi, С++, VBA и др.).

Соединение модуля EDL–программы эксперимента с внешней программой осуществляется с применением двух текстовых файлов (рис. 13.1): program.in для передачи данных из блока EDL во внешнюю программу, и program.out из внешней программы в блок EDL.

Подключение внешних программ используется для создания интерфейса установки входных параметров имитационной модели и описания процедуры эксперимента в процессе поиска оптимальных решений.

Рис. 13.1. Соединение EDL-программы с внешней программой

Внешние программы, созданные пользователем, размещаются в папке edlprogs по адресу %USERPROFILE%\Simplex3\edlprogs\

Имя программы должно совпадать с именем файлов с расширением *.in и *.out (например: для программы test.exe, входной файл *.in будет иметь имя – test.in, а выходной файл имя – test.out). Входные и выходные файлы представляют собой хранилища данных, содержащие переменные, необходимые для использования в Simplex-EDL и внешней программе.

Синтаксическая структура описания эксперимента на Simplex-EDL сходна с языком описания моделей Simplex-MDL и имеет следующий вид:

EXPERIMENT < name >

VALUE SET

DECLARATION OF PROGRAMS

DECLARATION OF VARIABLES

BODY OF EXPERIMENT

END OF < name >

В блоке VALUE SET происходит объявление новых типов переменных, созданных пользователем, в разделе DECLARATION OF PROGRAMS объявляются внешние программы, в DECLARATION OF VARIABLES декларируются используемые в эксперименте переменные, а в разделе BODY OF EXPERIMENT описывается структура эксперимента.

Разделы VALUE SET и DECLARATION OF VARIABLES имеют сходную структуру описания с Simplex-MDL. Блоки DECLARATION OF PROGRAMS и BODY OF EXPERIMENT используются , соответственно, для вызова внешней программы и описания тела эксперимента.

Объявление внешней программы в блоке DECLARATION OF PROGRAMS имеет следующую синтаксическую структуру:

DECLARATION OF PROGRAMS

<Name_of_program> (typ_input_param_1, typ_input_param_n -->

typ_output_param_1, typ_output_param_n) ,

где:

<Name_of_program> - имя внешней программы,

typ_input_param_1, typ_input_param_n - объявление типа переменных

входных параметров;

typ_output_param_1, typ_output_param_n - объявление типа переменных

выходных параметров.

Например,

DECLARATION OF PROGRAMS

Lotka (LOGICAL --> REAL,..,REAL)

где Lotka - название внешней программы; LOGICAL - тип входной

переменной; REAL - типы выходных переменных.

Описание эксперимента в блоке BODY OF EXPERIMENT производится в системе команд Simplex-EDL, описывающих организацию эксперимента (таблица 13.1)

Таблица 13.1.

Команда

Содержание

UNSELECT

Снять выделения со всех библиотек Simplex3.

RESETBANK <путь к банку модели>

Обнулить банк модели.

CHECK <путь к компоненту модели>

Проверить компонент модели.

SELBANK <путь к банку модели >

Выбрать банк модели.

CRMODEL <имя создаваемой модели>, <имя компонента>

Инсталлировать модель с указанным именем на основе выбранного компонента.

ACTIVATE <имя модели>

Активировать модель.

CREXP имя эксперимента

Создать эксперимент с указанием имени.

SELEXP имя эксперимента

Выбрать созданный эксперимент.

CRRUN имя запуска, имя модели

Создать запуск модели с именем запуска.

SELRUN имя запуска

Выбрать созданный запуск.

OBSCOMPLETE <имя обсервера>, n, k,

step

Создать обсервер с заданным именем и параметрами запуска n, k, step, где n - время начала эксперимента, k - время конца эксперимента, step - шаг интегрирования эксперимента.

Окончание табл. 13.1

Команда

Содержание

ADDVAR <имя обесрвера>, <имя переменной_1>, <имя переменной_n>

Записать в созданный обсервер имя наблюдаемых переменных.

SETVAR <имя переменной>, значение

Присвоить переменной вводимое значение.

SIMULATE TO, время имитации

Запуск имитации до заданного временит (в тактах).

DRAW <имя обсервера#/имя модели/имя переменной>, present=Тип_представления

Вывод на экран результатов имитации по выбранной переменной.

Тип представления результатов:

Line – графики; Table – таблица.

SELEXP имя эксперимента

Выбор эксперимента.

DELEXP имя эксперимента

Удаление эксперимента.

DELMODEL имя модели

Удаление модели.

Рассмотрим пример организации эксперимента с расширенной моделью Лотки-Вольтерра c использованием внешней программы для создания интерфейса ввода исходных данных и матриц коэффициентов модели (рис. 13.2).

Рис. 13.2. Внешний интерфейс управления моделью Лотки-Вольтерра

Для создания нового эксперимента на языке Simplex-EDL в директории Procedures командой New Experiment Description из контекстного меню в открывшемся окне записывается EDL-описание эксперимента (например Expеriment) с вводом исходных данных через интерфейс в следующем виде:

EXPERIMENT Expеriment # Имя эксперимента

DECLARATION OF PROGRAMS # Блок объявления внешних команд

Lotka (LOGICAL --> REAL,..,REAL) # Объявление внешнего программного

# модуля Lotka

DECLARATION OF VARIABLES # Объявление используемых переменных

Run (LOGICAL) := TRUE, # Сигнал запуска внешней программы

ARRAY [3] XE(REAL) := 0, # Массив численностей популяций Xi

ARRAY [3] RE(REAL) := 0, # Массив собственных коэффициентов Ri

ARRAY [3][3] BE (REAL) := 0, # Массив коэффициентов взаимовлияния Bi,j

TE (REAL) := 2 # Время моделирования

BODY OF EXPERIMENT # Объявление блока описания эксперимента

UNSELECT; # Отменить выбор предыдущей модели

# в банке моделей Simplex3

RESETBANK <priv/LotkaVolterra>; # Обнулить банк моделей LotkaVolterra

# Проверить Version0, компонента Biosystem, банка модели LotkaVolterra

CHECK <priv/LotkaVolterra/Biosystem/Version0>;

SELBANK <priv/LotkaVolterra>; # Выбрать банк модели LotkaVolterra

# Создать модель ModBiosystem на основе компонента BiosystemProc

CRMODEL <ModBiosystem>, <Biosystem>;

ACTIVATE <ModBiosystemProc>; # Активировать модель ModBiosystem

CREXP BiosystemEx; # Создать эксперимент BiosystemEx

SELEXP BiosystemEx; # Выбрать эксперимент BiosystemEx

CRRUN Run1, ModBiosystem; # Создать запуск с именем Run1 модели # ModBiosystem

SELRUN Run1; # Выбрать созданный запуск Run1

OBSCOMPLETE <Obs1>, 0, 100, 0.01; # Создать обсервер с именем Obs1

ADDVAR <Obs1>, <X[1]>, <X[2]>, <X[3]>; # Внести в обсервер наблюдаемые # переменные Xi

# Присвоить переменным эксперимента данные из внешней программы

(XE[i], RE[i], BE[i,j], TE):=Lotka(Run);

# Присвоить переменным модели заданные во внешней программе значения

SETVAR <X1>, XE[1];

................................................

SETVAR <R1>, RE[1];

................................................

SETVAR <B3_3>, BE[3,3];

SIMULATE TO, TE; #.Запуск имитации до времени TE

DRAW<ObsVol #/BiosystemProc/X1>, # Представление результатов

# эксперимента (значений Xi) в виде

# графиков

<ObsVol#/BiosystemProc/X2>,

<ObsVol#/BiosystemProc/X3>, present=Line;

SELEXP BiosystemEx; # Выбрать эксперимент BiosystemEx

DELEXP BiosystemEx; # Удалить эксперимент BiosystemEx

SELMODEL ModBiosystem; # Выбрать модель ModBiosystem

DELMODEL ModBiosystem; # Удалить модель ModBiosystem

END OF Expеriment #Конец эксперимента Expеriment

Далее следует проверка синтаксиса эксперимента при помощи команды Check Procedure и запуск эксперимента при помощи команды Execute Procedure. После этого автоматически открывается интерфейсная форма (рис.13.2), в которую необходимо ввести все соответствующие исходные данные и запустить программу нажатием соответствующей кнопки.

В данном случае, исходными данными являются количество особей в каждой популяции и матрицы коэффициентов межвидового взаимодействия. Поскольку из блока EDL нет выходных данных, используется логическая переменная запуска эксперимента Run.

Пример кода внешней программы для создания экранной формы на языке Delphi имеет вид:

procedure TForm1.Button1Click (Sender: TObject); // Процедура кнопки "Запуск"

var // Объявление переменных, записываемых в файл .out

X,R :array[1..3] of Real; //Объявление массива X,R

B : array[1..3, 1..3] of Real; //Объявление массива B

T : real; //Объявление переменной T - время

i,j : integer;

// Объявление вспомогательных переменных, необходимых для работы с текстовым // файлом *.out

f:TextFile;

FileDir:String;

S : string;

buf : array[0..$FF] of char;

Size : integer;

Begin // Начало программы

s := '%USERPROFILE%\'; // Преобразование относительного пути

// к папке пользователя в абсолютный

Size := ExpandEnvironmentStrings(PChar(S), buf, sizeof(buf));

//Присвоение переменным значения текстовых полей

R[1] := StrToFloat (Edit1.Text);

..........................................................

X[1] := StrToFloat (Edit13.Text);

..........................................................

B[1,1] := StrToFloat (Edit4.Text);

...........................................................

B[3,3] := StrToFloat (Edit12.Text);

T := StrToFloat (Edit16.Text);

// Создание и запись переменных в файл Lotka.out

AssignFile(f,copy(buf, 1, Size)+'\simplex3\edlprogs\Lotka.out'); // Открытие файла Lotka.out

if not

FileExists(copy(buf, 1, Size)+'\simplex3\edlprogs\Lotka.out') //Проверка наличия данных

then

begin

Rewrite(f); //Очистка файла

CloseFile(f);

end;

Rewrite(f);

Append(f);

For i := 1 to 3 do //Запись в файл значений X

begin

Writeln(f,X[i]);

end;

For i := 1 to 3 do //Запись в файл значений R

begin

Writeln(f,R[i]);

end;

For i := 1 to 3 do //Запись в файл значений B

For j := 1 to 3 do

begin

Writeln(f,B[i,j]);

end;

Writeln(f,T); //Запись в файл значений T

Flush(f);

CloseFile(f); // Закрыть файл

Close; //Завершение программы после ввода и записи данных в файл

end;

После создания внешней исполняемой программы следует её копирование в папку edlprogs. После этого выполняется запуск эксперимента.

При загрузке интерфейсной формы (рис.13.2) открывается файл Lotka.exe и идет считывание выходной информации из него и запись в файл Lotka.out. Далее данные транслируются в переменные модуля EDL и присваиваются переменным MDL-модели, после чего автоматически производится запуск модели до указанного в эксперименте машинного такта и построение графиков.

Полное описание порядка создания пользовательского интерфейса с помощью внешней программы приведено в приложении 2.