Построение имитационной модели.




В качестве среды для разработки имитационной модели образовательного процесса был выбран язык программирования Python.

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

1. Динамическая типизация. В python не надо заранее объявлять тип переменной, что очень удобно при разработке.

2. Хорошая поддержка модульности.

3. Встроенная поддержка Unicode в строках. В Python необязательно писать всё на английском языке, в программах вполне может использоваться русский язык.

4. Поддержка ООП. При этом его реализация в python является одной из самых понятных.

5. Автоматическая сборка мусора, отсутствие утечек памяти.

6. Интеграция с C/C++, если возможностей python недостаточно.

7. Понятный и лаконичный синтаксис способствующий ясному отображению кода. Удобная система функций позволяет при грамотном подходе создавать код, в котором будет легко разобраться другому человеку в случае необходимости. Также вы сможете научиться читать программы и модули, написанные другими людьми.

8. Огромное количество модулей, как входящих в стандартную поставку Python, так и сторонних. В некоторых случаях для написания программы достаточно лишь найти подходящие модули и правильно их скомбинировать. Таким образом, вы можете думать о составлении программы на более высоком уровне, работая с уже готовыми элементами, выполняющими различные действия.

9. Кроссплатформенность. Программа, написанная на Python, будет функционировать совершенно одинаково вне зависимости от того, в какой операционной системе она запущена. Отличия возникают лишь в редких случаях, и их легко заранее предусмотреть благодаря наличию подробной документации. [11]

Неполный алгоритм работы программной реализации имитационной модели представлен в виде блок схем на рисунках 2.2.1, 2.2.2, 2.2.3. Элементы блок-схемы имеющие содержание типа Функция x – будут рассмотрены далее.

Рисунок 2.2.1 Блок-схема алгоритма имитационной модели

Рисунок 2.2.2 - Блок-схема алгоритма имитационной модели

 

Рисунок 2.2.3 - Блок-схема алгоритма имитационной модели

Рассмотрим подробнее алгоритм работы имитационной модели.

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

1) Генерируется первоначальная очередь, из n числа заявок, при помощи генератора случайных чисел встроенного в язык программирования python (пакет random).

2) Генерируется список устройств обслуживания, на примере показан алгоритм при введённом значении числа устройств – 12.

3) Запускается основной цикл программы, каждая итерация которого имитирует прохождение одной секунды реального времени. Ввиду чего цикл продолжает работы в пределах значений от 1 до 5400, что соответствует длительности академического часа.

4) Во время каждой итерации, срабатывает функция, которая задаёт вероятность добавления в очередь одной или группы заявок.

5) Запускается вложенный цикл, выполняющий обход по устройствам обслуживания. В случае, если обнаруживается незанятое устройство – выполняется пункт 6, иначе происходит переход к следующей итерации.

6) Запускается вложенный цикл, выполняющий обход по заявкам. В случае, если обнаруживается заявка имеющая статус не прошедшей обслуживание – выполняется пункт 7, иначе происходит переход к следующей итерации.

7) В случае, если заявка имеет статус обсуживающейся в данный момент – происходит переход к пункту 8, иначе – к пункту 9.

8) Проверяется таймер заявки. Если время на обслуживание заявки истекло – выполняется пункт 10. Иначе – происходит переход к следующей итерации.

9) Заявка поступает в обслуживание. Для этого у клиента выставляется соответствующий флаг, а обслуживающее устройство, занятое клиентом – становится недоступным и принимает соответствующий флаг.

10) Заявка покидает обслуживающее устройство, принимая статус – обслужен. Устройство обслуживания принимает статус свободно.

11) Выполняется обход по всем имеющимся заявкам в цикле.

12) Если заявка имеет статус в обслуживании, производится переход к пункту 13, иначе происходит переход к следующей итерации минуя пункты 13, 14, 15.

13) Выполняется уменьшение таймера клиента на 1 единицу времени.

