Главная страница

Математическое моделирование. Документ Microsoft Word. исследование и оптимизация свойств локальных информационных систем


Скачать 1.67 Mb.
Название исследование и оптимизация свойств локальных информационных систем
АнкорМатематическое моделирование
Дата23.06.2021
Размер1.67 Mb.
Формат файлаdocx
Имя файлаДокумент Microsoft Word.docx
ТипИсследование
#220711
страница10 из 15
1   ...   7   8   9   10   11   12   13   14   15
Тема 10. Программная модель в системе Pilgrim

 

Цели изучения темы:

·     познакомиться с технологией создания Pilgrim -модели;

·     выяснить состав результатов моделирования;

·     изучить правила выполнения основных этапов технологии создания и использования модели.

 

Задачи изучения темы:

·     понять назначение языковых средств системы Pilgrim;

·     выяснить состав, структуру и форматы выходных параметров моделирования.

 

Успешно изучив тему, Вы:

получите представление о:

·     основных языковых средствах системы Pilgrim;

·     структуре и форматах разделов программной Pilgrim-модели;

·     составе узловых операторов модели;

 

будете знать:

·     как прочитать текст программной модели на исходном языке;

·     как внести изменения модель минуя этап описания ее графа;

·     как собрать исполнительный модуль модели;

·     как запустить модель;

·     как прочитать результаты моделирования;

·     семантику и синтаксис основных узлов.

 

Вопросы темы:

1.  Структура программной модели в системе Pilgrim.

2.  Узловые операторы.

3.  Текст программной модели СМО.

4.  Сборка и запуск исполнительного модуля модели.

5.  Результаты моделирования.

 

Вопрос 1. Структура программной модели в системе Pilgrim.

 

Все узлы имитационных моделей являются процессами в системе Pilgrim. Стохастическая сеть, в виде которой представляется модель, не является вычислительным алгоритмом. Попытки представить имитационную модель в виде набора алгоритмов приводят к написанию больших (и сложных) моделирующих программ. Такой подход называется алгоритмическим моделированием; он не всегда доступен прикладному специалисту, даже имеющему подготовку в области программирования.

Модель реальной системы может состоять из очень большого числа узлов. Поэтому нужны специальные языковые средства, не являющиеся языком программирования, которые бы позволили в лаконичном (по сравнению с текстом компьютерной программы) виде описать модель. Эти средства должны учитывать особенности узлов, жизненных циклов транзактов, условий прохождения транзактов по дугам, их размножения и гибели, а также функциональные особенности взаимодействия процессов, связанных с финансовыми, материальными и информационными ресурсами.

Набор языковых средств, предназначенных для описания имитационных моделей процессов, обеспечивает выполнение следующих задач:

1)      Инициализацию объектов и структур данных при запуске программной модели.

2)      Описание узлов с помощью общих операторов управления транзактами, событиями и узлами модели.

3)      Функциональное описание процессов управления материальными и денежными ресурсами.

4)      Управление переходами между слоями модели при многоуровневой декомпозиции.

5)      Описание сигнальных управляющих функций.

 

Данные средства по форме записи являются функциями, через параметры которых реализуются синтаксические связи между объектами (узлами, транзактами, ресурсами и событиями) имитационной модели. Форма записи различных условий и условных действий соответствует языку C++.

Ниже представлен перечень основных разделов программного модуля на языке C++, на основе которого формируется исполнительный модуль для реализации модельных экспериментов (названия необязательных разделов заключены в квадратные скобки).

 

#include


[Глобальные переменные и функции]

forward

{

[Локальные переменные модели]

modbeg (p1,p2,p3,p4, p5,p6,p7,p8,p9)

ag (p1,p2,p3,p4, p5,p6,p7,p8)

…………………………

ag (p1,p2,p3,p4, p5,p6,p7,p8)

[Сигнальные функции]

network (p1,p2)

{

Узел 1

……..

Узел N

 }

modend (p1,p2,p3,p4)

return 0;

}

 

Препроцессорная инструкция

 

#include


 

подключает моделирующую среду имитатора к модели.

 

Оператор modbeg (Р1, Р2, Р3, Р4, Р5, Р6, Р7, Р8, Р9) осуществляет первоначальную настройку моделирующих программ и инициализацию в памяти ЭВМ графа модели. Аргументы этой функции имеют следующий смысл:

