УДК 519.17
Технические науки
Ильичев Владимир Юрьевич, к.т.н., доцент кафедр «Тепловые двигатели и
гидромашины» и «Мехатроника и робототехнические системы» Калужский филиал ФГОУ ВО «Московский государственный технический
университет имени Н.Э. Баумана (национальный исследовательский университет), г. Калуга, Россия, профессор Российской Академии
Естествознания
ВИЗУАЛЬНОЕ ОТОБРАЖЕНИЕ СЕТЕВЫХ ГРАФИЧЕСКИХ СТРУКТУР С ПОМОЩЬЮ БИБЛИОТЕКИ NETWORKX
Аннотация: В статье приведены разработанные автором методики, позволяющие производить визуальное отображение сетевых графов, представленных в виде различных баз данных. Основным инструментом такого преобразования выбрана одна из современнейших, и высоко актуальная для широкого ряда операций библиотека Networks, предназначенная для применения совместно с языком программирования Python, а также другими предназначенными для него модулями. С помощью созданных автором демонстрационных программ разработанная методика применена для выполнения нескольких наглядных примеров создания сетевых графов.
Ключевые слова: теория графов, сетевой граф, база данных, язык Python, библиотека Networks.
Annotation: The article provides the methods developed by the author that allow you to visually display network graphs presented in the form of personal databases. The main tool for such a transformation was chosen one of the most modern and highly relevant for a wide range of operations, the Networks library, designed for use in conjunction with the Python programming language, as well as other modules intended for it. With the help of the demonstration pro-grams created
by the author, the developed technique is used to perform several illustrative examples of creating network graphs.
Keywords: graph theory, network graph, database, Python language, Networks library.
Введение
Одним из наиболее перспективных методов исследования сложных систем является теория графов [1]. Она позволяет производить моделирование даже самых сложных сетей (в том числе электрических, коммуникационных, компьютерных), оптимизируя различные их характеристики [2]. Одним из самых современных средств, позволяющих выполнять такое моделироване, является библиотека языка Python, называемая Networkx [3]. Этот модуль позволяет строить различные типы графов и реализовывать достаточно сложные алгоритмы сетевого анализа. Также данный модуль позволяет хранить базы данных, оформленные в виде сетей как в собственных форматах данных, так и в обычном графическом виде.
Networks позволяет строить сети по алгоритмам (как уже известным, так и вновь создаваемым), а также сети случайного и классического вида [4], позволяя создавать сложные математические модели многих видов [5]. Любой сетевой граф состоит из узлов, содержащих какие-либо данные, а также соединяющих узлы рёбра (в некоторых случаях имеющие направление), также состоящих из любых данных [6]. Достоинствами данного модуля является простота освоения при обладании широкой сферой использования [7]. Сетевой граф чаще всего генерируется из какой-либо базы данных, представленной в виде файла, либо онлайн-структурой.
Таким образом, Networks позволяет выполнять задачи в следующих областях [8]:
- строить графы по стандартным и случайным алгоритмам;
- создавать новые данные для построения графов;
- выполнять анализ структуры сетевых графов;
- создавать узлы по любым данным (тексту, изображениям, XML-записям);
- рёбра графа также могут состоять из любых данных (весовых коэффициентов, временных рядов);
- является свободным для распространения и достаточно простым для освоения программным продуктом.
Целью описываемого исследования являлась разработка методик визуализации результатов работы с библиотекой Networks - от вывода самых простых до достаточно сложных (комплексных) изображений сетевых графов. Данные методики должны при этом оставаться понятными даже для начинающего программиста-разработчика.
Материал и методы исследования
Каждая программа на Python, использующая модуль Networks, должна начинаться с подключения к программному коду этого модуля командой:
import networkx as nx.
Так как результатом работы программы должен являться вывод изображения на экран или в графический файл, следом сразу целесообразно подключить библиотеку Matplotlib [9], наиболее подходящую в связи со своей популярностью для этой задачи:
import matplotlib.pyplot as plt.
Теперь можно создать самые простые графы, например, граф Петерсена [10] (граф, не имеющей ориентации, с задаваемым количеством узлов и рёбер). Команда для его создания уже встроена в библиотеку Networks:
petersen=nx.petersen_graph().
После этого, используя функции модуля Matplotlib, можно выводить разновидности графа Петерсена. Например, на рис. 1 показан такой граф с количеством узлов и рёбер по умолчанию (10 и 15), причём узлы имеют произвольные координаты (которые строятся каждый раз в разных областях рисунка).
Рис. 1. Произвольный граф Петерсена, построенный с помощью программы.
Рис. 1 построен всего лишь с помощью двух команд:
nx.draw(petersen, with_labels=True,font_weight-bold')
plt.show().
Первая команда строит граф, расположенный «в памяти», а вторая выводит его на экран.
На следующем этапе попробуем построить уже направленный и так называемый «взвешенный» (в котором каждое ребро имеет свою значимость, «вес») граф [11] с заданными координатами узлов (и соответственно, концов соединяющих их рёбер). Для алгоритма этой программы уже необходимо привести обобщённую методику, включающую в себя следующие действия:
1. Как и в первой методике, подключение модулей Networks и Matplotlib.
2. Создание пустого графа с помощью команды Gr=nx.Graph().
3. Добавление в граф узлов командой Gr.add_node().
4. Добавление между указанными узлами рёбер направленных графов с указанными весами.
5. Вывод созданной графической сетки на печать и её визуализация.
Приведём пример построения такой графической сетки с направленными
графами (рис. 2) [12].
Рис. 2. Направленный граф со взвешенными рёбрами.
В данном случае граф содержит 3 узла и 3 ребра (их веса на рисунке не указываются).
Приведём более сложный пример, в котором изображено гораздо большее количество элементов, созданных с помощью дополнительных математических функций и функций программирования (например, функции случайного определения позиции узлов и их цвета, а также расположения рёбер). Данный пример изображён на рис. 3.
Рис. 3. Сложный граф, созданный с помощью модуля Networks и прочих математических и
программных модулей.
Таким образом, становится понятным, что с помощью разобранных и дополнительно применяемых средств возможно создание графов любой конфигурации и любого назначения. В частности, при современных исследованиях с помощью рассмотренных приёмов часто изображают нейронный сети, действие которых подробно разобрана автором в некоторых уже изданных научных работах [13; 14].
Созданные и описанные в данной статье методики создания графов можно использовать в информатике, вычислительной технике, экономике, социологии и прочих отраслях науки для следующих случаев:
1. Создание матрицы смежности. В этом случае вершины графа составляются из таблицы обрабатываемой базы данных, где как столбцы, так и строки соответствуют вершинам графа. Достаточно большой недостаток этого случая состоит в том, что величина используемой оперативной памяти пропорциональна квадрату количества узлов.
2. Создание матрицы инцидентности. В данном случае в таблице исходной базы данных строки соответствуют узлам графа, а столбцы соответствуют рёбрам графа.
Данный способ является также довольно ёмким по памяти (размер базы данных пропорционален произведению количества узлов на количество рёбер), но он пригоден для выполнения специфических задач, например, для быстрого нахождения циклов в графе.
3. Создание списка смежности - списка, где каждой вершине графа соответствует строка, в которой хранится список смежных вершин. Такая структура данных не является таблицей, - он представляет собой структуру «список списков».
4. Создание списка рёбер, где каждому ребру графа соответствует строка, в которой хранятся две вершины, соответствующие ребру. Этот способ
является наиболее компактным, поэтому очень часто применяется для обмена данными.
Заключение
Цель описываемого исследования достигнута в полном объёме: проанализированы достоинства и дальнейшие перспективы использования теории графов, а также разработаны базовые методики, позволяющие производить визуализацию баз данных в виде графов разного типа.
Разработаны части кода на языке Python, позволяющие создавать графы, имеющие различную комплексность структур - от самых простых, до очень сложных Во всех описываемых методиках и приёмах применена актуальная, и для данного процесса достаточно простая, но обладающая огромными возможностями, библиотека создания графов Networks. В данном исследовании она позволила продемонстрировать основные принципы теории графов, благодаря их визуализации с помощью вывода наглядных изображений, формируемых функциями другой библиотеки Matplotlib для популярного и широко применяемого языка программирования Python. Такой метод визуального отображения не только не имеет дефектов, но отличается и большим количеством возможностей - формирования не только простейших типов графов, но и графов, имеющих наиболее сложную структуру - с направленными рёбрами, и определёными их «весами», с произвольным соединением узлов в любых сочетаниях. Все эти возможности позволяют считать модуль Networks одним из самых «продвинутых» и при этом имеющих достаточно высокую скорость работы при создании любых сетевых графических структур.
Рассмотренная библиотека создания графических функций, несомненно, очень поможет специалистам, работающим с языком Python, создавать наиболее современные образцы программных продуктов. Следует отдельно отметить, что в качестве узлов графов можно использовать не только обезличенные данные, но и данные любого вида, что отчасти показано на рис. 3. Также специалистам в большом количестве областей современной науки
совершенно очевидно, что кроме помимо вышеописанных утилитарных целей, данная статья ставит задачу популяризации современных технологий и среди широкого круга читателей, приобретающих понимание многих процессов и структур посредством дополнения их описания при помощи наглядных визуальных изображений.
Библиографический список:
1. Kozniewski E. Roof skeletons and graph theory trees. // Геометрия и графика. 2016. Т. 4. № 1. С. 12-20.
2. Ильичев В.Ю., Чухраев И.В., Юрик Е.А. Применение методов компьютерного статистического анализа для прогнозирования потребления электрической энергии. // Информационно-измерительные и управляющие системы. 2020. Т. 18. № 2. С. 24-32.
3. Костенников Д.В. обзор технологий визуализации графов на Python. // В сборнике: Региональная информатика и информационная безопасность. Сборник трудов конференций: Санкт-Петербургской международной конференции и Санкт-Петербургской межрегиональной конференции. Санкт-Петербург, 2020. С. 221-223.
4. Петросян Л.К., Соловьев А.А. Случайное сетевое кодирование. // В сборнике: Безопасность информационного пространства. Сборник трудов XVII Всероссийской научно-практической конференции студентов, аспирантов и молодых ученых: в 2 томах. 2018. С. 180-184.
5. Ilyichev V.Yu. Development of a program for Lorentz attractor research and its use. // The Complex Systems. 2021. № 1 (11). С. 58-64.
6. Краснопольский Н.Д. Алгоритм поиска максимального потока в сетевых графах. // Аллея науки. 2016. № 4. С. 706-710.
7. Ilichev V.Y. Development of program for determination of fractal dimensions of images. // International Research Journal. 2021. № 4-1 (106). С. 6-10.
8. Горохов Д.Б., Чупин В.Ю. Работа со сложными сетевыми структурами на языке Python в научных исследованиях. // Труды Братского
государственного университета. Серия: Естественные и инженерные науки.
2019. Т. 1. С. 43-45.
9. Ilichev V.Y. Creation of software for research of Rössler attractor. // International Journal of Humanities and Natural Sciences. 2021. № 5-1 (56). С. 3135.
10. Монахова Э.А. Оптимальные обобщенные графы Петерсена. // Дискретный анализ и исследование операций. 2009. Т. 16. № 4 (88). С. 47-60.
11. Гданский Н.И., Куликова Н.Л., Чумакова Е.В. Точное решение задачи поиска минимального ациклического пути во взвешенных графах, содержащих ребра отрицательного веса. // Программные продукты и системы. 2018. № 2. С. 260-267.
12. Лисенков В.М., Ваньшин А.Е. Анализ рельсовых цепей методом направленных графов. // Электротехника. 2011. № 8. С. 29-32.
13. Ильичев В.Ю., Чухраев И.В. Обработка данных с использованием глубокого обучения генеративно-состязательной нейронной сети (GAN). // Нейрокомпьютеры: разработка, применение. 2021. Т. 23. № 5. С. 51-56.
14. Ильичев В.Ю. Использование парсинга для создания базы метеорологических данных и разработка на её основе нейросетевой модели прогнозирования скорости ветра. // Системный администратор.
2020. № 10 (215). С. 92-95.