14) Выполняется проверка значения таймера заявки. Если время на обслуживание заявки ещё не истекло – происходит переход к следующей итерации. Иначе выполняется пункт 15.

15) Заявка принимает статус завершённой, устройство занятое заявкой – освобождается принимая соответствующий флаг.

16) Выполняется проверка делимости текущего значения общего таймера на 60, для ежеминутного обновления выводимой информации.

17) Выполняется сбор информации о текущем состоянии заявок и устройств, производится вывод информации пользователю.

18) Завершение работы программы.

Для разработки программной реализации необходимо;

- Разработать архитектуру программы;

- Определить необходимые переменные, их типы и первоначальные значения;

- Описать классы и необходимые функции;

- Выбрать пакеты, необходимые для реализации;

- Выбрать среду разработки;

- Выбрать средства разработки;

- Определить, специфику вывода информации;

- Разработать макет пользовательского интерфейса.

В ходе работы, выделилась архитектура программы, представленная на рисунке 2.2.4.

Рисунок 2.2.4.- Архитектура программы

В качестве средства реализации программной модели – выбран интерпретируемый язык Python 2.7. Данный язык поддерживает парадигму объектно-ориентированного программирования, обладает высокой гибкостью, и позволяет построить архитектуру приложения, обозначенную выше.

В качестве среды разработки, была принята IDE PyCharm community edition, распространяемая бесплатно компанией jetBrains. Данная IDE обладает высокой скоростью работы, позволяет выполнять отладку приложений, и имеет ряд полезных функций для быстрого написания программного кода на языке Python. Также стоит отметить, что IDE PyCharm позволяет с легкостью подключать сторонние модули, что положительно сказывается на скорости разработки программного обеспечения.

Разделение программной модели на модули позволяет ускорить процесс написания кода, улучшает его читаемость, облегчает дальнейшее сопровождение и модернизацию. В процессе написания программной модели, модули описанные выше приняли следующие названия:

- Clients.py – Модуль отвечающий за заявки и их обработку;

- Masters.py – Модуль отвечающий за обслуживающие каналы и их обработку;

- test.py – модуль отвечающий за создание тестов;

- Logic.py – модуль отвечающий за логику работы модели и отображения пользовательского интерфейса;

- Tkinter.py – встроенный модуль для построения пользовательского интерфейса(импортирован в модуль Logic.py);

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

Поскольку выбранный для построения программной модели язык Python является объектно-ориентированным языком, каждый модуль программы может содержать один или несколько классов, которые могут так или иначе быть взаимосвязаны, и импортированы в соседний модуль. При написании программы выделились следующие классы:

- Класс Client – реализует создание, обработку, удаление заявок. Расположен в модуле Clients.py;

- Класс Master ­ реализует создание, обработку, удаление обслуживающих устройств. Расположен в модуле Master.py;

- Класс StartLogic – реализует логику работы имитационной модели. Расположен в модуле Logic.py

- Класс Gui – реализует отображение пользовательского интерфейса для взаимодействия с пользователем. Расположен в модуле Logic.py;

- Класс Tests – реализует создание и обработку тестов для заявок. Расположен в модуле test.py.

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

Переменная Clients – представляет собой словарь, содержащий в себе следующие данные:

1) Номер клиента (данный параметр является ключом словаря);

2) Флаг клиента (обслужен, в очереди, обслуживается в данный момент);

3) Таймер клиента (отображает количество итераций цикла, по истечении которых заявка покинет обслуживание);

4) Балл клиента (случайная величина, являющаяся ключевым параметром при генерировании тестов и распределении времени на обслуживание);

5) Тест клиента (представляет собой сгенерированный тест для данной заявки);

6) Номер обслуживающего канала, занятый данным клиентом.

На рисунке 2.2.5 представлена строка кода, описывающая заявку с индексом i и начальными параметрами.

Рисунок 2.2.5 – Описание i-й заявки.