Р1 – символическое имя узла: строка длиной до 14 символов (типа char);

Р2 – максимальный номер узла модели (типа int), причем 2≤p2≤mmax, где mmax – некоторое граничное значение, задаваемое при установке имитатора на ЭВМ (обычно mmax =1024);

Р3 – модельное время, в течение которого необходимо производить моделирование (типа float);

Р4 – произвольное целое число, используемое для настройки датчиков псевдослучайных величин (long). В каждом узле есть свой независимый датчик. В качестве этого числа полезно использовать значение таймера ЭВМ, обращение к которому имеет следующий вид p4=(long)time(NULL). В этом случае результаты разных прогонов модели будут разными, имеющими случайные отклонения. При отладке лучше использовать постоянную комбинацию цифр, например, p4=(long)2013456789.

Р5 – признак режима пространственной имитации (типа int); возможные значения:

·     earth –поверхность Земли (сферические географические координаты широта и долгота);

·     plane –декартова плоскость (прямоугольная система координат);

·     cosmos –произвольное пространство (ответственность за правильность его представления возлагается на разработчика модели);

·     none – если пространственная имитация в модели не используется.

 

Р6 – номер (типа int) одной из очередей (узел типа queueattach или send), которую необходимо контролировать во времени для анализа динамики задержек в этой очереди с графическим отображением результатов.

Р7 – номер (типа int) одного из процессов (узла типа proc), который необходимо контролировать как в пространстве, так и во времени с графическим отображением результатов. Если нет необходимости в графической интерпретации, то указывается none.

Р8 – номер (типа int) терминатора (узел типа term), на входе которого необходимо наблюдать интенсивность потока транзактов во время моделирования. Если такой необходимости нет, то указывается none.

Р9 – точность (типа int). Если Р9=1..6, то имитатор будет использовать от 1 до 6 знаков после запятой при выводе результатов; если Р9=none, то результаты будут округляться до целых значений.

 

Оператор network (Р1, Р2) представляет собой координатор процессов модели. Он осуществляет диспетчеризацию транзактов в узлах модели, планирует события в едином модельном времени и активизирует дискретные или непрерывные компоненты модели, имитирующие внешнюю среду. Аргументы Р1 и Р2- это имена (адреса) соответствующих программных функций моделирования внешней среды, производящих интегрирование, решение разностных уравнений, вычисление по формулам и т.д. Функции float Р1 (d) и float Р2 (d), если они необходимы, пишутся пользователем. Если процессы Р1 (d) и Р2 (d) не моделируются, то в качестве Р1 и Р2 записывается dummy.

Оператор modend (Р1, Р2, Р3, Р4) выполняется по окончании моделирования. Он позволяет просмотреть на экране монитора графические результаты и выводит итоговые результаты в файл-отчет. Аргументами оператора являются:

Р1 – символическое имя файла-отчета (сhar);

Р2 – номер первой страницы отчета (int);

Р3 – число строк на каждой странице (int);

Р4 – флаг символа перевода страницы в файле-отчете; возможные значения:

·     page символ ставится;

·     none символ не ставится.

 

Вопрос 2. Узловые операторы.

 

Узел в тексте программы состоит из шести компонентов (необязательные компоненты заключены в квадратные скобки):

 

top(i):

[Описание условий]

Узловой оператор

[Сигнальные функции]

[Блок операторов С++]

place;

 

Описание узла начинается с метки-функции top (i), где i - номер этого узла (записывается с двоеточием).

Начиная с метки top(i) транзакт проходит все операторы узла i без временных задержек и попадает в оператор place, где находится до тех пор, пока не появятся условия для перехода в следующий узел.

В некоторых узлах одновременно могут находиться несколько транзактов и все они содержатся в операторе place.

Не следует путать поток транзактов в модели с потоком управлений в обычной программе. Задержка транзакта в place - это и есть время пребывания в узле.

После метки top(i) можно анализировать условия продвижения транзактов по графу модели, при этом используются операторы if или switch. Для динамического изменения направления движения транзактов, законов распределения, значений времени обслуживания и других параметров можно использовать операцию присваивания.

Например, если в узле 3 нужно изменить значение переменной b в зависимости от значения переменной а, то следует записать:

 

