DOI: 10.24412/2413-2527-2021-226-33-44
Особенности программной реализации численно-аналитической модели параллельно-последовательной нестационарной системы обслуживания
К. С. Шардаков Петербургский государственный университет путей сообщения Императора Александра I Санкт-Петербург, Россия k.shardakov@gmail.com
Аннотация. Описываются особенности программной реализации численно-аналитической модели параллельно-последовательной нестационарной системы обслуживания (НСО), описываемой системой однородных дифференциальных уравнений (ОДУ). Программная реализация выполнена на интерпретируемом языке РуШопЗ. Приведены используемые алгоритмы для генерации списка состояний и заполнения матрицы коэффициентов. Описаны ограничения при вычислениях, вызванные выбором языка программирования для реализации.
Ключевые слова: алгоритм генерации матрицы коэффициентов, нестационарная система обслуживания, РуШопЗ, программная реализация, параллельно-последовательная НСО, численно-аналитическая модель.
ВВЕДЕНИЕ
В [1] рассматривается текущее состояние вопроса о нестационарных системах массового обслуживания. Начало «нестационарной» теории массового обслуживания (ТМО) было положено в работах [2-4] и продолжено в [5, 6].
Довольно большое количество нестационарных моделей описано в [7]. В [8, 9] описана и предложена параллельно-последовательная модель, использующая рекурсивный с группировкой алгоритм генерации списка состояний системы и матрицы коэффициентов системы ОДУ Чепмена — Колмогорова. Такой алгоритм позволяет избежать построения графа состояний и переходов НСО, а также позволяет не выводить общее уравнение системы ОДУ, в отличие от работ [10-12]. В работе [13] рассмотрена программная реализация численно-аналитической модели, использующей рекурсивный алгоритм генерации матрицы коэффициентов системы ОДУ. В [14] реализована численно-аналитическая модель параллельно-последовательной НСО. В данной работе рассматриваются детали программной реализации этой модели.
Основной алгоритм и принципы работы модели
Численно-аналитическая модель параллельно-последовательной НСО [14] представляет собой консольную утилиту, написанную на интерпретируемом языке РуШопЗ. Все результаты работы модели выводятся в консоль. В этой работе рассмотрен пример параллельно-последовательной модели с 2 прокси.
Для запуска модели в первую очередь необходимо задать исходные параметры модели в соответствующих
переменных в самых первых строках реализации модели. В модели присутствует всего один класс — класс, определяющий состояние модели. Полями этого класса являются номер состояния и вектора in_system и served. Далее в исходном коде модели определены различные методы, необходимые для ее функционирования. Затем эти методы вызываются в основном теле модели.
В ходе работы модель:
1. Инициализирует переменные с заданными начальными параметрами.
2. Запускает общий таймер — записывает текущее время globalstarttime.
3. Вызывает метод recursive_generate_states(), возвращающий список всех сгенерированных состояний как описанную ранее структуру хранения и количество состояний в ней. В свою очередь внутри этого метода происходят следующие процедуры:
а) запускается таймер generation _start_time на время генерирования списка состояний;
б) вызывается метод strucuture_prepartion(), генерирующий и возвращающий сформированную пустую структуру хранения списка состояний states, состоящую из N + 1 групп, разделенных на N + 1 подгрупп, разделенных в свою очередь на N + 1 подгрупп второго уровня, где N — количество возможных к поступлению на обслуживание заявок; в) создается начальное нулевое состояние zero_patient, все поля которого заполнены нулями и записывается в структуру, полученную на предыдущем шаге:
CocmoRHue(m_system = [0, 0, 0], served = [0, 0]);
г) определяется метод recursive(currentstate), принимающий на вход состояние, с которого алгоритм должен начать процедуру формирования списка состояний (детали работы этого метода подробно описаны в следующем разделе);
д) вызывается метод recursive(currentstate), в качестве входного параметра начального состояния ему передается состояние zero_patient, сгенерированные состояния метод сохраняет в подготовленную структуру states;
е) вызывается метод numbering(states), получающий на вход заполненную структуру со списком состояний states, проводящий сквозную нумерацию этих состояний и возвращающий их количество;
ж) останавливается таймер, для этого сохраненное в нем значение времени generation _start_time вычитается из текущего, выводится время, потраченное на генерирование списка состояний, выводится общее количество состояний
numstates;
з) возвращается структура со списком состояний states и общее количество сгенерированных состояний
numstates.
4. Вызывает метод fill_matrix_a(states, num states), принимающий на вход полученную ранее структуру со списком состояний states и количество состояний num states, результатом работы метода является заполненная матрица коэффициентов А. В процессе работы метода выполняются следующие шаги:
а) создается нулевая матрица размерности numstates;
б) выполняются все действия алгоритма заполнения матрицы коэффициентов А (детальное описание будет дано далее);
в) возвращается заполненная матрица коэффициентов А.
5. Использует таймер globalstarttime, сохраненное время вычитается из текущего, результат выводится как время, затраченное на формирование матрицы коэффициентов А .
6. Вызывает метод is_lower_triangular(matrix_A), принимающий на вход матрицу коэффициентов А и проверяющий, что она действительно является нижнетреугольной, для этого на каждой строке проверяются все значения после главной диагонали на соответствие значения нулю. В случае, когда все такие значения равны нулю, метод возвращает «true». В противоположном случае, при попадании на первый ненулевой элемент метод прекращает свою работу и возвращает «false». Выводится результат проверки.
7. Дальнейшие действия практически идентичны действиям, предложенным в численно-аналитическом методе в [13], поскольку в расчетную часть метода изменения не вносились, за исключением избавления от многопоточно-сти из-за особенностей интерпретатора Python3, о которых будет сказано далее. Заполняется вектор кратностей. Рассчитывается дополнительная матрица коэффициентов. Рассчитываются вероятности. В процессе расчета вероятностей существует несколько вариантов дальнейшей работы:
А. В изначальном варианте происходит расчет вероятностей для указанного момента времени, в полученном векторе каждое значение проверяется на предмет того, не является ли оно меньшим нуля или большим единицы. В случае срабатывания такой проверки выводятся предупреждения. Это означает, что есть ошибки в расчете, они могут быть связаны как с ошибкой в алгоритме, так и с погрешностью расчетов из-за, например, заданной слишком низкой точности. Затем вычисляется сумма результирующего вектора с вероятностями и выводится на консоль, это необходимо для дополнительной проверки верности расчетов, сумма всех вероятностей должна быть равна единице. Затем вектор со значениями рассчитанных вероятностей записывается в файл построчно и содержит в названии момент времени, для которого производился расчет.
Б. Отличие следующей итерации разработки модели только в том, что описанные в пункте А шаги выполняются в цикле несколько раз, для каждого момента времени в рамках ранее указанного количества моментов.
8. Использует таймер global_start_time, сохраненное время вычитается из текущего, результат выводится как полное время работы модели. Для удобства выводится способ округления чисел, заданный в начальных параметрах и использованный при расчетах модели.
На рисунке 1 представлена блок-схема с шагами работы модели, описанными выше. На рисунке 2 представлена блок-схема шага генерирования списка состояний. На рисунке 3 представлена блок-схема шага заполнения матрицы коэффициентов А.
( Н ачало )
Инициализация переменных с входными параметрами модели
Запуск общего таймера сохранением текущего времени
Генерирование списка состояний выз ов recur shv_generate_s tares ()
Заполнение матрицы коэффициентов А вызовfilljmatrixji {states, num_s fates)
Расчет и вывод времени генерирования матрицы коэффициентов А
Проверка, что матрица коэффициентов А
является нижнетреуголь ной, _вывод результата проверки_
Заполнение вектора кратностей
Расчет дополнительной матрицы _коэф фиц центов_
Расчет вероятностей в заданный момент времени
Проверка на отсутствие отрицательных вероятностей или вероятностей больше 1
Проверка, что сумма всех вероятностей равна 1, вывод результата проверки
Расчет и вывод общего времени работы модели
Конец )
Рис. 1. Блок-схема с шагами работы модели
( Начало )
Запуск таймера генерирования списка состояний
г
Генерирование пустой структуры для хранения списка состояний, вызов srniciitw e preoarrion!)
г
Генерирование начального состояния с 0 во всех атрибутах
Определение метода recwshe(ciare>n_aate> с основной логикой генерации списка состояний
1 г
Вызов метода геао яуе(с1в гег1г_!гоге) для созданного нулевого состояния и получение заполненной структуры с состояниями
1 г
Вызов метода mmibei'mglsrares) для последовательной нумерации всех состояний в структуре
* г
Расчет и выв од врем ени ген ерации списка состояний
г
Возврат результатов
( Конец j
Рис. 2. Блок-схема с описанием шага генерирования списка состояний
( Начало j
Подача на вход заполненной структуры с состояниями и количества состояний
Создание нулевой матрицы с размерностью, соответствующей количеству состояний
1
Выполнение алгоритма по заполнению матрицы коэффициентов А
I
Возврат заполненной матрицы коэффициентов А
Конец
Рис. 3. Блок-схема с описанием шага генерирования списка
Процедура формирования списка состояний Все возможные состояния НСО помещаются в специализированную структуру хранения состояний, описанную в [15] и модернизированную для хранения подгрупп второго уровня. Используется тип данных «словарь» (пары «ключ»: «значение») для быстрой проверки существования состояния и его поиска. Ключом является вектор in_system = [т_1, т_2, m_mam], описывающий количество заявок в системе на текущий момент. Такой ключ является уникальным в рамках подгруппы второго уровня. Описанная структура представлена на рисунке 4.
Состояние (т_5уМет[т_1. \п_2, т тат] , зеп-ес1[ош_ргоху, оШ тат])
Структура
Бее состояния [
Группа [ 1! оит упат - сотгапт
Подгруппа [ // еш_ргоху - солдат
Подгруппа 2-го уровня { // |н! '.;|.;,7.7Л - соттт
П пары ключ: значение, ключи уникальны в рамках подгруппы2-го уровня
т_зуиет: Састаяние(т_5у$Тет, вегуеф
Рис. 4. Структура хранения списка возможных состояний НСО
Алгоритм формирования списка состояний реализован следующим образом:
1. В первую очередь алгоритм проверяет, что в текущем состоянии количество обработанных НСО заявок || served || меньше ожидаемого N, где N — количество заявок, которые могут поступить в систему (||served| | < N). Если это условие выполняется, алгоритм продолжает работу. Если условие не выполняется и для текущего состояния количество обработанных заявок равно ожидаемому (| | served 11 = N) — это означает, что алгоритм получил на вход поглощающее состояние. В этом случае работа прерывается, и управление возвращается на предыдущий уровень рекурсии, если он есть, иначе алгоритм завершает свою работу.
2. Следующим этапом алгоритм пытается изменить текущее состояние таким образом, чтобы смоделировать поступление новой заявки на один из прокси-серверов, при условии, что сумма обработанных НСО заявок и находящихся в системе все еще меньше ожидаемого. Происходит это в несколько шагов:
а) создается копия вектора in_system текущего состояния под названием newinsystem = [in_1, in_2, inmain];
б) в созданной копии new_in_system увеличивается счетчик для одного из прокси, например
new_in_system = [in_1+1, in_2, in_main];
в) проверяется существование такого ключа в структуре данных простым обращением в нужную группу второго уровня по этому ключу;
г) если такой ключ существует, алгоритм повторяет предыдущие шаги для следующего прокси, если он есть;
д) если такого ключа не существует, создается новое состояние, которое описывается новым вектором new_in_system и копией вектора served текущего состояния;
е) новое созданное состояние добавляется в структуру хранения, и рекурсивно вызывается метод для этого состояния, как для текущего, что запускает весь алгоритм заново для уже нового состояния.
3. Третьим этапом алгоритм пытается изменить текущее состояние таким образом, чтобы смоделировать завершение обработки заявки на одном из прокси-серверов, при условии, что сумма заявок, находящихся на обработке на прокси-серверах, больше 0 (in_1 + in_2 > 0). Это говорит о наличии возможности применения такого изменения. Происходит это в несколько шагов:
а) в работу берется первый прокси и проверяется наличие текущих заявок на обслуживании; если заявок нет, осуществляется переход к следующему прокси, если заявки есть — алгоритм продолжает работу;
б) создается копия вектора in system, в которой производится декремент заявок на обслуживании текущего прокси и инкремент заявок на обслуживании основного сервера, например
new_in_system=[in_1-1, in_2, in_main+1];
в) создается копия вектора served, в которой производится инкремент количества обслуженных заявок первой подсистемой, например
new_served=[out_proxy+1, outmain];
г) по пути, согласно значениям нового вектора newserved, выполняется проверка существования в структуре хранения в подгруппе второго уровня нового состояния по ключу из вектора new_in_system;
д) если такой ключ существует, алгоритм переходит к следующему прокси, если он есть, и повторяет предыдущие шаги, если же следующего прокси нет, алгоритм переходит к следующему этапу;
е) если такого ключа не существует, алгоритм создает новое состояние из новых векторов new_in_system и new_served;
ж) новое созданное состояние добавляется в структуру хранения, и рекурсивно вызывается метод для этого состояния, как для текущего, что запускает весь алгоритм заново для уже нового состояния.
4. Четвертым, и последним, этапом алгоритм пытается изменить текущее состояние таким образом, чтобы смоделировать завершение обработки заявки на основном сервере, при условии, что в текущем состоянии на нем находятся заявки на обслуживании (inmain > 0). Происходит это в несколько шагов:
а) создается копия вектора in_system, в которой производится декремент заявок на обслуживании основного сервера, например
new_in_system=[in_1, in_2, in_main-1];
б) создается копия вектора served, в которой производится инкремент количества обслуженных заявок второй подсистемой, то есть основным сервером, например
new_served=[out_proxy, out_main+1];
в) по пути, согласно значениям нового вектора new_served выполняется проверка существования в структуре хранения в подгруппе второго уровня нового состояния по ключу из вектора new_in_system;
г) если такой ключ существует, алгоритм завершает свою работу либо возвращает управление на предыдущий уровень рекурсии, если текущий вызов был рекурсивным;
д) если такого ключа не существует, алгоритм создает новое состояние из новых векторов new_in_system и new_served;
е) новое созданное состояние добавляется в структуру хранения, и рекурсивно вызывается метод для этого состояния, как для текущего, что запускает весь алгоритм заново для уже нового состояния.
После того как список состояний сгенерирован, выполняется простейшая сквозная нумерация состояний.
Процедура заполнения матрицы коэффициентов
Последовательно перебирая состояния из сгенерированного списка и применяя правила переходов к каждому подходящему под условия состоянию, становится возможным в то же время заполнять матрицу коэффициентов.
Обозначим матрицу коэффициентов как А, номер текущего состояния — как Num. Номер состояния, из которого можно перейти в текущее, — как FromNum. Интенсивности поступления и обслуживания заявки с номером Num на прокси и на основном сервере — X, ¡л, и ¡лmain соответственно. Затем для каждого состояния применим следующие правила для заполнения матрицы коэффициентов А:
1. Если текущее состояние находится не в последней непустой подгруппе второго уровня, заявка может поступить на обслуживание и возможен переход в следующее состояние:
А = А — 2 ■
^Num,Num ^Num,Num
2. Если текущее состояние находится не в последней подгруппе и не в первой непустой подгруппе второго уровня внутри своей группы, возможен переход:
а) в текущее состояние из предыдущего при поступлении новой заявки в систему:
А —А 4- 7-
rrNum,From_Num rrNum,From_Num > yl;
б) из текущего состояния в следующее при обработке заявки одним из прокси:
ANum,Num ^Num,Num М;
3. Если это не первая непустая подгруппа в своей группе, возможен переход:
а) в текущее состояние из предыдущего при обработке заявки на одном из прокси:
^Num,From_Num ^Num,From_Num + М;
б) из текущего состояния в следующее при обработке заявки основным сервером:
ANum,Num = ANum,Num —
4. Если текущее состояние находится не в первой группе и не в первой непустой подгруппе внутри своей группы, возможен переход в текущее состояние из предыдущего при обработке заявки на основном сервере:
ANum,From_Num ^Num,From_Num +
Для проверки того, что матрица является нижнетреугольной, как ожидается согласно изначальным условиям,
был введен метод is_lower_triangular(), проверяющий результирующую матрицу А на соответствие этому требованию. Метод принимает на вход саму матрицу коэффициентов А и для каждой строки в ней проверяет, что все значения после главной диагонали и до конца строки равны нулю.
На рисунке 5 представлена обобщенная блок-схема алгоритма генерации матрицы A, представляющая из себя последовательность подзадач для эмуляции продвижения заявки по системе.
с
НАЧАЛО
3
N - количество заявок N11111 - номер текущего состояния
N8 - количество состояний таЫхА (N5 х №) = 0 - матрица А
Для каждого состояния из списка состояний выполняем все следующие
подзадачи
_у_
Заявка поступила на прокси (ВЫХОД из текущего состояния)
_5_
Заявка поступила на прокси (ВХОД в текущее состояние) ИЛИ
Заявка обслужена на прокси (ВЫХОД из текущего состояния)
Заявка обслужена на прокси (ВХОД в текущее состояние) ИЛИ
Заявка обслужена на основном сервере (ВЫХОД из текущего состояния)
Заявка обслужена на основном сервере (ВХОД в текущее состояние)
КОНЕЦ
3
Основная идея такого алгоритма — эмуляция перехода в следующее возможное состояние и эмуляция возврата в такое прошлое состояние, из которого можно попасть в текущее. Эмуляция достигается путем применения правил переходов и последующей проверки, существует ли состояние, полученное после применения правила, в списке уже сгенерированных. Наличие такого состояния говорит о необходимости внесения изменений в матрицу А. Плюсы такого подхода:
- всегда известен номер текущего состояния (одна из координат для внесения изменений в матрицу А);
- благодаря использованию типа данных «словарь» для подгрупп второго уровня всегда легко можно найти возможные предыдущие или будущие состояния и получить их номер, который является второй координатой для внесения изменений в матрицу А.
Каждая из подзадач, представленных на рисунке 5, детальнее представлена на рисунках 6-9. Краткое описание значений на блок-схемах:
- group_index, subgroup_index и under_subgroup_index — индексы группы, подгруппы и подгруппы второго уровня в структуре хранения состояний соответственно, описывающих место обрабатываемого в текущий момент состояния в структуре хранения;
- num_of_proxies — параметр модели, описывает количество прокси-серверов в модели;
- Num — номер текущего состояния;
- From_num — номер состояния из которого можно перейти в текущее.
Рис. 5. Обобщенная блок-схема алгоритма генерации матрицы коэффициентов
Рис. 6. Блок-схема алгоритма подзадачи, выход из состояния при поступлении заявки на прокси
Рис. 7. Блок-схема алгоритма подзадачи, вход в состояние при поступлении заявки на прокси и выход из состояния при завершении обслуживания заявки на прокси
Рис. 8. Блок-схема алгоритма подзадачи, вход в состояние при завершении обслуживания заявки на прокси и выход из состояния при завершении обслуживания заявки на основном сервере
Заявка обслужена на основном сервере (ВХОД в текущее состояние)
г
Рис. 9. Блок-схема алгоритма подзадачи, вход в состояние при завершении обслуживания заявки на основном сервере
Когда матрица коэффициентов заполнена, остается только решить полученную систему обыкновенных дифференциальных уравнений Чепмена — Колмогорова при заданных начальных условиях численно-аналитическим методом, предложенным в [8].
Особенности реализации
вычисления вероятностей состояний Для решения составленной системы ОДУ Чепмена — Колмогорова при начальных условиях был использован ранее предложенный и оптимизированный в [13] алгоритм без изменений в логике его работы. Для программной реализации использовался интерпретируемый язык программирования Python3, что внесло некоторые коррективы, связанные с выбором языка реализации, в существующий алгоритм.
Для борьбы с погрешностью вычислений для хранения чисел использовался тип данных Decimal [16], предоставляющий возможность использовать разрядность чисел, ограниченную только размером памяти ЭВМ. Этот тип данных в Python3 хранит значения тем же способом, что и предложенный в [13] тип данных BigDecimal в Java [17]. Эти числа представляют собой сочетание двух значений. Первое — неограниченное значение строкового типа (String, s), второе — 32-битное целое число (Integer, /).
Таким образом, значение числа типа Decimal и BigDecimal представляется в виде: s х 101.
Для контроля погрешности в программу была добавлена возможность задания точности чисел, т. е. количество разрядов, которые могут храниться в мантиссе числа, представляемого типом данных Decimal. Необходимо учитывать тот факт, что чем большая точность чисел используется, тем больше времени требуется на совершение арифметических операций с ними и, соответственно, тем дольше производится расчет решения.
Для проверки точности вычислений вероятностей после их вычисления производится расчет их суммы, которая должна быть равна 1. Дополнительно введены граничные проверки, сообщающие о наличии вероятностей с отрицательными значениями или значениями больше 1. Такие проверки вкупе позволяют оценить верность расчета.
К сожалению, в связи с особенностями интерпретатора Python3, многопоточная реализация части метода, решающей уже составленную систему ОДУ, аналогично предложенной в [10, 13], производит расчет вероятностей медленнее однопоточной, которая, в свою очередь, работает медленнее предложенной в многопоточной реализации на Java. Это связано с использованием GIL (Global Interpreter Lock, глобальная блокировка интерпретатора) [18] в
Python3, который, в отличие от Java, не позволяет потокам приложения в рамках одного процесса использовать одновременно все доступные на исполняемой платформе ядра процессора для распараллеливания потоков. Как результат — все потоки приложения запускаются на одном ядре процессора в конкурентном режиме, на том же ядре, что и родительский процесс самого интерпретатора. Таким образом, мы получаем псевдопараллелизм с обработкой на одном ядре каждого потока последовательно в цикле в течение короткого кванта процессорного времени.
Для решения этой проблемы рассматривалась замена многопоточного режима на многопроцессорный. Этот режим позволяет вместо создания дочерних потоков в рамках одного процесса и выделенного ему изолированного пространства ресурсов создавать дочерние процессы с выделенными им собственными изолированными пространствами ресурсов. Такие дочерние процессы могут быть распределены по нескольким ядрам одного процессора. В этом случае распределение никак не ограничивается интерпретатором Python3. Однако такой подход не оправдал себя в связи с гораздо большими затратами на межпроцессорное взаимодействие между дочерними процессами по сравнению с затратами на взаимодействие между потоками в рамках изолированного пространства одного процесса.
Стоит отметить, что проблема многопоточности присуща только реализации на Python3 и не присуща реализации на Java. Поскольку иных изменений в алгоритме решения уже составленной системы ОДУ не было, и алгоритм может быть реализован на любом другом выбранном языке программирования, поддерживающем параллельное выполнение потоков. Такой недостаток не может быть расценен как недостаток алгоритма, поскольку это недостаток конкретного языка реализации, и не может влиять на его производительность в общем контексте.
Заключение
Предложенная программная реализация имеет некоторые преимущества по отношению к существующей реализации на Java за счет использования новых более быстрых алгоритмов генерации списка возможных состояний НСО и заполнения матрицы коэффициентов системы ОДУ Чепмена — Колмогорова. Стоит заметить, что эти алгоритмы, несмотря на увеличенную скорость работы, не теряют в точности расчетов.
В дальнейшем развитие работы возможно в нескольких направлениях:
1. Сокращение использования памяти для структуры хранения списка состояний за счет избавления от пустых неиспользуемых вложенных структур в ней.
2. Перенос реализации на Java, Golang или другой компилируемый язык программирования для устранения проблемы с GIL и невозможностью использовать многопоточ-ность для ускорения расчетов.
Литература
1. Бубнов, В. П. Обзор существующих моделей нестационарных систем обслуживания и методов их расчета / В. П. Бубнов, В. И. Сафонов, К. С. Шардаков // Системы управления, связи и безопасности. 2020. № 3. С. 65-121. DOI: 10.24411/2410-9916-2020-10303.
2. Коваленко, И. Н. О системе массового обслуживания со скоростью обслуживания, зависящей от числа
требований в системе, и периодическим отключением каналов // Проблемы передачи информации. 1971. Т. VII, Вып. 2. С. 106-111.
3. Ежов, И. И. Распределение количества каналов системы ремонта, когда интенсивность потока изменяется специальным образом / И. И. Ежов, М. Т. Корнийчук, И. Д. Олийнык // Кибернетика. 1976. № 3. С. 92-94.
4. Абольников, Л. М. Нестационарная задача массового обслуживания для систем с бесконечным числом каналов при групповом поступлении требований // Проблемы передачи информации. 1968. Т. IV, Вып. 3. С. 99-102.
5. Арсенишвили, Г. Л. Однолинейная система массового обслуживания с зависящей от величины очереди интенсивностью входящего потока // Сообщения Академии наук Грузинской ССР. 1974. № 2. С. 285-288.
6. Conolly, В. W. Generalized State-Dependent Erlangian Queues: Speculations about Calculating Measures of Effectiveness // Journal of Applied Probability. 1975. Vol. 12, No. 2. Pp. 358-363. DOI: 10.2307/3212451.
7. Бубнов, В. П. Разработка динамических моделей нестационарных систем обслуживания / В. П. Бубнов, В. И. Сафонов. — Санкт-Петербург: Лань,1999. — 63 с.
8. Shardakov, K. S. Stochastic Model of a High-Loaded Monitoring System of Data Transmission Network / K. S. Shardakov, V. P. Bubnov // Models and Methods of Information Systems Research Workshop in the frame of the Betancourt International Engineering Forum (MMISR 2019) (St. Petersburg, Russia, 04-05 December 2019). CEUR Workshop Proceedings. 2020. Vol. 2556. Pp. 29-34. DOI: 10.24412/1613-0073-2556-29-34.
9. Шардаков, К. С. Нестационарная параллельно-последовательная модель высоконагруженной системы мониторинга / К. С. Шардаков, В. П. Бубнов // Информация и космос. 2020. № 3. С. 56-67.
10. Смагин, В. А. О загрузке вычислительной системы с изменяющейся интенсивностью поступления заданий /
B. А. Смагин, В. П. Бубнов, В. И. Сафонов // Автоматика и вычислительная техника. 1987. № 6. С. 19-22.
11. Bubnov, V. P. Software Reliability Model with Coxian Distribution of Length of Intervals Between Errors Detection and Fixing Moments / V. P. Bubnov, A. D. Khomonenko, A. V. Tyrva // 35 th Annual IEEE Computer Software and Applications Conference Workshops (COMPSACW 2011) (Munich, Germany, 18-21 July 2011). — Institute of Electrical and Electronics Engineers, 2011. — Pp. 310-314.
DOI: 10.1109/C0MPSACW.2011.58.
12. Bubnov, V. P. Model of Reliability of the Software with Coxian Distribution of Length of Intervals Between the Moments of Detection of Errors / V. P. Bubnov, A. V. Tyrva, A. D. Kho-monenko // Proceedings of 34th Annual IEEE Computer Software and Applications Conference (COMPSAC 2010) (Seoul, South Korea, 19-23 July 2010). — Institute of Electrical and Electronics Engineers, 2010. — Pp. 238-243.
DOI: 10.1109/COMPSAC.2010.78.
13. Бубнов, В. П. Особенности программной реализации численно-аналитического метода расчета моделей нестационарных систем обслуживания / В. П. Бубнов, А. С. Еремин,
C. А. Сергеев // Труды СПИИРАН. 2015. Вып. 1 (38). C. 218-232. DOI: 10.15622/sp.38.12.
14. Свидетельство о государственной регистрации программы для ЭВМ № 2020662856 Российская Федерация. Программа численно-аналитического расчета вероят-
ностей состояний нестационарной ациклической сети обслуживания с конечным числом заявок: № 2020662236: за-явл. 12.10.2020; опубл. 20.10.2020 / К. С. Шардаков, В. П. Бубнов; заявитель ФГБОУ ВО ПГУПС. — 1 с.
15. Shardakov, K. S. Generating of the Coefficient Matrix of the System of Homogeneous Differential Equations / K. S. Shardakov, V. P. Bubnov, A. N. Pavlov // First Workshop Computer Science and Engineering in the framework of the 5th International Scientific-Methodical Conference «Problems of Mathematical and Natural-Scientific Training in Engineering Education» (CSITinMNSTinEE2018) (St. Petersburg, Russia, 08-09 November 2018). CEUR Workshop Proceedings. 2019. Vol. 2341. Pp. 42-47. DOI: 10.24412/1613-0073-2341-42-47.
16. Decimal — Decimal fixed point and floating point arithmetic // Python 3.9.6 Documentation. URL: http://docs.py-thon.org/3/library/decimal.html (дата обращения 11.05.2021).
17. Class BigDecimal // Java Platform SE7 Documentation. URL: http://docs.oracle.com/javase/7/docs/api/java/math/ BigDecimal.html (дата обращения 11.05.2021).
18. Thread State and the Global Interpreter Lock / Initialization, Finalization, and Threads // Python 3.9.6 Documentation. URL: http://docs.python.org/3/c-api/init.html#thread-state-and-the-global-interpreter-lock (дата обращения 11.05.2021).
DOI: 10.24412/2413-2527-2021-226-33-44
Features of the Software Implementation
of a Numerical-Analytical Model of a Parallel-Sequential Non-Stationary
Queueing System
K. S. Shardakov Emperor Alexander I St. Petersburg State Transport University Saint Petersburg, Russia k. shardakov@gmail.com
Abstract. The features of the software implementation of a numerical-analytical model of a parallel-sequential non-stationary queueing system described by a system of homogeneous differential equations are described. The software implementation is made in the interpreted language Python3. The algorithms used for generating the list of states and filling in the coefficient matrix are presented. Limitations in calculations caused by the choice of the programming language for implementation are described.
Keywords: algorithm for generating a matrix of coefficients of ode, non-stationary queueing system, Python3, software implementation, parallel-serial non-stationary queueing system, numerical-analytical model.
References
1. Bubnov V. P., Safonov V. I., Shardakov K. S. Overview of Existing Models of Non-Stationary Queuing Systems and Methods for Their Calculation [Obzor sushchestvuyushchikh modeley nestatsionarnykh sistem obsluzhivaniya i metodov ikh rascheta], Systems of Control, Communication and Security [Sistemy upravleniya, svyazi i bezopasnosti], 2020, No. 3, Pp. 65-121. DOI: 10.24411/2410-9916-2020-10303.
2. Kovalenko I. N. A Bulk Service System with Service Rate Dependent on the Number of Calls in the System and with Periodic Channel Disconnection [O sisteme massovogo obsluzhivaniya so skorost'yu obsluzhivaniya, zavisyashchey ot chisla trebovaniy v sisteme, i periodicheskim otklyucheniem kanalov], Problems of Information Transmission [Problemy peredachi informatsii], 1971, Vol. VII, Is. 2, Pp. 106-111.
3. Ezhov I. I., Korniychuk M. T., Oliynyk I. D. Distribution of the Number of the Repair System Channels When the Flow Rate Changes in a Special Way [Raspredelenie kolichestva kanalov sistemy remonta, kogda intensivnost' potoka iz-menyaetsya spetsial'nym obrazom], Kibernetika [Kibernetika], 1976, No. 3, Pp. 92-94.
4. Abol'nikov L. M. A Non-Stationary Queueing Problem for a System with an Infinite Number of Channels for a Group Arrival of Requests [Nestatsionarnaya zadacha massovogo obsluzhivaniya dlya sistem s beskonechnym chislom kanalov pri gruppovom postuplenii trebovaniy], Problems of Information Transmission [Problemyperedachi informatsii], 1968, Vol. IV, Is. 3, Pp. 99-102.
5. Arsenishvili G. L. Single-Line Queuing System with Queue-Dependent Incoming Flow Rate [Odnolineynaya sistema massovogo obsluzhivaniya s zavisyashchey ot veli-chiny ocheredi intensivnost'yu vkhodyashchego potoka],
Reports of the Academy of Sciences of the Georgian Soviet Socialist Republic [Soobshcheniya Akademii nauk Gruzinskoy SSR], 1974, No. 2, Pp. 285-288.
6. Conolly B. W. Generalized State-Dependent Erlangian Queues: Speculations about Calculating Measures of Effectiveness, Journal of Applied Probability, 1975, Vol. 12, No. 2, Pp. 358-363. DOI: 10.2307/3212451.
7. Bubnov V. P., Safonov V. I. Development of Dynamic Models of Non-Stationary Service Systems [Razrabotka dinamicheskikh modeley nestatsionarnykh sistem obslu-zhivaniya]. Saint Petersburg, LAN Publishing House, 1999, 63 p.
8. Shardakov K. S., Bubnov V. P. Stochastic Model of a High-Loaded Monitoring System of Data Transmission Network, Models and Methods of Information Systems Research Workshop in the frame of the Betancourt International Engineering Forum (MMISR 2019), St. Petersburg, Russia, December 04-05, 2019. CEUR Workshop Proceedings, 2020, Vol. 2556, Pp. 29-34. DOI: 10.24412/1613-0073-2556-29-34.
9. Shardakov K. S., Bubnov V. P. Non-Stationary Parallel-Serial Model of a High-Load Monitoring System [Nes-tatsionarnaya parallel'no-posledovatel'naya model' vysokonagruzhennoy sistemy monitoringa], Information and Space [Informatsiya i kosmos], 2020, No. 3, Pp. 56-67.
10. Smagin V. A., Bubnov V. P., Safonov V. I. On of the Load of a Computational System with a Varying Intensity of Arrival Tasks Rate [O zagruzke vychislitel'noy sistemy s iz-menyayushcheysya intensivnost'yu postupleniya zadaniy], Avtomatika i Vychislitel'naya Tekhnika [Avtomatika i vychislit-el'naya tekhnika], 1987, No. 6, Pp. 19-22.
11. Bubnov V. P., Khomonenko A. D., Tyrva A. V. Software Reliability Model with Coxian Distribution of Length of Intervals Between Errors Detection and Fixing Moments, 35th Annual IEEE Computer Software and Applications Conference Workshops (COMPSACW 2011), Munich, Germany, July 18-21, 2011. Institute of Electrical and Electronics Engineers, 2011, Pp. 310-314.
DOI: 10.1109/COMPSACW.2011.58.
12. Bubnov V. P., Tyrva A. V., Khomonenko A. D. Model of Reliability of the Software with Coxian Distribution of Length of Intervals Between the Moments of Detection of Errors, Proceedings of 34th Annual IEEE Computer Software and Applications Conference (COMPSAC 2010), Seoul, South Korea, July 19-23, 2010. Institute of Electrical and Electronics Engineers, 2010, Pp. 238-243. DOI: 10.1109/COMPSAC.2010.78.
HHmenneKmyanbHbie техноnогии Ha mpaHcnopme. 2021. № 2
43
13. Bubnov V. P., Eremin A. S., Sergeev S. A. Program Implementation of the Numerical-Analytical Method for Computation of Non-Stationary Service System Models [Osobennosti programmnoy realizatsii chislenno-analiticheskogo metoda rascheta modeley nestatsionarnykh sistem obsluzhivaniya], SPIIRAS Proceedings [Trudy SPIIRAN], 2015, Is. 1 (38), Pp. 218-232. DOI: 10.15622/sp.38.12.
14. Shardakov K. S., Bubnov V. P. Program for the Numerical-Analytical Calculation of the Probabilities of States of a Non-Stationary Acyclic Queueing Network with a Finite Number of Tasks [Programma chislenno-analiticheskogo rascheta veroyatnostey sostoyaniy nestatsionarnoy atsiklich-eskoy seti obsluzhivaniya s konechnym chislom zayavok]. Certificate of State registration of a computer program RU No. 2020662856, published at October 20, 2020.
15. Shardakov K. S., Bubnov V. P., Pavlov A. N. Generating of the Coefficient Matrix of the System of Homogeneous Differential Equations, First Workshop Computer Science and Engineering in the framework of the 5th International Scientific-Methodical Conference «Problems of Mathematical and Natural-Scientific Training in Engineering Education» (CSITinMNSTinEE2018), St. Petersburg, Russia, November 08-09, 2018. CEUR Workshop Proceedings, 2019, Vol. 2341, Pp. 42-47. DOI: 10.24412/1613-0073-2341-42-47.
16. Decimal — Decimal fixed point and floating point arithmetic, Python 3.9.6Documentation.
Available at: http://d0cs.pyth0n.0rg/3/library/decimal.html (accessed 11 May 2021).
17. Class BigDecimal, Java Platform SE7 Documentation. Available at: http://d0cs.0racle.c0m/javase/7/d0cs/api/java/ math/BigDecimal.html (accessed 11 May 2021).
18. Thread State and the Gl0bal Interpreter L0ck, Python 3.9.6 Documentation. Available at: http://d0cs.pyth0n.0rg/3/ c-api/init.html#thread-state-and-the-gl0bal-interpreter-l0ck (accessed 11 May 2021).
HHmenneKmyaMbHue техноnогии Ha mpaHcnopme. 2021. № 2
44