Переменная Masters – представляет собой словарь, содержащий в себе следующие данные:

1) Номер обслуживающего канала (является ключом словаря);

2) Статус данного обслуживающего канала (занят, свободен).

Пример функции для описания нового обслуживающего устройства представлен на рисунке 2.2.6.

Рисунок 2.2.6 – Функция для описания нового обслуживающего устройства

Переменная test – представляет собой словарь, содержащий в себе:

1) Номер клиента, которому предназначается данный тест (является ключом словаря);

2) Номер вопроса;

3) Сложность вопроса;

Оставшиеся переменные, описанные в программном коде, по большей части представляют собой переменные-счётчики, переменные для расчёта определённых параметров, то есть не являются основными и необходимы исключительно для работы программы.

Каждый класс описанный в коде программной модели содержит ряд функций, каждая из которых служит для выполнения определённых операций. Рассмотрим список функций, используемых в программе.

В Классе Logic:

· def START – в функции описана логика работы всей имитационной модели;

· def sborInfo- обеспечивает необходимый сбор данных;

· def KlientStatus –позволяет выводить на экран верное состояние каждой заявки;

В классе Gui:

· def OnScreen – функция отвечающая за вывод на экран пользовательского интерфейса и взаимодействия с пользователем;

· def Graphica- данный элемент позволяет выводить информацию о заявках прошедших тестирование в виде диаграмм;

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

· В классе Client:

· def clientadd – добавление новой заявки в очередь;

· def clientin – перевод статуса заявки в состояние “обслуживается”;

· def clientout –перевод статуса заявки в состояние “готов”;

· def clienttimerminus –уменьшение таймера заявки на еденицу;

· def clientmark – функция задаёт случайную величину баллов для заявки;

· def clienttimer - задаёт время обслуживания в зависимости от оценки;

· def clientcome - задаёт вероятность прибытия одного или пачки студентов.

· def clientNotServed – выполняет подсчёт необслуженных клиентов.

В классе Master:

· def masteradd – добавление нового канала обслуживания;

· def masterwork – перевод канала обслуживания в состояние “Занят”;

· def masrerstop – перевод канала обслуживания в состояние “свободен”;

В классе test:

· def createtest – создаёт вариант тестирования для заявки, в зависимости от ряда параметров.

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

Алгоритм действия функции START, представлен ранее на рисунках 2.2.1, 2.2.2, 2.2.3. Функция объединяет в единое целое все части программы, и описывает ход работы имитационной модели.

Во время создания экземпляров какого-либо класса, вызывается метод __init__ этого класса. В нашем случае, этот метод переопределён для классов: Master, Client и test. Во всех трёх случаях, метод __init__ отвечает за первоначальное заполнение значениями массивов элементов. Его можно представить в виде блок-схемы представленной на рисунке 2.2.7.

Рисунок 2.2.7. - Блок-схема работы блока __init__

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

Функция ClientCome представлена на рисунке 2.2.8:

Рисунок 2.2.8 - Функция ClientCome

Где x1 – вероятность прибытия заявки, x2 – вероятность прибытия пачки заявок.

Для добавления заявок в очередь, описана функция clientadd, которая вызывается один или несколько раз из функции Clientcome, а так же при вызове метода __init__ класса Client. Данная функция представляет собой блок проверки условия на наличие максимального количества заявок, и блока описания новой заявки. Алгоритм представлен на рисунке 2.2.7.

Рисунок 2.2.9 – Алгоритм функции Clientadd.

Функция ClientIn – выполняет ввод заявки в обслуживание, использует внутри себя функцию clienttimer для установки времени обслуживания данного клиента. Алгоритм работы функции ClientIn представлен на рисунке 2.2.10, функции Clienttimer – на рисунке 2.2.11.

Рисунок 2.2.10 – Алгоритм функции

Рисунок 2.2.11 – Алгоритм работы функции Clienttimer