top(3): if (a < 0)

b =4;

else

b =3*а+5;

key («Переключатель», b);

place;

 

где

key - оператор, определяющий узел типа клапан.

 

Основным обязательным оператором, который стоит после двоеточия метки-функции, является оператор определения типа узла (узловой оператор). Этот оператор имеет условное наименование, совпадающее с типом узла. Сводка и краткая характеристика всех узлов, имеющихся в системе Pilgrim приводится в Приложении.

В качестве узловых операторов могут использоваться все типы узлов кроме ag и parent.

После узлового оператора могут размещаться сигнальные функции и операторы С++, образуя конструкцию:

 

clcode

{

<операторы>

}

 

Эти операторы могут задавать различные действия по управлению работой модели, например, по сбору статистики или трассировке, которые будут обсуждаться далее.

Последним оператором узла является оператор place;

Описание узла иногда состоит только из метки-функции top(i), узлового оператора и оператора place. Например:

 

top(i): key ( «Переключатель», j );

place;

 

Вопрос 3. Текст программной модели СМО.

 

На рис. 33 показан текст программы, который был сгенерирован на основании описания модели в конструкторе Gem для ранее рассмотренной модели СМО.

 

#include


forward

{

int fw;

modbeg («СМО», 105, 2500, (long)time(NULL), none, 102, none,104, 2);

ag («Генератор», 101, none, expo, 12.0, none, none, 102);

network (dummy, dummy)

{

top (102):

      queue(«Очередь», none, 103);

      place;

top (103):

      serv(«Сервер», 1, none, expo, 9.0, none, none, 104);

      place;

top (104):

      term(«Терминатор 104»);

      place;

fault (123);

}

modend («pilgrim.rep», 1, 8, page);

return 0;

}

 

Рис. 33. Исходный текст программной модели СМО

 

Для лучшего понимания сгенерированного текста приведем описание присутствующих в программе узловых операторов.

Функция ag (Р1, Р2, Р3, Р4, Р5, Р6, Р7, Р8) описывает узел, порождающий в соответствии с заданным правилом в процессе моделирования транзакты и направляющий их в указанную точку (узел) модели.

Функция имеет следующие параметры:

Р1- символическое имя узла (строка длиной до 14 символов типа char);.

Р2- номер узла-генератора (типа int);

Р3- число (типа int в диапазоне 1-32767), обозначающее приоритет, который присваивается сгенерированному транзакту, или none, если приоритет не присваивается;

Р4- тип функции распределения интервала времени между генерируемыми транзактами, имеющий значения:

·     norm - нормальное распределение;

·     unif - равномерное распределение;

·     expo - экспоненциальное распределение;

·     erln - обобщенное распределение Эрланга;

·     beta - треугольное распределение;

·     none -если интервал обслуживания является детерминированной величиной.

 

Р5- величина (типа float), зависящая от типа функции распределения Р4:

·     математическое ожидание интервала времени обслуживания транзакта (при Р4normunifexpo);

·     математическое ожидание одного слагаемого этого интервала (при Р4erln);

·     минимальное значение интервала (при Р4beta);

·     постоянная величина этого интервала (при Р4попе).

 

Р6 – величина (типа float), зависящая от типа функции распределения Р4:

·     среднеквадратичное отклонение времени обслуживания (Р4norm);

·     максимальное отклонение от среднего времени обслуживания (Р4unif);

·     значение zero (Р4 = exponone);

·     число слагаемых, распределенных по экспоненциальному закону и входящих в случайный интервал обслуживания (если Р4erln, то Р6 > 0);

·     наиболее вероятное значение интервала времени обслуживания транзакта (при Р4=beta).

 

Р7- величина (типа float), зависящая от типа функции распределения Р4:

·     максимально возможное значение интервала времени обслуживания транзакта (Р4=beta);

·     значение zero (Р4normunifexpoerln, ш).

 

Р8- номер узла (типа int), в который поступает сгенерированный транзакт (узел-приемник).

Функция queue(Р123) описывает узел, моделирующий очередь транзактов.

Функция имеет следующие параметры.

Р1 – символическое имя узла (строка длиной до 14 символов типа char);

Р– тип организации очереди (типа int):

Р– ргtу, если очередь с приоритетами,

Р– none, если очередь без приоритетов.

Р– номер узла (типа int), в который переходит транзакт из очереди (узел-приемник).

Если в качестве параметра Р6 оператора modbeg поставить номер узла-очереди, то можно автоматически получать график изменения среднего времени нахождения транзактов в этой очереди.

Функция serv (Р1, Р2, Р3, Р4, Р5, Р6, Р7, Р8) описывает узел, имитирующий одно- или многоканальный обслуживающий прибор. Может использовать или не использовать дисциплину обслуживания на основе абсолютных приоритетов. Имеет стек для хранения прерванных транзактов.

Функция имеет следующие параметры:

Р1- символическое имя узла (строка длиной до 14 символов типа char);

Р2- число обслуживающих каналов, l < Р2<32767;

Р3- дисциплина обслуживания; возможные значения:

·     abs, используется приоритетная дисциплина, с прерыванием обслуживания менее приоритетного транзакта более приоритетным; при этом после ухода приоритетного транзакта возможно одно из двух:

·     дообслуживание прерванного транзакта с прерванного места;

·     возобновление обслуживания прерванного транзакта заново.

·     none, используется бесприоритетная дисциплина.

 

Р- тип функции распределения интервала времени обслуживания транзакта в канале узла, возможные значения:

·     norm - нормальное распределение;

·     unif - равномерное распределение;

·     expo - экспоненциальное распределение;

·     erln - обобщенное распределение Эрланга;

·     beta - треугольное распределение;

·     none -если интервал обслуживания является детерминированной величиной.

 

Р5- величина (типа float), зависящая от типа функции распределения:

·     математическое ожидание интервала времени обслуживания транзакта (при Р4normunifexpo);

·     математическое ожидание одного слагаемого этого интервала (при Р4erln);

·     минимальное значение интервала (при Р4beta);

·     постоянная величина этого интервала (при Р4none).

 

Р6 – величина (типа float), зависящая от типа функции распределения:

·     среднеквадратичное отклонение времени обслуживания (Р4norm);

·     максимальное отклонение от среднего времени обслуживания (Р4unif);

·     значение zero (Р4 = exponone);

·     число слагаемых, распределенных по экспоненциальному закону и входящих в случайный интервал обслуживания (если Р4erln, то Р6 > 0);

·     наиболее вероятное значение интервала времени обслуживания транзакта (при Р4=beta).

 

Р7- величина (типа float), зависящая от типа функции распределения:

·     максимально возможное значение интервала времени обслуживания транзакта (Р4=beta);

·     значение zero (Р4normunifexpoerlnnone).

 

Р8- номер узла (типа int), в который передается обслуженный транзакт (узел-приемник).

Функция term (Р1) описывает узел-терминатор, который удаляет из модели входящий в него транзакт и фиксирует время его существования начиная с момента выхода этого транзакта из генератора.

 

Функция имеет один параметр:

Р1- символическое имя узла (строка длиной до 14 символов типа char).

 

Если в качестве параметра Р8 подставить в modbeg номер узла-терминатора, то можно автоматически получать график потока транзактов, поступающих на его вход.

 

Вопрос 4. Сборка и запуск исполнительного модуля модели.

 

Сгенерированный в результате описания модели файл с исходным текстом (<имя модели>.cpp) используется в качестве основы для получения работающей программы. Для этого необходимо выполнить следующую последовательность шагов.

1)      Создать на жестком диске рабочую папку для будущего проекта.

2)      Перенести в рабочую папку файл модели <имя модели>.cpp.

3)      Открыть приложение Microsoft Visual С++.

4)      Создать проект:

·     File à Newà Projects à Win32 Application.

·     В окне Locaton посредством кнопки   (Browse) указать путь к файлу модели <модель>.cpp.

·     В окне Project name указать имя проекта (латинскими буквами) и нажать кнопку OK.

·     В открывшемся окне оставить неизменными установку по умолчанию для типа проекта (Empty application) и нажать кнопку OK.

 

5)      Внести в проект файлы, необходимые для построения объектного кода модели (в таблице указаны папки, в которых обычно хранятся файлы):

 

Файл

Папка

Примечание

Comctl32.lib

Visual Studio/VC98/Lib

Стандартная папка С++

Pilgrim.lib

 Visual Studio/VC98/Lib

Стандартная папка С++

Pilgrim.res

Visual Studio/VC98/ Projects

Стандартная папка С++

<имя модели>.cpp

папка с файлом исходного текста программной модели

Должно соответствовать имени проекта, указанного в окне Location (файл модели);

 

Вставка выполняется командой Add Files To Folder / Add Files To Project контекстного меню, вызываемого правым щелчком мыши после установки курсора на имя проекта (предварительно должна быть выбрана вкладка   в окне проектов).

6)      Построить исполняемый файл модели.

·     Выполняется одним из следующих способов:

o  Build à Rebuild All главного меню Visual Studio.

o  Нажатием функциональной клавиши F7.

o  Нажатием значка   панели инструментов.

 

Если в окне отчета о процессе построения появится сообщение 0 errors, можно запустить программную модель с помощью одного из следующих способов:

·     Build à Execute ModelPro.exe.

·     Нажатием комбинации функциональных клавиш Ctrl + F5.

·     Нажатием значка   панели инструментов.

 

Установка параметров запуска модели и сам запуск производятся с помощью окна запуска. В частности, если требуется наблюдать график задержки по выбранной при построении графа модели очереди в динамике, то перед запуском программной модели нужно выбрать в меню Результаты пункт Динамика задержек в очереди (рис. 34Рис.).

 



 

Рис. 34. Задание динамического отображения очереди

 

Можно также выбрать режим динамического построения графика потока в транзактов в терминаторе (меню Результаты пункт Динамика потока).

После установки всех необходимых значений параметров в меню Моделирование нужно выбрать пункт Запуск модели (рис. 35).

 



 

Рис. 35. Запуск имитационной модели

 

Из общего меню модельного окна осуществляется также управление режимами трассировки, которая может помочь в отладке модели. В частности, имеется возможность (рис. 35):

·     выйти в режим трассировки после наступления конкретного события;

·     перейти в трассировку, если какой-то транзакт входит в определенный узел или выходит из него;

·     отслеживать путь определенного транзакта по графу модели;

·     выйти в режим трассировки по показанию модельного таймера.

 

Вопрос 5. Результаты моделирования.

 

Основные результаты запуска программной модели помещаются в таблицу, которая содержится в файле с параметрами задаваемыми оператором modend. На рис. 36 приводится пример таблицы с результатами моделирования для модели СМО:

 

НАЗВАНИЕ МОДЕЛИ:

СМО

ВРЕМЯ МОДЕЛИРОВАНИЯ:

15029.83

Лист: 1

 

 

 

 

 

 

 

2

 

 

 

 



узла

Наименование

узла

Тип узла

Точка

Загрузка(%=), Путь(км)

M [t] среднее время

C [t] квадрат коэф.вар.

Счетчик входов и hold

Кол. кан.

Оcт. тр.

Состояние узла в этот момент

 

 

 

 

 

 

 

 

 

 

 

101

Генератор

ag

-

-

12.20

0.95

1229

1

1

открыт

102

Очередь

queue

-

-

23.89

1.36

1229

1

1

открыт

103

Сервер

serv

-

%= 73.0

8.94

0.91

1228

1

0

открыт

104

Терминатор

term

-

-

32.82

0.77

1228

0

0

открыт

 

Рис. 36. Результаты моделирования для модели СМО

 

Строки таблицы представляют собой узлы модели, а столбцы – входные и выходные её параметры. В столбцах записываются:

 

узла

Номер узла модели.

Наименование
узла


Имя узла модели.

Тип узла

Тип узла.

Точка

Номер последней точки пространства, в которой находится узел типа creatdelet или proc на момент окончания моделирования.

Загрузка (%), Путь (км)

Для узлов типа serv или proc - коэффициент использования транзактами типа в процентах.

Для узла типа key – доля времени пребывания в закрытом состоянии;

Если производятся пространственные перемещения узлов типа proccreat или delet, то подсчитывается пройденный путь. Для пространства типа GEO путь считается в километрах.

М[t]

среднее время

Среднее значение времени задержки транзакта в узле или иной интервал времени, зависящий от типа узла:

·    для serv - это среднее время пребывания в узле (оно может быть больше времени обслуживания у неприоритетных транзактов при рз=аbs, т.е. при наличии приоритетных транзактов и правила абсолютных приоритетов);

·    для queue - среднее время задержки в очереди;

·    для ag - среднее время между двумя сгенерированными транзактами;

·    для term или delet - среднее время существования транзакта;

·    для key - среднее время пребывания в закрытом состоянии;

·    для creat и dynam - всегда нулевое значение;

·    для proc при p4=none, p4=поrm, p4=ехро или p4=unif - среднее время пребывания в узле (оно может быть больше времени обслуживания транзакта при переводе узла в пассивное состояние);

·    для proc при p4=earth, p4=plane или p4=cosmos -суммарное время пребывания транзакта в узлах dynam и proc с учетом возможных возвратов транзактов из proc вdynam.

C2[t] квадрат коэф.вариации

Отношение дисперсии временного интервала к квадрату его среднего значения.

Счетчик входов и hold

Число транзактов:

·     прошедших через узел;

·     сгенерированных транзактов (для ag или creat);

·     уничтоженных (для term или delet);

·     выполнивших операцию hold из другого узла в отношении узла key.

Кол.каналов

Число каналов в узле.

Ост.тр.

Количество транзактов, которые остались в узле на момент завершения моделирования.

Состояние узла в этот момент

Состояние узла в момент окончания прогона модели:

·     открыт/закрыт для входа очередного транзакта, активен/пассивен (proc);

·     положительное (денежная сумма с буквой S) /отрицательное (денежная сумма с буквой D) сальдо (send);

·     остаток (денежная сумма с буквой S) / дефицит (сумма с буквой D) ресурса (attach) ;

·     количество переходов транзактов на нижние слои-уровни модели (payrent).

 

После окончания процесса моделирования можно посмотреть график, а также выходные параметры всех узлов модели (также с помощью меню Результаты).

Пример отображения графика, построенного в процессе имитации, показан на рис. 37, на котором синим цветом показано среднее время задержки в очереди за все время моделирования.

 



 

Рис. 37. Окно результатов запуска модели

 

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

Изменения можно вносить, минуя стадию создания с помощью конструктора файла .pgf непосредственно в файл .cpp,. Следует иметь в виду, однако, что эти изменения не будут отражены в файле .pgf.

 

Выводы:

1.  Имитационные модели сложных систем могут содержать много узлов со сложными взаимосвязями между ними и сложной логикой протекания процессов. Для описания этих объектов и свойств оригинала в моделирующих комплексах применяются высокоуровневые средства, позволяющие создавать модель прикладным специалистам и не требующих специальных знаний в области программирования.

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

3.  Основные конструкции языка описания моделей в системе Pilgrim имеют унифицированный формат. Настройку моделей можно осуществлять заданием значений параметров узловых операторов и внесением логических конструкций в виде операторов языка С++ или Pascal, обеспечивающих маршрутизацию и управление перемещением транзактов.

4.  В моделирующих комплексах типа Pilgrim модель представляет собой скомпилированный модуль. Для этого необходимо произвести сборку исполнительного модуля, которая в системе реализуется стандартной процедурой в среде пакета Visual Studio с включением в проект необходимых компонентов (модулей) системы Pilgrim.

5.  Конечной целью имитационного моделирования является получение выходных данных. Моделирующие комплексы включают в себя средства для сбора, обработки и вывода стандартной набора параметров, которые в случае системы Pilgrim имеют специфицированный формат и выводятся в файл с отчетом о результатах моделирования.

 

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

1.  Какие взаимосвязанные задачи реализуют языковые средства моделирующих комплексов?

2.  Из каких основных разделов состоит программная модель системы Pilgrim на исходном языке?

3.  Какую функцию выполняет предложение #include
?

4.  Каково назначение оператора modbeg?

5.  Каково назначение оператора modend?

6.  Как можно пронаблюдать в динамике задержки в узлах типа queue?

7.  Как можно пронаблюдать в динамике задержки в узлах типа term?

8.  Как запустить процесс имитации?

 

Литература по теме:

1.  Емельянов А.А., Власова Е.А., Дума Р.В. Имитационное моделирование экономических процессов / Под ред. А.А. Емельянова. – М.: Финансы и статистика, 2009. – 480 с.

 

1   ...   7   8   9   10   11   12   13   14   15


написать администратору сайта