Главная страница
Навигация по странице:

  • Успешно изучив тему, Вы: получите представление о

  • Вопрос 1. Замкнутые системы, модели замкнутых систем.

  • Вопрос 4. Замкнутые модели на языке GPSS.

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

  • Моделирование систем лекция. Моделирование систем. Литература по теме Тема Модели на основе метода статистических испытаний


    Скачать 2.59 Mb.
    НазваниеЛитература по теме Тема Модели на основе метода статистических испытаний
    АнкорМоделирование систем лекция
    Дата17.08.2022
    Размер2.59 Mb.
    Формат файлаpdf
    Имя файлаМоделирование систем.pdf
    ТипЛитература
    #647642
    страница9 из 13
    1   ...   5   6   7   8   9   10   11   12   13
    Тема 8. Имитационные модели замкнутых систем
    Цели изучения темы:
     познакомиться с понятием и примерами замкнутой системы;
     получить представление о методике и приемах создания моделей замкнутой системы.
    Задачи изучения темы:
     изучить определение замкнутой системы;
     рассмотреть задачу моделирования замкнутой системы на примере корпоративной информационной системы;
     познакомиться с приемами, применяемыми для создания моделей замкнутых систем;
     освоить приемы сбора данных с помощью имитационной модели.
    Успешно изучив тему, Вы:
    получите представление о:
     том, что называется замкнутой системой;
     почему важно знать способы построения моделей замкнутых систем;
     способах инициализации моделируемых процессов;
     способах отладки имитационной модели;
    будете знать:
     типовые схемы «зарядки» моделей замкнутых систем;
     узлы и сигнальные функции системы Pilgrim, применяемые в схемах «зарядки» моделей замкнутых систем;
     приемы моделирования на примере модели корпоративной информационной системы.
    Вопросы темы:
    1. Замкнутые системы, модели замкнутых систем.
    2. Приемы определения нестандартных выходных параметров.
    3. Пример постановки задачи моделирования многопользовательской корпоративной информационной системы.
    4. Замкнутые модели на языке GPSS.
    5. Построение гистограмм.

    140
    Вопрос 1. Замкнутые системы, модели замкнутых систем.
    Под модельюзамкнутой системы понимается модель, в которой акторы, будучи единожды сгенерированы, циркулируют в пределах графа модели, не погибая в терминаторах.
    Такой моделью, например, может быть модель работы, группы пользователей корпоративной информационной системы с компьютерной сетью в диалоговом режиме. Актор в этом случае имитирует запрос пользователя. Выйдя из узла, имитирующего работу пользователя, актор проходит по графу модели, имитируя обработку в системе, возвращается к пользователю
    (узел), имитируя сформированный ответ, после чего вновь преобразуется в запрос того же пользователя.
    Моделировать каждый новый запрос отдельным актором нельзя, так как нельзя рассчитать заранее время обработки запроса системой
    (это случайная величина) и, следовательно, нельзя задать частоту генератора.
    В этом случае модель может быть построена следующим образом:
     Пользователи (или группы пользователей, в зависимости от сложности моделируемой системы) представляются одно- или многоканальными узлами типа serve (серверы).
     Число каналов сервера соответствует числу пользователей, время обработки актора сервером соответствует времени подготовки пользователями запроса.
     Конкретное состояние актора (запрос – ответ) фиксируется значением одного из его параметров.
     Для зарядки акторами серверов пользователей, принадлежащих к одному классу, используется единственный генератор, порождающий всего один актор. Далее акторы размножаются с помощью узлов типа
    create.

    141
    Так, если требуется смоделировать работу за терминалами
    (клиентскими компьютерами) нескольких пользователей, причем работа каждого пользователя описывается своими временными характеристиками, то это может быть сделано следующим образом (Рис.
    42):
    Рис. 42. Схема «зарядки» замкнутой модели
    В этом графе каждый пользователь имитируется одним узлом модели типа serve. Текст программы на языке Pilgrim будет выглядеть так: actor («Старт»,101, none, none, 1.0, zero, zero, 102); top (102): create («Размножитель», none, Users, none, 104, 103); place; top (103): term («Терминатор»); customize (101, none, none, modtime, zero, zero,102); place; top (104): t->ft = addr[4]->na + 105; t->do1 = Think_time [addr[4]->na]; t->do2 = Query_time [addr[4]->na]; queue («Распределитель», none, t->ft) ; place;
    Значения переменных Users, modtime задают соответственно число пользователей и время моделирования, массивы Think_time и Query_time
    среднее время обдумывания пользователем запроса и среднее время реакции системы на запрос (значения могут устанавливаться в начале программы вместе с описаниями переменных). Конструкция реализует следующую последовательность инициализирующих действий.

    142
    Запрос, сгенерированный узлом actor (узел 101), попадает в узел create узел 102), который генерирует Users акторов (по числу пользователей), не присваивая им номер семейства. Далее эти акторы попадают в очередь (узел 104), где каждому из них присваивается свой номер семейства, равный номеру сервера, в который этот актор должен будет попасть после выхода из узла 102. Присваивание производится с помощью системной переменной addr [4]->na, в которой в каждый момент модельного времени хранится значение числа акторов, прошедших через узел (в данном примере, через узел 104). Таким образом будет обеспечено автоматическое присвоению системной переменной) t->ft нужной последовательности номеров узлов- приемников.
    В параметр актора t->do1 заносится значение среднего времени задержки в сервере, моделирующем работу пользователя. Этот параметр используется при описании серверов пользователей (узлы с номерами из диапазона [105, Users + 104], где Users - число серверов). Кроме того, в параметр актора t->do2 заносится значение среднего времени задержки запроса (обработки) в сервере, моделирующем процессор системы.
    Актор, вышедший из узла actor и покинувший узел 102, переходит далее в терминатор (узел 103). В этом узле он инициирует выполнение сигнальной функции customize, которая переустанавливает параметр узла actor, задающей средний интервал между двумя генерируемыми акторами в modtime (что, по сути, означает отключение узла actor), и уничтожается.
    Вопрос 2. Приемы определения нестандартных выходных
    параметров.
    В ряде моделей помимо выходных данных, собираемых автоматически системой Pilgrim относительно каждого из узлов графа модели, необходимо оценить также и ряд других. В частности, для систем замкнутого типа может представлять интерес время реакции моделируемой системы на пользовательский запрос. Наиболее информативным описанием случайной величины (каковой является в данном примере время реакции), как это известно из теории вероятностей, является ее распределение. Однако во многих случаях оказывается вполне достаточно ограничиться выяснением среднего значения (математического ожидания) этого параметра. Для оценивания среднего времени реакции системы на пользовательский запрос в замкнутой системе можно прибегнуть к таким приемам.

    143 1. Значение среднего времени реакции T
    p можно рассчитать на основании стандартного отчета с результатами моделирования системы
    Pilgrim. Для этого можно воспользоваться следующим выражением:
    1
    р
    о
    T
    T




    ,
    где
    Т
    о
    - означает среднее время обдумывания пользователем ответа системы перед выдачей нового ей очередного запроса (вывод этого выражение весьма несложен).
    2. Значенииt T
    p можно получить в явном виде как среднее значение нахождения узла key в закрытом состоянии, если прибегнуть к приему, который поясним на примере модели, рассмотренной выше.
    Для получения нужного результата в модель нужно добавить дополнительные узлы типа key вместе с соответствующей логикой (Рис.
    43):
    Рис. 43. Узел key как средство сбора данных
    При использовании первого подхода каждому пользователю, который имитируется одним узлом типа
    serve, придается дополнительный узел key, который служит только для целей измерений.
    Актор (запрос к КИС) сначала попадает в узел key и запирает его с помощью сигнальной функции hold (105) (для примера выше). После обработки запроса, когда актор возвращается из модели КИС сервер, имитирующий пользователя, при входе в узел serve он открывает соответствующий узел key с помощью сигнальной функции release (105)
    (для примера выше). В программной модели автоматически измеряется средний интервал нахождения узла key в закрытом состоянии, что и есть не что иное, как математическое ожидание, а также среднеквадратичное отклонение этой величины.

    144
    Вопрос 3. Пример постановки задачи моделирования
    многопользовательской корпоративной информационной системы.
    Рассмотрим следующий пример упрощенной модели КИС, граф которой включает схему зарядки, описанную ранее в настоящей теме, а граф, имитирующий обработку, состоит из одного узла типа queue, имитирующего очередь на обработку, и одного узла типа serve, имитирующего собственно обработку (Рис. 44):
    Рис. 44. Пример модели КИС

    145
    В модели присутствуют четыре пользователя, представленные узлами П_1, П_2, П_3, П_4 типа serve. Для сбора данных о времени реакции системы на запрос пользователя в модель встроены узлы КП_1,
    КП_2, КП_3, КП_4 типа key. Узлы 101, 102, 103 обеспечивают первоначальную зарядку акторами узлов П_1, П_2, П_3, П_4 модели.
    Для некоторой совокупности параметров модели (см. значения параметров в тексте программы следующего вопроса настоящей темы) можно получить следующий результат (Рис. 45):
    Рис. 45. Результаты запуска модели КИС
    Если теперь провести сопоставление значений параметров, полученных для каждого из четырех пользователей непосредственно с помощью узлов типа key и рассчитанных по приведенной выше формуле, то результаты будут следующими (Рис. 46):

    146
    Рис. 46. Время реакции КИС
    Как видим, наблюдаемые расхождения в значениях параметров оказываются крайне незначительными.
    Обязательным этапом процесса моделирования является этап обоснования модели, или подтверждения адекватности. К одному из типовых приемов, используемых для этой цели, принадлежит
    трассировка программной модели. Целью трассировки является построения временной диаграммы имитируемых процессов и сопоставления ее с ожидаемой. Рассмотрим возможный вариант реализации трассировки на примере упрощенной модели КИС (см. предыдущий вопрос настоящей темы).
    Ниже приводится текст программной модели, имеющей дополнительные конструкции
    С++, которые обеспечивают отслеживание во времени состояние акторов модели:
    /******************************************************************
    **********/
    #include
    //Для вывода результатов трассировки ---------------------------------------------------
    ------------------
    #include
    //для функции create ()
    #include
    //потоковый класс
    #include
    //значения параметров amode
    //---------------------------------------------------------------------------------------------------
    ------------------- forward
    { int USERS=4; double Q_time [] = {57.6,67.2,72,64.8}; double T_time [] = {72, 96, 120, 144}; double modtime=50000.0;
    //Выводной файл-------------------------------------------------------------------------------
    ---------------- int fileNumb=creat («C:\\MyResults.txt S_IWRITE)
    «; // файла для вывода ofstream fileOut; fileOut.attach (fileNumb);

    147
    //---------------------------------------------------------------------------------------------------
    ------------------- modbeg («КИС», 120, modtime, (long)1234567890, none, 109, none, none, 2); actor («Старт», 101, none, none, 1, none, none, 102); network (dummy, standard)
    { top (102): create («Размножитель», none, USERS, none, 104, 103); place; top (103): term («Стоп»); agent
    { customize (101, none, none, modtime, zero, zero, 102);
    } place; top (104): t->ft=addr [104]->na + 105; t->do1=T_time[addr[104]->na]; t->do2=Q_time[addr[104]->na]; queue («Распределитель», none, t->ft); place; top (105): release (115); serve («П_1», 1, none, norm, t->do1, t->do1/3, none, 115); agent
    { fileOut << «\n» << t->ft << « Тотв=« << timer;
    } place; top (106): release (116); serve («П_2», 1, none, norm, t->do1, t->do1/3, none, 116); agent
    { fileOut << «\n» << t->ft << « Тотв=« << timer;
    } place; top (107): release (117); serve («П_3», 1, none, norm, t->do1, t->do1/3, none, 117); agent
    { fileOut << «\n» << t->ft << « Тотв=« << timer ;
    } place; top (108): release (118); serve («П_4», 1, none, norm, t->do1, t->do1/3, none, 118); agent
    { fileOut << «\n» << t->ft << « Тотв=« << timer ;

    148
    } place; top (115): key («КП_1», 109); hold (115); place; top (116): key («КП_2», 109); hold (116); place; top (117): key («КП_3», 109);; hold (117); place; top (118): key («КП_4», 109); hold (118); place; top (109): queue («Очередь», none, 110); agent
    { fileOut << «\n» << t->ft << « Tвыд=« << timer;
    } place; top (110): serve(«КИС», 1, none, norm, t->do2, t->do2/3, none, t->ft); agent
    { fileOut << «\n» << t->ft << « Tобс=« << timer;
    } place; fault (123);
    } modend («КИС.rep», 1, 28, page); return 0;
    }
    В программной модели присутствуют операторы, которые выводят в fileOut (описан в начальной части программы) моменты появления акторов в основных узлах модели: Тотв (получение пользователем ответа от системы), Tвыд (выдача пользователем запроса системе), Tобс
    (начало обработки пользовательского запроса).
    Операторы записываются в блоках agent, что гарантирует их выполнение точно в моменты вхождения актора в соответствующий узел.

    149
    Ниже приведен начальный фрагмент трассировки (содержимого файла C:\\MyResults.txt) без первых строк, в которой содержатся моменты первоначального занесения акторов, сгенерированных схемой зарядки:
    105 Tвыд=49.9005 105 Tобс=49.9005 106 Tвыд=70.7441 107 Tвыд=93.8595 105 Тотв=121.851 106 Tобс=121.851 108 Tвыд=167.247 105 Tвыд=178.985 106 Тотв=181.122 107 Tобс=181.122 106 Tвыд=265.4 107 Тотв=274.487 108 Tобс=274.487 108 Тотв=349.432 105 Tобс=349.432 105 Тотв=370.114 106 Tобс=370.114 107 Tвыд=389.957 106 Тотв=420.103 107 Tобс=420.103 105 Tвыд=464.913 107 Тотв=476.97 105 Tобс=476.97 106 Tвыд=494.919 108 Tвыд=500.144 105 Тотв=523.164
    Анализируя полученные записи можно оценить, насколько корректно воспроизводятся в имитационной модели процессы, протекающие в реальной системе.
    Вопрос 4. Замкнутые модели на языке GPSS.
    Рассмотрим пример созданя замкнутой модели на языке GPSS.
    Пусть необходимо проанализировать параметры работы отдела доставки интернет-магазина. В отделе работает несколько курьеров, которые получают у менеджера адрес покупателя и товар, доставляют его адресату и возвращаются обратно за получением нового задания.
    Необходимо оценить эффективность организации службы доставки.

    150
    Будем вначале считать, что задания в магазине выдает один менеджер. Текст модели для этого случая показан на Рис.47.
    Рис. 47. Модель службы доставки с одним менеджером
    Первые два оператора предназначены для описания статистических таблиц, в первой таблице собирается информация о размере очереди к менеджеру, во второй – о времени ожидания курьеров.
    В третьей строке записан оператор GENERATE,,,6. Его полный формат выглядит так:
    GENERATE [A], [B], [C], [D], [E], где
    операнд [A] – средний интервал времени;
    операнд [B] – половина интервала равномерного распределения;
    операнд [C] – смещение интервалов;
    операнд [D] – ограничитель транзактов;
    операнд [E] – уровень приоритета транзактов.
    Все операнды необязательны, поэтому возможна запись
    GENERATE,,,,.
    Таким образом, оператор GENERATE создает за нулевое время 6 транзактов, которые имитируют работающих в магазине курьеров.

    151
    Каждый из сгенерированных транзактов попадает в очередь
    (Shipping), в которой дожидается освобождения менеджера (SEIZE
    Manager), освобождает очередь (DEPART Shipping), получает от менеджера задание и товар, на что уходит 8±4 минут (ADVANCE 8,4), и уезжает (RELEASE Manager). Поездка занимает у курьера 45±15 минут
    (ADVANCE 45,15), после чего он возвращается обратно в магазин.
    Для имитации перемещения курьера здесь используется оператор
    TRANSFER, который позволяет направить транзакт к любому блоку модели. Общий вид формата оператора следующий:
    TRANSFER [A], [B], [C], [D], где
    операнд [A] – способ выбора блока;
    операнд [B] – необязательное имя блока перехода;
    операнд [C] – необязательное имя блока перехода.
    Смысл операндов B, C, D определяется значением операнда A, задающего режим перехода. В данной модели используется безусловный режим (,), при котором второй операнд задает имя метки блока, на который должен перейти транзакт. Таким образом, транзакт (курьер) по завершении своей поездки вновь возвращается в свой магазин (Office).
    Последние три оператора модели обеспечивают ее автоматические запуск на выполнение и остановку по завершении заданного времени.
    Оператор START 1 запускает прогон после завершения трансляции модели, оператор GENERATE создает по прошествии 480 минут
    (рабочий день) один транзакт, который с помощью оператора
    TERMINATE 1 останавливает прогон.
    Результат прогона при этих исходных данных показан на Рис.48.

    152
    Рис. 48. Результаты моделирования службы доставки с одним
    менеджером
    Как нетрудно видеть, работа службы доставки при заданных условиях оказывается не очень эффективной – число ожидающих в очереди курьеров довольно значительно (среднее значение 7,282), время ожидания также велико (среднее значение 10,453). Поэтому будет интересно оценить ситуацию, когда в помощь менеджеру придается помощник, который, будет выдавать курьерам задания в случае его занятости.
    Текст модели для этого случая показан на Рис.3. В этой модели присутствуют два менеджера (Manager_1 и Manager_2), причем полагается, что помощник не обладает опытом работы своего старшего товарища и выполняет работу медленнее (12±4минуты). Поэтому пришедшие курьеры попытаются сначала получить задание у первого менеджера, а уже потом обращаться ко второму. Для имитации такого поведения в модели используется оператор TRANSFER в формате
    TRANSFER BOTH, Man_1, Man_2. Это означает, что транзакт будет направляться в блок с меткой Man_1 (первый менеджер) в случае, когда он свободен, и на блок с меткой Man_2 (второй менеджер) в случае, когда первый занят, а второй свободен. После обслуживания в том или ином блоке транзакт попадает на блок с меткой Ready – с помощью оператора TRANSFER, Ready, если он вышел из блока Man_1, или
    «естественным» образом, если он вышел из блока Man_2 (блок Ready имитирует поездку курьера).

    153
    Поскольку выход из очереди теперь может произойти в двух точках модели, необходимо поместить оператор TABULATE W_desk в каждой из них.
    Рис. 49. Модель службы доставки с двумя менеджерами
    Если обратиться к результатам моделирования (Рис.50), то увидим, что, несмотря на относительно низкую производительность добавленного помощника, показатели улучшились примерно в пять раз
    (1,284 человека и 2,197 минут для среднего размера очереди и времени ожидания).

    154
    Рис. 50. Результаты моделирования службы доставки с двумя
    менеджерами
    Рассмотренные модели относятся к моделям замкнутого типа.
    Такие модели характерны тем, что число транзактов остается в течение всего времени моделирования неизменным. Это отличает замкнутые модели от моделей, рассмотренных ранее и называемых разомкнутыми, где происходили процессы постоянного появления транзактов на входе модели и выхода из нее.
    Вопрос 5. Построение гистограмм.
    В ряде задач результат в виде средних значений и среднеквадратичных отклонений показателей исследуемой системы бывает недостаточно информативен и требуется более подробное описание показателя, которое получается в этом случае в виде гистограмм, отображающих частоты распределения значений показателя.
    Собрать необходимые сведения для построения гистограммы можно непосредственным включением операторов языка С++ в текст исходного модуля pilgrim-модели. Поясним возможный прием на примере модели
    СМО, рассматривавшейся в предыдущих темах.
    Пусть необходимо получить детальную информацию о времени нахождения заявки (актора) в системе. Будем собирать эти сведения в виде массива частот counts, описание которого приведем в тексте программной модели:

    155
    /*
    ЗАГОЛОВОЧНЫЕ
    ФАЙЛЫ*******************************************************/
    #include
    //Pilgrim
    #include
    //для функции create ()
    #include
    //потоковый класс
    #include
    //значения параметров amode
    #include
    //манипуляторы ввода-вывода
    #include
    //константы предельных значений
    /*Вывод данных гистограммы
    ********************************************************/ void printhist (char hdr[] /* заголовок отчета */, int fileNumb
    /* выводной файл */, int dim
    /* размерность массивов*/, double bounds [] /* границы значений */, int counts []
    /* частоты значений */)
    { ofstream fileOut; int i; double sum, mn; fileOut.attach (fileNumb); for (i=0,sum=0; i<< hdr << setprecision (4); fileOut
    << «\n---------------------------------------------»
    <<
    «\n»
    << setw(5)<<«MIN»<< setw(10)<<«MAX»<«N»<<< «\n---------------------------------------------»; for (i=0; i{ if (bounds[i]==FLT_MIN) fileOut << «\n» << setw(5) << «<<<«; else fileOut << «\n» << setw(5) << bounds[i]; if (bounds[i+1]==DBL_MAX) fileOut <>>«; else fileOut < (counts[i])/sum; } fileOut
    << «\n---------------------------------------------»; fileOut << «Среднее= « << mn << endl;
    }

    156
    /******************************************************************
    *****************/ forward
    {
    /*********
    ИНИЦИАЛИЗАЦИЯ СРЕДСТВ СБОРА СТАТИСТИКИ
    **************************/ int fileNumb = create («C:\\MyResults.txt», S_IWRITE);
    // выводной файл double bounds [] = { 0.0, 10.0, 20.0, 30.0, 40.0, 50.0,
    // границы интервалов
    60.0, 70.0, 80.0, 90.0, 100.0, DBL_MAX };
    // границы интервалов int const dim = sizeof bounds / sizeof (double)-1;
    // число интервалов int counts [dim]={ 0 };
    // счетчики ofstream fileOut;
    // выводной файл fileOut.attach (fileNumb);
    // присоединение int i;
    // индекс
    //---------------------------------------------------------------------------------------------------
    ----------------------------- modbeg («СМО», 105, 15000, (long)time(NULL), none, 102, none,104, 2); actor («Генератор», 101, none, expo, 12.0, none, none, 102); network (dummy, standard)
    { top (102): t->do1 = timer; //Запоминание момента входа в систему queue («Очередь «, none, 103); place; top (103): serve («Сервер», 1, none, expo, 9.0, none, none, 104); place; top (104): term («Терминатор»); agent /* Выход из системы - сбор статистики */
    { for (i=0; i< dim; i++) if (timer-t->do1>bounds[i] & timer-t->do1<=bounds[i+1]) counts[i]++;
    } place; fault (123);
    } printhist («Тпребывания «, fileNumb, dim, bounds, counts); // вывод собранной статистики modend («pilgrim.rep», 1, 8, page); return 0;
    }
    Границы интервалов изменения исследуемого показателя задаются в программе в массиве bounds, верхней границей которого являются максимально возможное значение чисел типа double (DBL_MAX).

    157
    Вывод собранных в массиве counts частот осуществляет функция printhist, в которой подсчитывается и выводится также среднее значение показателя Тср.
    Примером полученных статистических данных может быть (Рис.
    51):
    Тпребывания:
    Рис. 51. Пример вывода статистических данных
    Используя любое доступное средство (например, построитель диаграмм Excel) числовые данные можно представить в графическом виде (Рис. 52):
    Рис. 52. Статистические данные в виде диаграммы
    В необходимых случаях результат можно аппроксимировать теоретическим распределением, применяя подход, который рассматривался ранее.

    158
    Выводы:
    1. Важным классом систем, для анализа и проектирования которых используется аппарат имитационного моделирования, являются замкнутые системы, в которых отсутствуют потоки между ними и внешней средой. Для создания моделей таких систем используются специальные приемы, называемые в системе Pilgrim схемами зарядки.
    2. Задачами схемы зарядки являются внесение в программную модель необходимого числа акторов, которые имитируют в случае моделирования информационной системы, пользователей системы. Для различных случаев, зависящих от характера работы и численности пользователей, разработаны специальные типовые приемы для решения этой задачи.
    3. В ряде задач требуется получить результаты, не входящие в стандартный перечень, выдаваемый моделирующей системой. В таких ситуациях в моделях необходимо предусмотреть специальные средства для сбора и выдачи результатов. Эти средства реализуются применительно к специфике используемой моделирующей системы.
    4. Важным этапом моделирования является этап ее отладки и обоснования адекватности модели. Для эффективной реализации этой задачи необходимо использовать различные методы и приемы. Одним из наиболее часто применяемых подходов является трассировка модели.
    Вопросы для самопроверки:
    1. Что такое замкнутая система (модель)?
    2. Почему в замкнутой Pilgrim-модели нельзя моделировать каждый новый запрос отдельным актором?
    3. Какие узлы Pilgrim используются для моделирования замкнутых систем?
    4. Какие показатели могут потребоваться помимо автоматически получаемых системой Pilgrim?
    5. Какими приемами можно воспользоваться для получения значения дополнительных показателей в модели Pilgrim?
    6. Какие средства языка GPSS используются для моделирования замкнутых систем?
    Литература по теме:
    1. Градов В.М. Компьютерное моделирование: учебник / В.М.
    Градов, Г.В. Овечкин, П.В. Овечкин, И.В. Рудаков. – М.: ИНФРА-М,
    2017. – 264с.
    2. Емельянов А.А., Емельянова Н.З. Имитационное моделирование и компьютерный анализ экономических процессов – Смоленск,
    Универсум, 2013 – 266 с.

    159
    1   ...   5   6   7   8   9   10   11   12   13


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