Где f1, f2, f3 – формулы расчёта времени обслуживания заявки, в зависимости от её категории (троечник, ударник, отличник). X1, Х2, Х3 –минимальный проходной балл, балл необходимый для допуска к экзамену на оценку 3, балл необходимый для допуска к экзамену на оценку 4 соответственно.

Также на основании входного балла работает функция Createtest. Её работа заключается в составлении варианта теста для определенной категории заявки с учётом оставшегося времени и количества заявок ожидающих обслуживания. Алгоритм работы данной функции представлен на рисунке 2.2.12.

Рисунок 2.2.12 – функция Createtest

Где x1,x2,x3 – проходные баллы для соответствующей категории тестов (удовлетворительно, хорошо, отлично), f1,f2,f3 – формулы расчёта количества вопросов, заключающиеся в разделении выданного количества времени на обслуживание заявки на отрезки времени предназначенные для каждой из частей тестирования. Таким образом формулы расчёта имеют вид:

Где T – время на одну часть теста, t – общее время обслуживания заявки, n – количество частей теста необходимых для клиента, Nn – количество вопросов в n-ой части теста, tn – максимальное время для ответа на один вопрос из части n. Сгенерированный в результате работы функции тест имеет вид:

{i: [n,K], i+1: [n, K]}, где i – порядковый номер вопроса, K – отметка о прохождении вопроса.

Также неотъемлемой частью программы является обеспечение вывода информации пользователю в понятном и удобном для понимания виде. Для этого служит ряд функций в выделенном классе Gui. Как говорилось ранее, для написания пользовательского интерфейса использовался встроенный модуль Tkinter.

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

Рисунок 2.2.13. – макет интерфейса программной модели

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

Рисунок 2.2.14 – главное окно программы

Разработанный интерфейс программы позволяет видеть все необходимые данные о ходе эксперимента. В верхней части формы пользовательского интерфейса размещён блок вывода данных. Здесь во время выполнения эксперимента можно наблюдать изменение ключевых значений, таких как:

- количество оставшегося времени до конца эксперимента;

- число заявок принятых на обслуживание в данный момент времени;

- число заявок находящихся в очереди на обслуживание;

- число заявок прошедших через обслуживающее устройство;

- количество свободных каналов обслуживания;

- общее число заявок существующих в системе;

- число обслуживающих устройств;

- среднее время на обслуживание одной заявки.

При нажатии на клавишу «Начальные данные» – появляется модальное окно, с предложением ввести значения для условных переменных программы, таких как:

- общее время эксперимента;

- балл для допуска к тесту на оценку отлично;

- балл для допуска к тесту на оценку хорошо;

- балл для допуска к тесту на оценку удовлетворительно;

- вероятность прибытия новой заявки.

Модальное окно представлено на рисунке 2.2.15.

Рисунок 2.2.15 – окно ввода начальных значений

В случае, если поля для ввода остаются пустыми – принимаются значения по умолчанию.

Клавиша «Вывести графику» – генерирует и выводит на экран форму, с отображением числа заявок принятых в обслуживание, с разделением по типу. Пример вывода данной формы представлен на рисунке 2.2.16.

Рисунок 2.2.16.- график принятых клиентов, с разбиением на типы

На графике справа на лево расположены столбцы отображающие количество:

- необслуженных заявок;

- заявок с отметкой «Неудовлетворительно»;

- заявок с отметкой «Удовлетворительно»;

- заявок с отметкой «Хорошо»;

- заявок с отметкой «Отлично»;

После нажатия на клавишу «Старт» – запускается процесс моделирования, главное окно программы в момент выполнения эксперимента представлено на рисунке 2.2.17.

Рисунок 2.2.17. – главное окно программы во время эксперимента

При нажатии на клавишу «Вывести графику» - процесс приостанавливается, а после закрытия модального окна – возобновляется.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-05-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: