<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=LanaLana</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=LanaLana"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/LanaLana"/>
	<updated>2026-10-22T23:57:40Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18665</id>
		<title>Алгоритм распространения констант для задачи поиска сообществ в социальном графе</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18665"/>
		<updated>2016-11-20T22:17:32Z</updated>

		<summary type="html">&lt;p&gt;LanaLana: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор студенческой работы: [[Участник:LanaLana|Светлана Илларионова]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
[[file: Search-communities.jpg|thumb|right|200px|Рисунок 1. Пример разбиения на сообщества]]&lt;br /&gt;
== Общее описание алгоритма==&lt;br /&gt;
Рассматривается задача поиска сообществ в неориенетированном графе с весами, значениями которых являются действительными неотрицательными числами. Приведем примеры, где в реальной жизни могут втсречаться такие структуры: задачи, возникающие в социальной медиа структуре (то есть это многочисленные социальные сети), задачи, связанные с медициной и биоинформатикой, бизнес-задачи. Главная идея, которую преследуют, решая вышеперечисленные проблемы &amp;amp;mdash; это выделение из общей совокупности объектов, групп, объекты внутри которых сильно взаимосвязаны. В качестве подхода к решению будем рассматривать алгоритм Label Propagation, применяя который получим, что вершины одного сообщества будут сильно связаны, а вершины из разных сообществ будут слабо связаны.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Дан граф &amp;lt;math&amp;gt; G = (V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V &amp;lt;/math&amp;gt; &amp;amp;mdash; множество вершин, &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; &amp;amp;mdash; множество ребер, &amp;lt;math&amp;gt; w (u, v) &amp;lt;/math&amp;gt; &amp;amp;mdash; вес каждого ребра &amp;lt;math&amp;gt; e(u, v) \in E, u, v \in V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Цель задачи &amp;amp;mdash; найти такое разбиение графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; на множество &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; непересекающихся сообществ вершин &amp;lt;math&amp;gt;c_i \subseteq V&amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; \cup c_i = V, \forall c_i \in C &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; c_i \cap c_j = \varnothing, \forall c_i, c_j \in C, i \neq j, &amp;lt;/math&amp;gt; чтобы максимизировать функционал модулярности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q = \sum_{c \in C} \left(\frac{\sum_{in}^{c}}{m} - \left[\frac{\sum{out}^{c}}{m} \right]^2\right)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt; \sum_{in}^{c} = \sum_{u, v \in c, e(u, v) \in E} w(u, v), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{out}^{c} = \sum_{in}^{c} + \sum_{u \in c, v \notin c, e(u, v) \in E} w(u, v)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; m = \sum_{e(u, v) \in E} w(u, v).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{in}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех внутренних рёбер сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{out}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех рёбер, исходящих из вершин сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; &amp;amp;mdash; нормализующий коэффициент, сумма весов рёбер графа.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро &amp;amp;mdash; та часть алгоритма, на которую приходится основное время работы алгоритма. В данном случае к вычислительному ядру не относится только часть инициализации. Вычислительное ядро включает в себя цикл, в котором необходимое число раз осуществляется прохождение по всем вершинам графа и отнесения их к соответствующим компонентам.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма==&lt;br /&gt;
В реализации данного алгоритма нет необходимости выделять макроструктуры для его дальнейшего описания.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма== &lt;br /&gt;
В начальный момент времени каждой вершине приписана уникальная метка сообщества. Обновление меток вершин осуществляется по следующему принципу: у каждой вершины есть определенное число смежных вершин, которым приписаны метки каких-то сообществ, также у ребер между вершинами определены свои веса. На очередном шаге определим метку вершины &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. У соседей этой вершины метки сообществ, к которым они принадлежат, могут быть различными. Рассмотрим каждый тип меток. Для вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го типа считаем сумму весов ребер, которые соединяют эти вершины с изучаемой вершиной &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. Приписываем нашей вершине ту метку, для которой эта сумма оказалась максимальной. Итерации происходят до тех пор, пока меняются метки вершин. В стандартном алгоритме принято рассматривать вершины в случайном порядке, это позволяет улучшить метрику. Можно отказаться от переупорядочивания вершин для увеличения быстродействия вычислений. Также в параллельной версии программы потоки в рамках одного узла могут конкурировать, производить вычисления неравномерно, засчёт чего достигается эффект случайности в обработке вершин. &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма==&lt;br /&gt;
Сложность алгоритма: &amp;lt;math&amp;gt;O(n + m)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n, m&amp;lt;/math&amp;gt; &amp;amp;mdash; число вершин и ребер.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф==&lt;br /&gt;
[[File:Community detection information graph.svg|thumb|right|100px|Рисунок 2. Информационный граф]]&lt;br /&gt;
Данные на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; итерации зависят от данных на &amp;lt;math&amp;gt;i- 1&amp;lt;/math&amp;gt; итерации. На рисунке 2 изображены вершины графа и влияние на их принадлежность той или иной компоненте на последующей итерации знаний о распределении вершин по компонентам на текущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Разбиваем множество вершин на заданное число узлов. Каждый узел пересчитывает метки для своего набора вершин. Массивы меток для всех вершин синхронизируются с помощью операции MPI_Allgather.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность: &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;amp;mdash; число вершин.&lt;br /&gt;
Это убословлено тем фактом, что &amp;lt;math&amp;gt;O(n + m) = O(n) + O(m)&amp;lt;/math&amp;gt;, так как есть часть алгоритма, которая обрабатывает ребра графа, и мы её можем распараллелить.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму подаётся граф, который хранится как разреженная матрица смежности в формате CSR. &lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
&lt;br /&gt;
Выходными данными алгоритма является множество меток вершин в зависимости от их принадлежности компонентам.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма==&lt;br /&gt;
К достоинствам алгоритма Label Propagation можно отнести следующие его аспекты:&lt;br /&gt;
* время работы&lt;br /&gt;
* количество итераций слабо зависит от размера графа&lt;br /&gt;
* прост в понимании&lt;br /&gt;
Недостатками алгоритма являются:&lt;br /&gt;
* недетерминированность, то есть на одном и том же наборе входных данных при новом запуске результат может получиться отличным от предыдущего&lt;br /&gt;
* при некоторых входных данных может давать плохие решения&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. Без OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 29.7823 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 15.4772 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 8.2046 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 5.09298 s.&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 1&lt;br /&gt;
| 2.63555 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. С OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 9.21499 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 4.37143 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 3.41528 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4&lt;br /&gt;
| 3.87224 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. Без OpenMP&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 68.7771 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 36.1929 s&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 21.6286 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 23.8237 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. C OpenMP&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 21.5797 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 11.7228 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 11.5657 s. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, начиная с определенного момента, когда время синхронизации меток для вершин становится соразмерным с временем вычисления меток. Чем менье степень вершин, тем раньше алгоритм перестает масштабироваться.&lt;br /&gt;
&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
Пример одноузловой реализации данного алгоритма описан в статье [https://arxiv.org/pdf/1304.4453.pdf Engineering Parallel Algorithms for Community Detection in Massive Networks]&lt;br /&gt;
&lt;br /&gt;
=Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. &amp;quot;Lancichinetti-Fortunato-Radicchi Benchmark.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2015. Web. 13 November 2016 https://en.wikipedia.org/wiki/Lancichinetti-Fortunato-Radicchi_Benchmark&lt;br /&gt;
&lt;br /&gt;
2. &amp;quot;Help:Wiki markup.&amp;quot; Wikipedia, the free encyclopedia. 12 November 2016‎. Web. 13 November 2016 https://en.wikipedia.org/wiki/Help:Wiki_markup&lt;br /&gt;
&lt;br /&gt;
3. &amp;quot;Label Propagation Algorithm.&amp;quot; 9 November 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Label_Propagation_Algorithm&lt;br /&gt;
&lt;br /&gt;
4.  Спецкурс &amp;quot;Параллельная обработка больших графов&amp;quot; Лекция 4. к.т.н. Александр Сергеевич Семенов. 11 November 2016. Web. 13 November 2016. http://dislab.org/PLGP/PLGP_lecture4.pdf&lt;br /&gt;
&lt;br /&gt;
5. &amp;quot;Sparse matrix.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Sparse_matrix&lt;br /&gt;
&lt;br /&gt;
6. А.С.Антонов &amp;quot;Параллельное программирование с использованием технологии MPI&amp;quot;.-М.: Изд-во МГУ, 2004.-71 с.&lt;br /&gt;
&lt;br /&gt;
7. &amp;quot;OpenMP 4.5 Specifications&amp;quot; Nov 2015. Web. http://www.openmp.org/wp-content/uploads/openmp-4.5.pdf&lt;/div&gt;</summary>
		<author><name>LanaLana</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18639</id>
		<title>Алгоритм распространения констант для задачи поиска сообществ в социальном графе</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18639"/>
		<updated>2016-11-20T19:25:44Z</updated>

		<summary type="html">&lt;p&gt;LanaLana: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор студенческой работы: [[Участник:LanaLana|Светлана Илларионова]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
[[file: Search-communities.jpg|thumb|right|200px|Рисунок 1. Пример разбиения на сообщества]]&lt;br /&gt;
== Общее описание алгоритма==&lt;br /&gt;
Рассматривается задача поиска сообществ в неориенетированном графе с весами, значениями которых являются действительными неотрицательными числами. Приведем примеры, где в реальной жизни могут втсречаться такие структуры: задачи, возникающие в социальной медиа структуре (то есть это многочисленные социальные сети), задачи, связанные с медициной и биоинформатикой, бизнес-задачи. Главная идея, которую преследуют, решая вышеперечисленные проблемы &amp;amp;mdash; это выделение из общей совокупности объектов, групп, объекты внутри которых сильно взаимосвязаны. В качестве подхода к решению будем рассматривать алгоритм Label Propagation, применяя который получим, что вершины одного сообщества будут сильно связаны, а вершины из разных сообществ будут слабо связаны.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Дан граф &amp;lt;math&amp;gt; G = (V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V &amp;lt;/math&amp;gt; &amp;amp;mdash; множество вершин, &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; &amp;amp;mdash; множество ребер, &amp;lt;math&amp;gt; w (u, v) &amp;lt;/math&amp;gt; &amp;amp;mdash; вес каждого ребра &amp;lt;math&amp;gt; e(u, v) \in E, u, v \in V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Цель задачи &amp;amp;mdash; найти такое разбиение графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; на множество &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; непересекающихся сообществ вершин &amp;lt;math&amp;gt;c_i \subseteq V&amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; \cup c_i = V, \forall c_i \in C &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; c_i \cap c_j = \varnothing, \forall c_i, c_j \in C, i \neq j, &amp;lt;/math&amp;gt; чтобы максимизировать функционал модулярности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q = \sum_{c \in C} \left(\frac{\sum_{in}^{c}}{m} - \left[\frac{\sum{out}^{c}}{m} \right]^2\right)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt; \sum_{in}^{c} = \sum_{u, v \in c, e(u, v) \in E} w(u, v), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{out}^{c} = \sum_{in}^{c} + \sum_{u \in c, v \notin c, e(u, v) \in E} w(u, v)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; m = \sum_{e(u, v) \in E} w(u, v).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{in}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех внутренних рёбер сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{out}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех рёбер, исходящих из вершин сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; &amp;amp;mdash; нормализующий коэффициент, сумма весов рёбер графа.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро &amp;amp;mdash; та часть алгоритма, на которую приходится основное время работы алгоритма. В данном случае к вычислительному ядру не относится только часть инициализации. Вычислительное ядро включает в себя цикл, в котором необходимое число раз осуществляется прохождение по всем вершинам графа и отнесения их к соответствующим компонентам.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма==&lt;br /&gt;
???&lt;br /&gt;
== Схема реализации последовательного алгоритма== &lt;br /&gt;
В начальный момент времени каждой вершине приписана уникальная метка сообщества. Обновление меток вершин осуществляется по следующему принципу: у каждой вершины есть определенное число смежных вершин, которым приписаны метки каких-то сообществ, также у ребер между вершинами определены свои веса. На очередном шаге определим метку вершины &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. У соседей этой вершины метки сообществ, к которым они принадлежат, могут быть различными. Рассмотрим каждый тип меток. Для вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го типа считаем сумму весов ребер, которые соединяют эти вершины с изучаемой вершиной &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. Приписываем нашей вершине ту метку, для которой эта сумма оказалась максимальной. Итерации происходят до тех пор, пока меняются метки вершин. В стандартном алгоритме принято рассматривать вершины в случайном порядке, это позволяет улучшить метрику. Можно отказаться от переупорядочивания вершин для увеличения быстродействия вычислений. Также в параллельной версии программы потоки в рамках одного узла могут конкурировать, производить вычисления неравномерно, засчёт чего достигается эффект случайности в обработке вершин. &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма==&lt;br /&gt;
Сложность алгоритма: &amp;lt;math&amp;gt;O(n + m)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n, m&amp;lt;/math&amp;gt; &amp;amp;mdash; число вершин и ребер.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф==&lt;br /&gt;
[[File:Community detection information graph.svg|thumb|right|100px|Рисунок 2. Информационный граф]]&lt;br /&gt;
Данные на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; итерации зависят от данных на &amp;lt;math&amp;gt;i- 1&amp;lt;/math&amp;gt; итерации. На рисунке 2 изображены вершины графа и влияние на их принадлежность той или иной компоненте на последующей итерации знаний о распределении вершин по компонентам на текущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Разбиваем множество вершин на заданное число узлов. Каждый узел пересчитывает метки для своего набора вершин. Массивы меток для всех вершин синхронизируются с помощью операции MPI_Allgather.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность: &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;amp;mdash; число вершин.&lt;br /&gt;
Это убословлено тем фактом, что &amp;lt;math&amp;gt;O(n + m) = O(n) + O(m)&amp;lt;/math&amp;gt;, так как есть часть алгоритма, которая обрабатывает ребра графа, и мы её можем распараллелить.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму подаётся граф, который хранится как разреженная матрица смежности в формате CSR. &lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
&lt;br /&gt;
Выходными данными алгоритма является множество меток вершин в зависимости от их принадлежности компонентам.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма==&lt;br /&gt;
К достоинствам алгоритма Label Propagation можно отнести следующие его аспекты:&lt;br /&gt;
* время работы&lt;br /&gt;
* количество итераций слабо зависит от размера графа&lt;br /&gt;
* прост в понимании&lt;br /&gt;
Недостатками алгоритма являются:&lt;br /&gt;
* недетерминированность, то есть на одном и том же наборе входных данных при новом запуске результат может получиться отличным от предыдущего&lt;br /&gt;
* при некоторых входных данных может давать плохие решения&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. Без OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 29.7823 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 15.4772 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 8.2046 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 5.09298 s.&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 1&lt;br /&gt;
| 2.63555 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. С OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 9.21499 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 4.37143 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 3.41528 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4&lt;br /&gt;
| 3.87224 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. Без OpenMP&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 68.7771 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 36.1929 s&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 21.6286 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 23.8237 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. C OpenMP&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 21.5797 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 11.7228 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 11.5657 s. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, начиная с определенного момента, когда время синхронизации меток для вершин становится соразмерным с временем вычисления меток. Чем менье степень вершин, тем раньше алгоритм перестает масштабироваться.&lt;br /&gt;
&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
Пример одноузловой реализации данного алгоритма описан в статье [https://arxiv.org/pdf/1304.4453.pdf Engineering Parallel Algorithms for Community Detection in Massive Networks]&lt;br /&gt;
&lt;br /&gt;
=Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. &amp;quot;Lancichinetti-Fortunato-Radicchi Benchmark.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2015. Web. 13 November 2016 https://en.wikipedia.org/wiki/Lancichinetti-Fortunato-Radicchi_Benchmark&lt;br /&gt;
&lt;br /&gt;
2. &amp;quot;Help:Wiki markup.&amp;quot; Wikipedia, the free encyclopedia. 12 November 2016‎. Web. 13 November 2016 https://en.wikipedia.org/wiki/Help:Wiki_markup&lt;br /&gt;
&lt;br /&gt;
3. &amp;quot;Label Propagation Algorithm.&amp;quot; 9 November 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Label_Propagation_Algorithm&lt;br /&gt;
&lt;br /&gt;
4.  Спецкурс &amp;quot;Параллельная обработка больших графов&amp;quot; Лекция 4. к.т.н. Александр Сергеевич Семенов. 11 November 2016. Web. 13 November 2016. http://dislab.org/PLGP/PLGP_lecture4.pdf&lt;br /&gt;
&lt;br /&gt;
5. &amp;quot;Sparse matrix.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Sparse_matrix&lt;br /&gt;
&lt;br /&gt;
6. А.С.Антонов &amp;quot;Параллельное программирование с использованием технологии MPI&amp;quot;.-М.: Изд-во МГУ, 2004.-71 с.&lt;br /&gt;
&lt;br /&gt;
7. &amp;quot;OpenMP 4.5 Specifications&amp;quot; Nov 2015. Web. http://www.openmp.org/wp-content/uploads/openmp-4.5.pdf&lt;/div&gt;</summary>
		<author><name>LanaLana</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18638</id>
		<title>Алгоритм распространения констант для задачи поиска сообществ в социальном графе</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18638"/>
		<updated>2016-11-20T19:21:02Z</updated>

		<summary type="html">&lt;p&gt;LanaLana: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор студенческой работы: [[Участник:LanaLana|Светлана Илларионова]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
[[file: Search-communities.jpg|thumb|right|200px|Рисунок 1. Пример разбиения на сообщества]]&lt;br /&gt;
== Общее описание алгоритма==&lt;br /&gt;
Рассматривается задача поиска сообществ в неориенетированном графе с весами, значениями которых являются действительными неотрицательными числами. Приведем примеры, где в реальной жизни могут втсречаться такие структуры: задачи, возникающие в социальной медиа структуре (то есть это многочисленные социальные сети), задачи, связанные с медициной и биоинформатикой, бизнес-задачи. Главная идея, которую преследуют, решая вышеперечисленные проблемы &amp;amp;mdash; это выделение из общей совокупности объектов, групп, объекты внутри которых сильно взаимосвязаны. В качестве подхода к решению будем рассматривать алгоритм Label Propagation, применяя который получим, что вершины одного сообщества будут сильно связаны, а вершины из разных сообществ будут слабо связаны.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Дан граф &amp;lt;math&amp;gt; G = (V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V &amp;lt;/math&amp;gt; &amp;amp;mdash; множество вершин, &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; &amp;amp;mdash; множество ребер, &amp;lt;math&amp;gt; w (u, v) &amp;lt;/math&amp;gt; &amp;amp;mdash; вес каждого ребра &amp;lt;math&amp;gt; e(u, v) \in E, u, v \in V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Цель задачи &amp;amp;mdash; найти такое разбиение графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; на множество &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; непересекающихся сообществ вершин &amp;lt;math&amp;gt;c_i \subseteq V&amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; \cup c_i = V, \forall c_i \in C &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; c_i \cap c_j = \varnothing, \forall c_i, c_j \in C, i \neq j, &amp;lt;/math&amp;gt; чтобы максимизировать функционал модулярности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q = \sum_{c \in C} \left(\frac{\sum_{in}^{c}}{m} - \left[\frac{\sum{out}^{c}}{m} \right]^2\right)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt; \sum_{in}^{c} = \sum_{u, v \in c, e(u, v) \in E} w(u, v), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{out}^{c} = \sum_{in}^{c} + \sum_{u \in c, v \notin c, e(u, v) \in E} w(u, v)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; m = \sum_{e(u, v) \in E} w(u, v).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{in}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех внутренних рёбер сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{out}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех рёбер, исходящих из вершин сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; &amp;amp;mdash; нормализующий коэффициент, сумма весов рёбер графа.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро &amp;amp;mdash; та часть алгоритма, на которую приходится основное время работы алгоритма. В данном случае к вычислительному ядру не относится только часть инициализации. Вычислительное ядро включает в себя цикл, в котором необходимое число раз осуществляется прохождение по всем вершинам графа и отнесения их к соответствующим компонентам.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма==&lt;br /&gt;
???&lt;br /&gt;
== Схема реализации последовательного алгоритма== &lt;br /&gt;
В начальный момент времени каждой вершине приписана уникальная метка сообщества. Обновление меток вершин осуществляется по следующему принципу: у каждой вершины есть определенное число смежных вершин, которым приписаны метки каких-то сообществ, также у ребер между вершинами определены свои веса. На очередном шаге определим метку вершины &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. У соседей этой вершины метки сообществ, к которым они принадлежат, могут быть различными. Рассмотрим каждый тип меток. Для вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го типа считаем сумму весов ребер, которые соединяют эти вершины с изучаемой вершиной &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. Приписываем нашей вершине ту метку, для которой эта сумма оказалась максимальной. Итерации происходят до тех пор, пока меняются метки вершин. В стандартном алгоритме принято рассматривать вершины в случайном порядке, это позволяет улучшить метрику. Можно отказаться от переупорядочивания вершин для увеличения быстродействия вычислений. Также в параллельной версии программы потоки в рамках одного узла могут конкурировать, производить вычисления неравномерно, засчёт чего достигается эффект случайности в обработке вершин. &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма==&lt;br /&gt;
Сложность алгоритма: &amp;lt;math&amp;gt;O(n + m)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n, m&amp;lt;/math&amp;gt; &amp;amp;mdash; число вершин и ребер.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф==&lt;br /&gt;
[[File:Community detection information graph.svg|thumb|right|100px|Рисунок 2. Информационный граф]]&lt;br /&gt;
Данные на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; итерации зависят от данных на &amp;lt;math&amp;gt;i- 1&amp;lt;/math&amp;gt; итерации. На рисунке 2 изображены вершины графа и влияние на их принадлежность той или иной компоненте на последующей итерации знаний о распределении вершин по компонентам на текущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Разбиваем множество вершин на заданное число узлов. Каждый узел пересчитывает метки для своего набора вершин. Массивы меток для всех вершин синхронизируются с помощью операции MPI_Allgather.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность: &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;amp;mdash; число вершин.&lt;br /&gt;
Это убословлено тем фактом, что &amp;lt;math&amp;gt;O(n + m) = O(n) + O(m)&amp;lt;/math&amp;gt;, так как есть часть алгоритма, которая обрабатывает ребра графа, и мы её можем распараллелить.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму подаётся граф, который хранится как разреженная матрица смежности в формате CSR. &lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
&lt;br /&gt;
Выходными данными алгоритма является множество меток вершин в зависимости от их принадлежности компонентам.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма==&lt;br /&gt;
К достоинствам алгоритма Label Propagation можно отнести следующие его аспекты:&lt;br /&gt;
* время работы&lt;br /&gt;
* количество итераций слабо зависит от размера графа&lt;br /&gt;
* прост в понимании&lt;br /&gt;
Недостатками алгоритма являются:&lt;br /&gt;
* недетерминированность, то есть на одном и том же наборе входных данных при новом запуске результат может получиться отличным от предыдущего&lt;br /&gt;
* при некоторых входных данных может давать плохие решения&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. Без OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 29.7823 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 15.4772 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 8.2046 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 5.09298 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. С OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 9.21499 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 4.37143 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 3.41528 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4&lt;br /&gt;
| 3.87224 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. Без OpenMP&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 68.7771 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 36.1929 s&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 21.6286 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 23.8237 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. C OpenMP&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 21.5797 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 11.7228 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 11.5657 s. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, начиная с определенного момента, когда время синхронизации меток для вершин становится соразмерным с временем вычисления меток. Чем менье степень вершин, тем раньше алгоритм перестает масштабироваться.&lt;br /&gt;
&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
Пример одноузловой реализации данного алгоритма описан в статье [https://arxiv.org/pdf/1304.4453.pdf Engineering Parallel Algorithms for Community Detection in Massive Networks]&lt;br /&gt;
&lt;br /&gt;
=Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. &amp;quot;Lancichinetti-Fortunato-Radicchi Benchmark.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2015. Web. 13 November 2016 https://en.wikipedia.org/wiki/Lancichinetti-Fortunato-Radicchi_Benchmark&lt;br /&gt;
&lt;br /&gt;
2. &amp;quot;Help:Wiki markup.&amp;quot; Wikipedia, the free encyclopedia. 12 November 2016‎. Web. 13 November 2016 https://en.wikipedia.org/wiki/Help:Wiki_markup&lt;br /&gt;
&lt;br /&gt;
3. &amp;quot;Label Propagation Algorithm.&amp;quot; 9 November 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Label_Propagation_Algorithm&lt;br /&gt;
&lt;br /&gt;
4.  Спецкурс &amp;quot;Параллельная обработка больших графов&amp;quot; Лекция 4. к.т.н. Александр Сергеевич Семенов. 11 November 2016. Web. 13 November 2016. http://dislab.org/PLGP/PLGP_lecture4.pdf&lt;br /&gt;
&lt;br /&gt;
5. &amp;quot;Sparse matrix.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Sparse_matrix&lt;br /&gt;
&lt;br /&gt;
6. А.С.Антонов &amp;quot;Параллельное программирование с использованием технологии MPI&amp;quot;.-М.: Изд-во МГУ, 2004.-71 с.&lt;br /&gt;
&lt;br /&gt;
7. &amp;quot;OpenMP 4.5 Specifications&amp;quot; Nov 2015. Web. http://www.openmp.org/wp-content/uploads/openmp-4.5.pdf&lt;/div&gt;</summary>
		<author><name>LanaLana</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18637</id>
		<title>Алгоритм распространения констант для задачи поиска сообществ в социальном графе</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18637"/>
		<updated>2016-11-20T19:19:58Z</updated>

		<summary type="html">&lt;p&gt;LanaLana: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор студенческой работы: [[Участник:LanaLana|Светлана Илларионова]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
[[file: Search-communities.jpg|thumb|right|200px|Рисунок 1. Пример разбиения на сообщества]]&lt;br /&gt;
== Общее описание алгоритма==&lt;br /&gt;
Рассматривается задача поиска сообществ в неориенетированном графе с весами, значениями которых являются действительными неотрицательными числами. Приведем примеры, где в реальной жизни могут втсречаться такие структуры: задачи, возникающие в социальной медиа структуре (то есть это многочисленные социальные сети), задачи, связанные с медициной и биоинформатикой, бизнес-задачи. Главная идея, которую преследуют, решая вышеперечисленные проблемы &amp;amp;mdash; это выделение из общей совокупности объектов, групп, объекты внутри которых сильно взаимосвязаны. В качестве подхода к решению будем рассматривать алгоритм Label Propagation, применяя который получим, что вершины одного сообщества будут сильно связаны, а вершины из разных сообществ будут слабо связаны.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Дан граф &amp;lt;math&amp;gt; G = (V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V &amp;lt;/math&amp;gt; &amp;amp;mdash; множество вершин, &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; &amp;amp;mdash; множество ребер, &amp;lt;math&amp;gt; w (u, v) &amp;lt;/math&amp;gt; &amp;amp;mdash; вес каждого ребра &amp;lt;math&amp;gt; e(u, v) \in E, u, v \in V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Цель задачи &amp;amp;mdash; найти такое разбиение графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; на множество &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; непересекающихся сообществ вершин &amp;lt;math&amp;gt;c_i \subseteq V&amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; \cup c_i = V, \forall c_i \in C &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; c_i \cap c_j = \varnothing, \forall c_i, c_j \in C, i \neq j, &amp;lt;/math&amp;gt; чтобы максимизировать функционал модулярности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q = \sum_{c \in C} \left(\frac{\sum_{in}^{c}}{m} - \left[\frac{\sum{out}^{c}}{m} \right]^2\right)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt; \sum_{in}^{c} = \sum_{u, v \in c, e(u, v) \in E} w(u, v), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{out}^{c} = \sum_{in}^{c} + \sum_{u \in c, v \notin c, e(u, v) \in E} w(u, v)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; m = \sum_{e(u, v) \in E} w(u, v).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{in}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех внутренних рёбер сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{out}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех рёбер, исходящих из вершин сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; &amp;amp;mdash; нормализующий коэффициент, сумма весов рёбер графа.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро &amp;amp;mdash; та часть алгоритма, на которую приходится основное время работы алгоритма. В данном случае к вычислительному ядру не относится только часть инициализации. Вычислительное ядро включает в себя цикл, в котором необходимое число раз осуществляется прохождение по всем вершинам графа и отнесения их к соответствующим компонентам.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма==&lt;br /&gt;
???&lt;br /&gt;
== Схема реализации последовательного алгоритма== &lt;br /&gt;
В начальный момент времени каждой вершине приписана уникальная метка сообщества. Обновление меток вершин осуществляется по следующему принципу: у каждой вершины есть определенное число смежных вершин, которым приписаны метки каких-то сообществ, также у ребер между вершинами определены свои веса. На очередном шаге определим метку вершины &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. У соседей этой вершины метки сообществ, к которым они принадлежат, могут быть различными. Рассмотрим каждый тип меток. Для вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го типа считаем сумму весов ребер, которые соединяют эти вершины с изучаемой вершиной &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. Приписываем нашей вершине ту метку, для которой эта сумма оказалась максимальной. Итерации происходят до тех пор, пока меняются метки вершин. В стандартном алгоритме принято рассматривать вершины в случайном порядке, это позволяет улучшить метрику. Можно отказаться от переупорядочивания вершин для увеличения быстродействия вычислений. Также в параллельной версии программы потоки в рамках одного узла могут конкурировать, производить вычисления неравномерно, засчёт чего достигается эффект случайности в обработке вершин. &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма==&lt;br /&gt;
Сложность алгоритма: &amp;lt;math&amp;gt;O(n + m)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n, m&amp;lt;/math&amp;gt; &amp;amp;mdash; число вершин и ребер.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф==&lt;br /&gt;
[[File:Community detection information graph.svg|thumb|right|100px|Рисунок 2. Информационный граф]]&lt;br /&gt;
Данные на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; итерации зависят от данных на &amp;lt;math&amp;gt;i- 1&amp;lt;/math&amp;gt; итерации. На рисунке 2 изображены вершины графа и влияние на их принадлежность той или иной компоненте на последующей итерации знаний о распределении вершин по компонентам на текущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Разбиваем множество вершин на заданное число узлов. Каждый узел пересчитывает метки для своего набора вершин. Массивы меток для всех вершин синхронизируются с помощью операции MPI_Allgather.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность: &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;amp;mdash; число вершин.&lt;br /&gt;
Это убословлено тем фактом, что &amp;lt;math&amp;gt;O(n + m) = O(n) + O(m)&amp;lt;/math&amp;gt;, так как есть часть алгоритма, которая обрабатывает ребра графа, и мы её можем распараллелить.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму подаётся граф, который хранится как разреженная матрица смежности в формате CSR. &lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
Выходными данными алгоритма является множество меток вершин в зависимости от их принадлежности компонентам.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма==&lt;br /&gt;
К достоинствам алгоритма Label Propagation можно отнести следующие его аспекты:&lt;br /&gt;
* время работы&lt;br /&gt;
* количество итераций слабо зависит от размера графа&lt;br /&gt;
* прост в понимании&lt;br /&gt;
Недостатками алгоритма являются:&lt;br /&gt;
* недетерминированность, то есть на одном и том же наборе входных данных при новом запуске результат может получиться отличным от предыдущего&lt;br /&gt;
* при некоторых входных данных может давать плохие решения&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. Без OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 29.7823 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 15.4772 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 8.2046 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 5.09298 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. С OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 9.21499 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 4.37143 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 3.41528 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4&lt;br /&gt;
| 3.87224 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. Без OpenMP&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 68.7771 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 36.1929 s&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 21.6286 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 23.8237 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. C OpenMP&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 21.5797 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 11.7228 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 11.5657 s. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, начиная с определенного момента, когда время синхронизации меток для вершин становится соразмерным с временем вычисления меток. Чем менье степень вершин, тем раньше алгоритм перестает масштабироваться.&lt;br /&gt;
&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
Пример одноузловой реализации данного алгоритма описан в статье [https://arxiv.org/pdf/1304.4453.pdf Engineering Parallel Algorithms for Community Detection in Massive Networks]&lt;br /&gt;
&lt;br /&gt;
=Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. &amp;quot;Lancichinetti-Fortunato-Radicchi Benchmark.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2015. Web. 13 November 2016 https://en.wikipedia.org/wiki/Lancichinetti-Fortunato-Radicchi_Benchmark&lt;br /&gt;
&lt;br /&gt;
2. &amp;quot;Help:Wiki markup.&amp;quot; Wikipedia, the free encyclopedia. 12 November 2016‎. Web. 13 November 2016 https://en.wikipedia.org/wiki/Help:Wiki_markup&lt;br /&gt;
&lt;br /&gt;
3. &amp;quot;Label Propagation Algorithm.&amp;quot; 9 November 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Label_Propagation_Algorithm&lt;br /&gt;
&lt;br /&gt;
4.  Спецкурс &amp;quot;Параллельная обработка больших графов&amp;quot; Лекция 4. к.т.н. Александр Сергеевич Семенов. 11 November 2016. Web. 13 November 2016. http://dislab.org/PLGP/PLGP_lecture4.pdf&lt;br /&gt;
&lt;br /&gt;
5. &amp;quot;Sparse matrix.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Sparse_matrix&lt;br /&gt;
&lt;br /&gt;
6. А.С.Антонов &amp;quot;Параллельное программирование с использованием технологии MPI&amp;quot;.-М.: Изд-во МГУ, 2004.-71 с.&lt;br /&gt;
&lt;br /&gt;
7. &amp;quot;OpenMP 4.5 Specifications&amp;quot; Nov 2015. Web. http://www.openmp.org/wp-content/uploads/openmp-4.5.pdf&lt;/div&gt;</summary>
		<author><name>LanaLana</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18636</id>
		<title>Алгоритм распространения констант для задачи поиска сообществ в социальном графе</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18636"/>
		<updated>2016-11-20T19:08:57Z</updated>

		<summary type="html">&lt;p&gt;LanaLana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор студенческой работы: [[Участник:LanaLana|Светлана Илларионова]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
[[file: Search-communities.jpg|thumb|right|200px|Рисунок 1. Пример разбиения на сообщества]]&lt;br /&gt;
== Общее описание алгоритма==&lt;br /&gt;
Рассматривается задача поиска сообществ в неориенетированном графе с весами, значениями которых являются действительными неотрицательными числами. Приведем примеры, где в реальной жизни могут втсречаться такие структуры: задачи, возникающие в социальной медиа структуре (то есть это многочисленные социальные сети), задачи, связанные с медициной и биоинформатикой, бизнес-задачи. Главная идея, которую преследуют, решая вышеперечисленные проблемы &amp;amp;mdash; это выделение из общей совокупности объектов, групп, объекты внутри которых сильно взаимосвязаны. В качестве подхода к решению будем рассматривать алгоритм Label Propagation, применяя который получим, что вершины одного сообщества будут сильно связаны, а вершины из разных сообществ будут слабо связаны.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Дан граф &amp;lt;math&amp;gt; G = (V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V &amp;lt;/math&amp;gt; &amp;amp;mdash; множество вершин, &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; &amp;amp;mdash; множество ребер, &amp;lt;math&amp;gt; w (u, v) &amp;lt;/math&amp;gt; &amp;amp;mdash; вес каждого ребра &amp;lt;math&amp;gt; e(u, v) \in E, u, v \in V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Цель задачи &amp;amp;mdash; найти такое разбиение графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; на множество &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; непересекающихся сообществ вершин &amp;lt;math&amp;gt;c_i \subseteq V&amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; \cup c_i = V, \forall c_i \in C &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; c_i \cap c_j = \varnothing, \forall c_i, c_j \in C, i \neq j, &amp;lt;/math&amp;gt; чтобы максимизировать функционал модулярности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q = \sum_{c \in C} \left(\frac{\sum_{in}^{c}}{m} - \left[\frac{\sum{out}^{c}}{m} \right]^2\right)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt; \sum_{in}^{c} = \sum_{u, v \in c, e(u, v) \in E} w(u, v), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{out}^{c} = \sum_{in}^{c} + \sum_{u \in c, v \notin c, e(u, v) \in E} w(u, v)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; m = \sum_{e(u, v) \in E} w(u, v).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{in}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех внутренних рёбер сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{out}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех рёбер, исходящих из вершин сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; &amp;amp;mdash; нормализующий коэффициент, сумма весов рёбер графа.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро &amp;amp;mdash; та часть алгоритма, на которую приходится основное время работы алгоритма. В данном случае к вычислительному ядру не относится только часть инициализации. Вычислительное ядро включает в себя цикл, в котором необходимое число раз осуществляется прохождение по всем вершинам графа и отнесения их к соответствующим компонентам.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма==&lt;br /&gt;
???&lt;br /&gt;
== Схема реализации последовательного алгоритма== &lt;br /&gt;
В начальный момент времени каждой вершине приписана уникальная метка сообщества. Обновление меток вершин осуществляется по следующему принципу: у каждой вершины есть определенное число смежных вершин, которым приписаны метки каких-то сообществ, также у ребер между вершинами определены свои веса. На очередном шаге определим метку вершины &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. У соседей этой вершины метки сообществ, к которым они принадлежат, могут быть различными. Рассмотрим каждый тип меток. Для вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го типа считаем сумму весов ребер, которые соединяют эти вершины с изучаемой вершиной &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. Приписываем нашей вершине ту метку, для которой эта сумма оказалась максимальной. Итерации происходят до тех пор, пока меняются метки вершин. В стандартном алгоритме принято рассматривать вершины в случайном порядке, это позволяет улучшить метрику. Можно отказаться от переупорядочивания вершин для увеличения быстродействия вычислений. Также в параллельной версии программы потоки в рамках одного узла могут конкурировать, производить вычисления неравномерно, засчёт чего достигается эффект случайности в обработке вершин. &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма==&lt;br /&gt;
Сложность алгоритма: &amp;lt;math&amp;gt;O(n + m)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n, m&amp;lt;/math&amp;gt; &amp;amp;mdash; число вершин и ребер.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф==&lt;br /&gt;
[[File:Community detection information graph.svg|thumb|right|100px|Рисунок 2. Информационный граф]]&lt;br /&gt;
Данные на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; итерации зависят от данных на &amp;lt;math&amp;gt;i- 1&amp;lt;/math&amp;gt; итерации. На рисунке 2 изображены вершины графа и влияние на их принадлежность той или иной компоненте на последующей итерации знаний о распределении вершин по компонентам на текущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Разбиваем множество вершин на заданное число узлов. Каждый узел пересчитывает метки для своего набора вершин. Массивы меток для всех вершин синхронизируются с помощью операции MPI_Allgather.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность: &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;amp;mdash; число вершин.&lt;br /&gt;
Это убословлено тем фактом, что &amp;lt;math&amp;gt;O(n + m) = O(n) + O(m)&amp;lt;/math&amp;gt;, так как есть часть алгоритма, которая обрабатывает ребра графа, и мы её можем распараллелить.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму подаётся граф, который хранится как разреженная матрица смежности в формате CSR. &lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
Выходными данными алгоритма является множество меток вершин в зависимости от их принадлежности компонентам.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма==&lt;br /&gt;
К достоинствам алгоритма Label Propagation можно отнести следующие его аспекты:&lt;br /&gt;
* время работы&lt;br /&gt;
* количество итераций слабо зависит от размера графа&lt;br /&gt;
* прост в понимании&lt;br /&gt;
Недостатками алгоритма являются:&lt;br /&gt;
* недетерминированность, то есть на одном и том же наборе входных данных при новом запуске результат может получиться отличным от предыдущего&lt;br /&gt;
* при некоторых входных данных может давать плохие решения&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. Без OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 29.7823 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 15.4772 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 8.2046 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 5.09298 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. С OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 9.21499 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 4.37143 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 3.41528 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4&lt;br /&gt;
| 3.87224 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. Без OpenMP&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 68.7771 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 36.1929 s&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 21.6286 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 23.8237 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. C OpenMP&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 21.5797 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 11.7228 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 11.5657 s. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, начиная с определенного момента, когда время синхронизации меток для вершин становится соразмерным с временем вычисления меток. Чем менье степень вершин, тем раньше алгоритм перестает масштабироваться.&lt;br /&gt;
&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. &amp;quot;Lancichinetti-Fortunato-Radicchi Benchmark.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2015. Web. 13 November 2016 https://en.wikipedia.org/wiki/Lancichinetti-Fortunato-Radicchi_Benchmark&lt;br /&gt;
&lt;br /&gt;
2. &amp;quot;Help:Wiki markup.&amp;quot; Wikipedia, the free encyclopedia. 12 November 2016‎. Web. 13 November 2016 https://en.wikipedia.org/wiki/Help:Wiki_markup&lt;br /&gt;
&lt;br /&gt;
3. &amp;quot;Label Propagation Algorithm.&amp;quot; 9 November 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Label_Propagation_Algorithm&lt;br /&gt;
&lt;br /&gt;
4.  Спецкурс &amp;quot;Параллельная обработка больших графов&amp;quot; Лекция 4. к.т.н. Александр Сергеевич Семенов. 11 November 2016. Web. 13 November 2016. http://dislab.org/PLGP/PLGP_lecture4.pdf&lt;br /&gt;
&lt;br /&gt;
5. &amp;quot;Sparse matrix.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Sparse_matrix&lt;br /&gt;
&lt;br /&gt;
6. А.С.Антонов &amp;quot;Параллельное программирование с использованием технологии MPI&amp;quot;.-М.: Изд-во МГУ, 2004.-71 с.&lt;br /&gt;
&lt;br /&gt;
7. &amp;quot;OpenMP 4.5 Specifications&amp;quot; Nov 2015. Web. http://www.openmp.org/wp-content/uploads/openmp-4.5.pdf&lt;/div&gt;</summary>
		<author><name>LanaLana</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18635</id>
		<title>Алгоритм распространения констант для задачи поиска сообществ в социальном графе</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18635"/>
		<updated>2016-11-20T19:06:05Z</updated>

		<summary type="html">&lt;p&gt;LanaLana: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор студенческой работы: [[Участник:LanaLana|Светлана Илларионова]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
[[file: Search-communities.jpg|thumb|right|200px|Рисунок 1. Пример разбиения на сообщества]]&lt;br /&gt;
== Общее описание алгоритма==&lt;br /&gt;
Рассматривается задача поиска сообществ в неориенетированном графе с весами, значениями которых являются действительными неотрицательными числами. Приведем примеры, где в реальной жизни могут втсречаться такие структуры: задачи, возникающие в социальной медиа структуре (то есть это многочисленные социальные сети), задачи, связанные с медициной и биоинформатикой, бизнес-задачи. Главная идея, которую преследуют, решая вышеперечисленные проблемы &amp;amp;mdash; это выделение из общей совокупности объектов, групп, объекты внутри которых сильно взаимосвязаны. В качестве подхода к решению будем рассматривать алгоритм Label Propagation, применяя который получим, что вершины одного сообщества будут сильно связаны, а вершины из разных сообществ будут слабо связаны.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Дан граф &amp;lt;math&amp;gt; G = (V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V &amp;lt;/math&amp;gt; &amp;amp;mdash; множество вершин, &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; &amp;amp;mdash; множество ребер, &amp;lt;math&amp;gt; w (u, v) &amp;lt;/math&amp;gt; &amp;amp;mdash; вес каждого ребра &amp;lt;math&amp;gt; e(u, v) \in E, u, v \in V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Цель задачи &amp;amp;mdash; найти такое разбиение графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; на множество &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; непересекающихся сообществ вершин &amp;lt;math&amp;gt;c_i \subseteq V&amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; \cup c_i = V, \forall c_i \in C &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; c_i \cap c_j = \varnothing, \forall c_i, c_j \in C, i \neq j, &amp;lt;/math&amp;gt; чтобы максимизировать функционал модулярности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q = \sum_{c \in C} \left(\frac{\sum_{in}^{c}}{m} - \left[\frac{\sum{out}^{c}}{m} \right]^2\right)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt; \sum_{in}^{c} = \sum_{u, v \in c, e(u, v) \in E} w(u, v), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{out}^{c} = \sum_{in}^{c} + \sum_{u \in c, v \notin c, e(u, v) \in E} w(u, v)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; m = \sum_{e(u, v) \in E} w(u, v).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{in}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех внутренних рёбер сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{out}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех рёбер, исходящих из вершин сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; &amp;amp;mdash; нормализующий коэффициент, сумма весов рёбер графа.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро &amp;amp;mdash; та часть алгоритма, на которую приходится основное время работы алгоритма. В данном случае к вычислительному ядру не относится только часть инициализации. Вычислительное ядро включает в себя цикл, в котором необходимое число раз осуществляется прохождение по всем вершинам графа и отнесения их к соответствующим компонентам.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма==&lt;br /&gt;
???&lt;br /&gt;
== Схема реализации последовательного алгоритма== &lt;br /&gt;
В начальный момент времени каждой вершине приписана уникальная метка сообщества. Обновление меток вершин осуществляется по следующему принципу: у каждой вершины есть определенное число смежных вершин, которым приписаны метки каких-то сообществ, также у ребер между вершинами определены свои веса. На очередном шаге определим метку вершины &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. У соседей этой вершины метки сообществ, к которым они принадлежат, могут быть различными. Рассмотрим каждый тип меток. Для вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го типа считаем сумму весов ребер, которые соединяют эти вершины с изучаемой вершиной &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. Приписываем нашей вершине ту метку, для которой эта сумма оказалась максимальной. Итерации происходят до тех пор, пока меняются метки вершин. В стандартном алгоритме принято рассматривать вершины в случайном порядке, это позволяет улучшить метрику. Можно отказаться от переупорядочивания вершин для увеличения быстродействия вычислений. Также в параллельной версии программы потоки в рамках одного узла могут конкурировать, производить вычисления неравномерно, засчёт чего достигается эффект случайности в обработке вершин. &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма==&lt;br /&gt;
Сложность алгоритма: &amp;lt;math&amp;gt;O(n + m)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n, m&amp;lt;/math&amp;gt; &amp;amp;mdash; число вершин и ребер.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф==&lt;br /&gt;
[[File:Community detection information graph.svg|thumb|right|100px|Рисунок 2. Информационный граф]]&lt;br /&gt;
Данные на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; итерации зависят от данных на &amp;lt;math&amp;gt;i- 1&amp;lt;/math&amp;gt; итерации. На рисунке 2 изображены вершины графа и влияние на их принадлежность той или иной компоненте на последующей итерации знаний о распределении вершин по компонентам на текущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Разбиваем множество вершин на заданное число узлов. Каждый узел пересчитывает метки для своего набора вершин. Массивы меток для всех вершин синхронизируются с помощью операции MPI_Allgather.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность: &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;amp;mdash; число вершин.&lt;br /&gt;
Это убословлено тем фактом, что &amp;lt;math&amp;gt;O(n + m) = O(n) + O(m)&amp;lt;/math&amp;gt;, так как есть часть алгоритма, которая обрабатывает ребра графа, и мы её можем распараллелить.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму подаётся граф, который хранится как разреженная матрица смежности в формате CSR. &lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
Выходными данными алгоритма является множество меток вершин в зависимости от их принадлежности компонентам.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма==&lt;br /&gt;
К достоинствам алгоритма Label Propagation можно отнести следующие его аспекты:&lt;br /&gt;
* время работы&lt;br /&gt;
* количество итераций слабо зависит от размера графа&lt;br /&gt;
* прост в понимании&lt;br /&gt;
Недостатками алгоритма являются:&lt;br /&gt;
* недетерминированность, то есть на одном и том же наборе входных данных при новом запуске результат может получиться отличным от предыдущего&lt;br /&gt;
* при некоторых входных данных может давать плохие решения&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. Без OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 29.7823 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 15.4772 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 8.2046 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 5.09298 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. С OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 9.21499 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 4.37143 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 3.41528 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4&lt;br /&gt;
| 3.87224 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. Без OpenMP&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 68.7771 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 36.1929 s&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 21.6286 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 23.8237 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. C OpenMP&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 21.5797 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 11.7228 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 11.5657 s. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, начиная с определенного момента, когда время синхронизации меток для вершин становится соразмерным с временем вычисления меток. Чем менье степень вершин, тем раньше алгоритм перестает масштабироваться.&lt;br /&gt;
&lt;br /&gt;
=Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. &amp;quot;Lancichinetti-Fortunato-Radicchi Benchmark.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2015. Web. 13 November 2016 https://en.wikipedia.org/wiki/Lancichinetti-Fortunato-Radicchi_Benchmark&lt;br /&gt;
&lt;br /&gt;
2. &amp;quot;Help:Wiki markup.&amp;quot; Wikipedia, the free encyclopedia. 12 November 2016‎. Web. 13 November 2016 https://en.wikipedia.org/wiki/Help:Wiki_markup&lt;br /&gt;
&lt;br /&gt;
3. &amp;quot;Label Propagation Algorithm.&amp;quot; 9 November 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Label_Propagation_Algorithm&lt;br /&gt;
&lt;br /&gt;
4.  Спецкурс &amp;quot;Параллельная обработка больших графов&amp;quot; Лекция 4. к.т.н. Александр Сергеевич Семенов. 11 November 2016. Web. 13 November 2016. http://dislab.org/PLGP/PLGP_lecture4.pdf&lt;br /&gt;
&lt;br /&gt;
5. &amp;quot;Sparse matrix.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Sparse_matrix&lt;br /&gt;
&lt;br /&gt;
6. А.С.Антонов &amp;quot;Параллельное программирование с использованием технологии MPI&amp;quot;.-М.: Изд-во МГУ, 2004.-71 с.&lt;br /&gt;
&lt;br /&gt;
7. &amp;quot;OpenMP 4.5 Specifications&amp;quot; Nov 2015. Web. http://www.openmp.org/wp-content/uploads/openmp-4.5.pdf&lt;/div&gt;</summary>
		<author><name>LanaLana</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18634</id>
		<title>Алгоритм распространения констант для задачи поиска сообществ в социальном графе</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18634"/>
		<updated>2016-11-20T19:02:56Z</updated>

		<summary type="html">&lt;p&gt;LanaLana: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор студенческой работы: [[Участник:LanaLana|Светлана Илларионова]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
[[file: Search-communities.jpg|thumb|right|200px|Рисунок 1. Пример разбиения на сообщества]]&lt;br /&gt;
== Общее описание алгоритма==&lt;br /&gt;
Рассматривается задача поиска сообществ в неориенетированном графе с весами, значениями которых являются действительными неотрицательными числами. Приведем примеры, где в реальной жизни могут втсречаться такие структуры: задачи, возникающие в социальной медиа структуре (то есть это многочисленные социальные сети), задачи, связанные с медициной и биоинформатикой, бизнес-задачи. Главная идея, которую преследуют, решая вышеперечисленные проблемы &amp;amp;mdash; это выделение из общей совокупности объектов, групп, объекты внутри которых сильно взаимосвязаны. В качестве подхода к решению будем рассматривать алгоритм Label Propagation, применяя который получим, что вершины одного сообщества будут сильно связаны, а вершины из разных сообществ будут слабо связаны.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Дан граф &amp;lt;math&amp;gt; G = (V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V &amp;lt;/math&amp;gt; &amp;amp;mdash; множество вершин, &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; &amp;amp;mdash; множество ребер, &amp;lt;math&amp;gt; w (u, v) &amp;lt;/math&amp;gt; &amp;amp;mdash; вес каждого ребра &amp;lt;math&amp;gt; e(u, v) \in E, u, v \in V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Цель задачи &amp;amp;mdash; найти такое разбиение графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; на множество &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; непересекающихся сообществ вершин &amp;lt;math&amp;gt;c_i \subseteq V&amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; \cup c_i = V, \forall c_i \in C &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; c_i \cap c_j = \varnothing, \forall c_i, c_j \in C, i \neq j, &amp;lt;/math&amp;gt; чтобы максимизировать функционал модулярности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q = \sum_{c \in C} \left(\frac{\sum_{in}^{c}}{m} - \left[\frac{\sum{out}^{c}}{m} \right]^2\right)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt; \sum_{in}^{c} = \sum_{u, v \in c, e(u, v) \in E} w(u, v), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{out}^{c} = \sum_{in}^{c} + \sum_{u \in c, v \notin c, e(u, v) \in E} w(u, v)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; m = \sum_{e(u, v) \in E} w(u, v).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{in}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех внутренних рёбер сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{out}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех рёбер, исходящих из вершин сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; &amp;amp;mdash; нормализующий коэффициент, сумма весов рёбер графа.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро &amp;amp;mdash; та часть алгоритма, на которую приходится основное время работы алгоритма. В данном случае к вычислительному ядру не относится только часть инициализации. Вычислительное ядро включает в себя цикл, в котором необходимое число раз осуществляется прохождение по всем вершинам графа и отнесения их к соответствующим компонентам.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма==&lt;br /&gt;
???&lt;br /&gt;
== Схема реализации последовательного алгоритма== &lt;br /&gt;
В начальный момент времени каждой вершине приписана уникальная метка сообщества. Обновление меток вершин осуществляется по следующему принципу: у каждой вершины есть определенное число смежных вершин, которым приписаны метки каких-то сообществ, также у ребер между вершинами определены свои веса. На очередном шаге определим метку вершины &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. У соседей этой вершины метки сообществ, к которым они принадлежат, могут быть различными. Рассмотрим каждый тип меток. Для вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го типа считаем сумму весов ребер, которые соединяют эти вершины с изучаемой вершиной &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. Приписываем нашей вершине ту метку, для которой эта сумма оказалась максимальной. Итерации происходят до тех пор, пока меняются метки вершин. В стандартном алгоритме принято рассматривать вершины в случайном порядке, это позволяет улучшить метрику. Можно отказаться от переупорядочивания вершин для увеличения быстродействия вычислений. Также в параллельной версии программы потоки в рамках одного узла могут конкурировать, производить вычисления неравномерно, засчёт чего достигается эффект случайности в обработке вершин. &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма==&lt;br /&gt;
Сложность алгоритма: &amp;lt;math&amp;gt;O(n + m)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n, m&amp;lt;/math&amp;gt; &amp;amp;mdash; число вершин и ребер.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф==&lt;br /&gt;
[[File:Community detection information graph.svg|thumb|right|100px|Рисунок 2. Информационный граф]]&lt;br /&gt;
Данные на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; итерации зависят от данных на &amp;lt;math&amp;gt;i- 1&amp;lt;/math&amp;gt; итерации. На рисунке 2 изображены вершины графа и влияние на их принадлежность той или иной компоненте на последующей итерации знаний о распределении вершин по компонентам на текущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Разбиваем множество вершин на заданное число узлов. Каждый узел пересчитывает метки для своего набора вершин. Массивы меток для всех вершин синхронизируются с помощью операции MPI_Allgather.&lt;br /&gt;
&lt;br /&gt;
Параллельная сложность: &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;amp;mdash; число вершин.&lt;br /&gt;
Это убословлено тем фактом, что &amp;lt;math&amp;gt;O(n + m) = O(n) + O(m)&amp;lt;/math&amp;gt;, так как есть часть алгоритма, которая обрабатывает ребра графа, и мы её можем распараллелить.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму подаётся граф, который хранится как разреженная матрица смежности в формате CSR. &lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
== Свойства алгоритма==&lt;br /&gt;
К достоинствам алгоритма Label Propagation можно отнести следующие его аспекты:&lt;br /&gt;
* время работы&lt;br /&gt;
* количество итераций слабо зависит от размера графа&lt;br /&gt;
* прост в понимании&lt;br /&gt;
Недостатками алгоритма являются:&lt;br /&gt;
* недетерминированность, то есть на одном и том же наборе входных данных при новом запуске результат может получиться отличным от предыдущего&lt;br /&gt;
* при некоторых входных данных может давать плохие решения&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. Без OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 29.7823 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 15.4772 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 8.2046 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 5.09298 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. С OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 9.21499 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 4.37143 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 3.41528 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4&lt;br /&gt;
| 3.87224 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. Без OpenMP&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 68.7771 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 36.1929 s&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 21.6286 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 23.8237 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. C OpenMP&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 21.5797 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 11.7228 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 11.5657 s. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, начиная с определенного момента, когда время синхронизации меток для вершин становится соразмерным с временем вычисления меток. Чем менье степень вершин, тем раньше алгоритм перестает масштабироваться.&lt;br /&gt;
&lt;br /&gt;
=Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. &amp;quot;Lancichinetti-Fortunato-Radicchi Benchmark.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2015. Web. 13 November 2016 https://en.wikipedia.org/wiki/Lancichinetti-Fortunato-Radicchi_Benchmark&lt;br /&gt;
&lt;br /&gt;
2. &amp;quot;Help:Wiki markup.&amp;quot; Wikipedia, the free encyclopedia. 12 November 2016‎. Web. 13 November 2016 https://en.wikipedia.org/wiki/Help:Wiki_markup&lt;br /&gt;
&lt;br /&gt;
3. &amp;quot;Label Propagation Algorithm.&amp;quot; 9 November 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Label_Propagation_Algorithm&lt;br /&gt;
&lt;br /&gt;
4.  Спецкурс &amp;quot;Параллельная обработка больших графов&amp;quot; Лекция 4. к.т.н. Александр Сергеевич Семенов. 11 November 2016. Web. 13 November 2016. http://dislab.org/PLGP/PLGP_lecture4.pdf&lt;br /&gt;
&lt;br /&gt;
5. &amp;quot;Sparse matrix.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Sparse_matrix&lt;br /&gt;
&lt;br /&gt;
6. А.С.Антонов &amp;quot;Параллельное программирование с использованием технологии MPI&amp;quot;.-М.: Изд-во МГУ, 2004.-71 с.&lt;br /&gt;
&lt;br /&gt;
7. &amp;quot;OpenMP 4.5 Specifications&amp;quot; Nov 2015. Web. http://www.openmp.org/wp-content/uploads/openmp-4.5.pdf&lt;/div&gt;</summary>
		<author><name>LanaLana</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18633</id>
		<title>Алгоритм распространения констант для задачи поиска сообществ в социальном графе</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18633"/>
		<updated>2016-11-20T18:51:28Z</updated>

		<summary type="html">&lt;p&gt;LanaLana: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор студенческой работы: [[Участник:LanaLana|Светлана Илларионова]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
[[file: Search-communities.jpg|thumb|right|200px|Рисунок 1. Пример разбиения на сообщества]]&lt;br /&gt;
== Общее описание алгоритма==&lt;br /&gt;
Рассматривается задача поиска сообществ в неориенетированном графе с весами, значениями которых являются действительными неотрицательными числами. Приведем примеры, где в реальной жизни могут втсречаться такие структуры: задачи, возникающие в социальной медиа структуре (то есть это многочисленные социальные сети), задачи, связанные с медициной и биоинформатикой, бизнес-задачи. Главная идея, которую преследуют, решая вышеперечисленные проблемы &amp;amp;mdash; это выделение из общей совокупности объектов, групп, объекты внутри которых сильно взаимосвязаны. В качестве подхода к решению будем рассматривать алгоритм Label Propagation, применяя который получим, что вершины одного сообщества будут сильно связаны, а вершины из разных сообществ будут слабо связаны.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Дан граф &amp;lt;math&amp;gt; G = (V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V &amp;lt;/math&amp;gt; &amp;amp;mdash; множество вершин, &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; &amp;amp;mdash; множество ребер, &amp;lt;math&amp;gt; w (u, v) &amp;lt;/math&amp;gt; &amp;amp;mdash; вес каждого ребра &amp;lt;math&amp;gt; e(u, v) \in E, u, v \in V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Цель задачи &amp;amp;mdash; найти такое разбиение графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; на множество &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; непересекающихся сообществ вершин &amp;lt;math&amp;gt;c_i \subseteq V&amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; \cup c_i = V, \forall c_i \in C &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; c_i \cap c_j = \varnothing, \forall c_i, c_j \in C, i \neq j, &amp;lt;/math&amp;gt; чтобы максимизировать функционал модулярности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q = \sum_{c \in C} \left(\frac{\sum_{in}^{c}}{m} - \left[\frac{\sum{out}^{c}}{m} \right]^2\right)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt; \sum_{in}^{c} = \sum_{u, v \in c, e(u, v) \in E} w(u, v), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{out}^{c} = \sum_{in}^{c} + \sum_{u \in c, v \notin c, e(u, v) \in E} w(u, v)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; m = \sum_{e(u, v) \in E} w(u, v).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{in}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех внутренних рёбер сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{out}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех рёбер, исходящих из вершин сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; &amp;amp;mdash; нормализующий коэффициент, сумма весов рёбер графа.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро &amp;amp;mdash; та часть алгоритма, на которую приходится основное время работы алгоритма. В данном случае к вычислительному ядру не относится только часть инициализации. Вычислительное ядро включает в себя цикл, в котором необходимое число раз осуществляется прохождение по всем вершинам графа и отнесения их к соответствующим компонентам.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма==&lt;br /&gt;
???&lt;br /&gt;
== Схема реализации последовательного алгоритма== &lt;br /&gt;
В начальный момент времени каждой вершине приписана уникальная метка сообщества. Обновление меток вершин осуществляется по следующему принципу: у каждой вершины есть определенное число смежных вершин, которым приписаны метки каких-то сообществ, также у ребер между вершинами определены свои веса. На очередном шаге определим метку вершины &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. У соседей этой вершины метки сообществ, к которым они принадлежат, могут быть различными. Рассмотрим каждый тип меток. Для вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го типа считаем сумму весов ребер, которые соединяют эти вершины с изучаемой вершиной &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. Приписываем нашей вершине ту метку, для которой эта сумма оказалась максимальной. Итерации происходят до тех пор, пока меняются метки вершин. В стандартном алгоритме принято рассматривать вершины в случайном порядке, это позволяет улучшить метрику. Можно отказаться от переупорядочивания вершин для увеличения быстродействия вычислений. Также в параллельной версии программы потоки в рамках одного узла могут конкурировать, производить вычисления неравномерно, засчёт чего достигается эффект случайности в обработке вершин. &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма==&lt;br /&gt;
Сложность алгоритма: &amp;lt;math&amp;gt;O(n + m)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n, m&amp;lt;/math&amp;gt; &amp;amp;mdash; число вершин и ребер.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф==&lt;br /&gt;
[[File:Community detection information graph.svg|thumb|right|100px|Рисунок 2. Информационный граф]]&lt;br /&gt;
Данные на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; итерации зависят от данных на &amp;lt;math&amp;gt;i- 1&amp;lt;/math&amp;gt; итерации. На рисунке 2 изображены вершины графа и влияние на их принадлежность той или иной компоненте на последующей итерации знаний о распределении вершин по компонентам на текущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Разбиваем множество вершин на заданное число узлов. Каждый узел пересчитывает метки для своего набора вершин. Массивы меток для всех вершин синхронизируются с помощью операции MPI_Allgather.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму подаётся граф, который хранится как разреженная матрица смежности в формате CSR. &lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
== Свойства алгоритма==&lt;br /&gt;
К достоинствам алгоритма Label Propagation можно отнести следующие его аспекты:&lt;br /&gt;
* время работы&lt;br /&gt;
* количество итераций слабо зависит от размера графа&lt;br /&gt;
* прост в понимании&lt;br /&gt;
Недостатками алгоритма являются:&lt;br /&gt;
* недетерминированность, то есть на одном и том же наборе входных данных при новом запуске результат может получиться отличным от предыдущего&lt;br /&gt;
* при некоторых входных данных может давать плохие решения&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. Без OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 29.7823 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 15.4772 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 8.2046 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 5.09298 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. С OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 9.21499 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 4.37143 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 3.41528 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4&lt;br /&gt;
| 3.87224 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. Без OpenMP&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 68.7771 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 36.1929 s&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 21.6286 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 23.8237 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. C OpenMP&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 21.5797 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 11.7228 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 11.5657 s. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, начиная с определенного момента, когда время синхронизации меток для вершин становится соразмерным с временем вычисления меток. Чем менье степень вершин, тем раньше алгоритм перестает масштабироваться.&lt;br /&gt;
&lt;br /&gt;
=Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. &amp;quot;Lancichinetti-Fortunato-Radicchi Benchmark.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2015. Web. 13 November 2016 https://en.wikipedia.org/wiki/Lancichinetti-Fortunato-Radicchi_Benchmark&lt;br /&gt;
&lt;br /&gt;
2. &amp;quot;Help:Wiki markup.&amp;quot; Wikipedia, the free encyclopedia. 12 November 2016‎. Web. 13 November 2016 https://en.wikipedia.org/wiki/Help:Wiki_markup&lt;br /&gt;
&lt;br /&gt;
3. &amp;quot;Label Propagation Algorithm.&amp;quot; 9 November 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Label_Propagation_Algorithm&lt;br /&gt;
&lt;br /&gt;
4.  Спецкурс &amp;quot;Параллельная обработка больших графов&amp;quot; Лекция 4. к.т.н. Александр Сергеевич Семенов. 11 November 2016. Web. 13 November 2016. http://dislab.org/PLGP/PLGP_lecture4.pdf&lt;br /&gt;
&lt;br /&gt;
5. &amp;quot;Sparse matrix.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Sparse_matrix&lt;br /&gt;
&lt;br /&gt;
6. А.С.Антонов &amp;quot;Параллельное программирование с использованием технологии MPI&amp;quot;.-М.: Изд-во МГУ, 2004.-71 с.&lt;br /&gt;
&lt;br /&gt;
7. &amp;quot;OpenMP 4.5 Specifications&amp;quot; Nov 2015. Web. http://www.openmp.org/wp-content/uploads/openmp-4.5.pdf&lt;/div&gt;</summary>
		<author><name>LanaLana</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18632</id>
		<title>Алгоритм распространения констант для задачи поиска сообществ в социальном графе</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18632"/>
		<updated>2016-11-20T18:50:48Z</updated>

		<summary type="html">&lt;p&gt;LanaLana: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор студенческой работы: [[Участник:LanaLana|Светлана Илларионова]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
[[file: Search-communities.jpg|thumb|right|200px|Рисунок 1. Пример разбиения на сообщества]]&lt;br /&gt;
== Общее описание алгоритма==&lt;br /&gt;
Рассматривается задача поиска сообществ в неориенетированном графе с весами, значениями которых являются действительными неотрицательными числами. Приведем примеры, где в реальной жизни могут втсречаться такие структуры: задачи, возникающие в социальной медиа структуре (то есть это многочисленные социальные сети), задачи, связанные с медициной и биоинформатикой, бизнес-задачи. Главная идея, которую преследуют, решая вышеперечисленные проблемы &amp;amp;mdash; это выделение из общей совокупности объектов, групп, объекты внутри которых сильно взаимосвязаны. В качестве подхода к решению будем рассматривать алгоритм Label Propagation, применяя который получим, что вершины одного сообщества будут сильно связаны, а вершины из разных сообществ будут слабо связаны.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Дан граф &amp;lt;math&amp;gt; G = (V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V &amp;lt;/math&amp;gt; &amp;amp;mdash; множество вершин, &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; &amp;amp;mdash; множество ребер, &amp;lt;math&amp;gt; w (u, v) &amp;lt;/math&amp;gt; &amp;amp;mdash; вес каждого ребра &amp;lt;math&amp;gt; e(u, v) \in E, u, v \in V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Цель задачи &amp;amp;mdash; найти такое разбиение графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; на множество &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; непересекающихся сообществ вершин &amp;lt;math&amp;gt;c_i \subseteq V&amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; \cup c_i = V, \forall c_i \in C &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; c_i \cap c_j = \varnothing, \forall c_i, c_j \in C, i \neq j, &amp;lt;/math&amp;gt; чтобы максимизировать функционал модулярности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q = \sum_{c \in C} \left(\frac{\sum_{in}^{c}}{m} - \left[\frac{\sum{out}^{c}}{m} \right]^2\right)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt; \sum_{in}^{c} = \sum_{u, v \in c, e(u, v) \in E} w(u, v), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{out}^{c} = \sum_{in}^{c} + \sum_{u \in c, v \notin c, e(u, v) \in E} w(u, v)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; m = \sum_{e(u, v) \in E} w(u, v).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{in}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех внутренних рёбер сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{out}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех рёбер, исходящих из вершин сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; &amp;amp;mdash; нормализующий коэффициент, сумма весов рёбер графа.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро &amp;amp;mdash; та часть алгоритма, на которую приходится основное время работы алгоритма. В данном случае к вычислительному ядру не относится только часть инициализации. Вычислительное ядро включает в себя цикл, в котором необходимое число раз осуществляется прохождение по всем вершинам графа и отнесения их к соответствующим компонентам.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма==&lt;br /&gt;
???&lt;br /&gt;
== Схема реализации последовательного алгоритма== &lt;br /&gt;
В начальный момент времени каждой вершине приписана уникальная метка сообщества. Обновление меток вершин осуществляется по следующему принципу: у каждой вершины есть определенное число смежных вершин, которым приписаны метки каких-то сообществ, также у ребер между вершинами определены свои веса. На очередном шаге определим метку вершины &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. У соседей этой вершины метки сообществ, к которым они принадлежат, могут быть различными. Рассмотрим каждый тип меток. Для вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го типа считаем сумму весов ребер, которые соединяют эти вершины с изучаемой вершиной &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. Приписываем нашей вершине ту метку, для которой эта сумма оказалась максимальной. Итерации происходят до тех пор, пока меняются метки вершин. В стандартном алгоритме принято рассматривать вершины в случайном порядке, это позволяет улучшить метрику. Можно отказаться от переупорядочивания вершин для увеличения быстродействия вычислений. Также в параллельной версии программы потоки в рамках одного узла могут конкурировать, производить вычисления неравномерно, засчёт чего достигается эффект случайности в обработке вершин. &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма==&lt;br /&gt;
Сложность алгоритма: &amp;lt;math&amp;gt;O(n + m)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n, m&amp;lt;/math&amp;gt; &amp;amp;mdash; число вершин и ребер.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф==&lt;br /&gt;
[[File:Community detection information graph.svg|thumb|right|100px|Рис.1. Информационный граф]]&lt;br /&gt;
Данные на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; итерации зависят от данных на &amp;lt;math&amp;gt;i- 1&amp;lt;/math&amp;gt; итерации. На рисунке 1 изображены вершины графа и влияние на их принадлежность той или иной компоненте на последующей итерации знаний о распределении вершин по компонентам на текущей итерации.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Разбиваем множество вершин на заданное число узлов. Каждый узел пересчитывает метки для своего набора вершин. Массивы меток для всех вершин синхронизируются с помощью операции MPI_Allgather.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму подаётся граф, который хранится как разреженная матрица смежности в формате CSR. &lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
== Свойства алгоритма==&lt;br /&gt;
К достоинствам алгоритма Label Propagation можно отнести следующие его аспекты:&lt;br /&gt;
* время работы&lt;br /&gt;
* количество итераций слабо зависит от размера графа&lt;br /&gt;
* прост в понимании&lt;br /&gt;
Недостатками алгоритма являются:&lt;br /&gt;
* недетерминированность, то есть на одном и том же наборе входных данных при новом запуске результат может получиться отличным от предыдущего&lt;br /&gt;
* при некоторых входных данных может давать плохие решения&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. Без OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 29.7823 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 15.4772 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 8.2046 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 5.09298 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. С OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 9.21499 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 4.37143 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 3.41528 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4&lt;br /&gt;
| 3.87224 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. Без OpenMP&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 68.7771 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 36.1929 s&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 21.6286 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 23.8237 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. C OpenMP&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 21.5797 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 11.7228 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 11.5657 s. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, начиная с определенного момента, когда время синхронизации меток для вершин становится соразмерным с временем вычисления меток. Чем менье степень вершин, тем раньше алгоритм перестает масштабироваться.&lt;br /&gt;
&lt;br /&gt;
=Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. &amp;quot;Lancichinetti-Fortunato-Radicchi Benchmark.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2015. Web. 13 November 2016 https://en.wikipedia.org/wiki/Lancichinetti-Fortunato-Radicchi_Benchmark&lt;br /&gt;
&lt;br /&gt;
2. &amp;quot;Help:Wiki markup.&amp;quot; Wikipedia, the free encyclopedia. 12 November 2016‎. Web. 13 November 2016 https://en.wikipedia.org/wiki/Help:Wiki_markup&lt;br /&gt;
&lt;br /&gt;
3. &amp;quot;Label Propagation Algorithm.&amp;quot; 9 November 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Label_Propagation_Algorithm&lt;br /&gt;
&lt;br /&gt;
4.  Спецкурс &amp;quot;Параллельная обработка больших графов&amp;quot; Лекция 4. к.т.н. Александр Сергеевич Семенов. 11 November 2016. Web. 13 November 2016. http://dislab.org/PLGP/PLGP_lecture4.pdf&lt;br /&gt;
&lt;br /&gt;
5. &amp;quot;Sparse matrix.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Sparse_matrix&lt;br /&gt;
&lt;br /&gt;
6. А.С.Антонов &amp;quot;Параллельное программирование с использованием технологии MPI&amp;quot;.-М.: Изд-во МГУ, 2004.-71 с.&lt;br /&gt;
&lt;br /&gt;
7. &amp;quot;OpenMP 4.5 Specifications&amp;quot; Nov 2015. Web. http://www.openmp.org/wp-content/uploads/openmp-4.5.pdf&lt;/div&gt;</summary>
		<author><name>LanaLana</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18615</id>
		<title>Алгоритм распространения констант для задачи поиска сообществ в социальном графе</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18615"/>
		<updated>2016-11-20T18:05:07Z</updated>

		<summary type="html">&lt;p&gt;LanaLana: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор студенческой работы: [[Участник:LanaLana|Светлана Илларионова]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
[[file: Search-communities.jpg|thumb|right|200px|Рисунок 1. Пример разбиения на сообщества]]&lt;br /&gt;
== Общее описание алгоритма==&lt;br /&gt;
Рассматривается задача поиска сообществ в неориенетированном графе с весами, значениями которых являются действительными неотрицательными числами. Приведем примеры, где в реальной жизни могут втсречаться такие структуры: задачи, возникающие в социальной медиа структуре (то есть это многочисленные социальные сети), задачи, связанные с медициной и биоинформатикой, бизнес-задачи. Главная идея, которую преследуют, решая вышеперечисленные проблемы &amp;amp;mdash; это выделение из общей совокупности объектов, групп, объекты внутри которых сильно взаимосвязаны. В качестве подхода к решению будем рассматривать алгоритм Label Propagation, применяя который получим, что вершины одного сообщества будут сильно связаны, а вершины из разных сообществ будут слабо связаны.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Дан граф &amp;lt;math&amp;gt; G = (V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V &amp;lt;/math&amp;gt; &amp;amp;mdash; множество вершин, &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; &amp;amp;mdash; множество ребер, &amp;lt;math&amp;gt; w (u, v) &amp;lt;/math&amp;gt; &amp;amp;mdash; вес каждого ребра &amp;lt;math&amp;gt; e(u, v) \in E, u, v \in V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Цель задачи &amp;amp;mdash; найти такое разбиение графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; на множество &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; непересекающихся сообществ вершин &amp;lt;math&amp;gt;c_i \subseteq V&amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; \cup c_i = V, \forall c_i \in C &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; c_i \cap c_j = \varnothing, \forall c_i, c_j \in C, i \neq j, &amp;lt;/math&amp;gt; чтобы максимизировать функционал модулярности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q = \sum_{c \in C} \left(\frac{\sum_{in}^{c}}{m} - \left[\frac{\sum{out}^{c}}{m} \right]^2\right)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt; \sum_{in}^{c} = \sum_{u, v \in c, e(u, v) \in E} w(u, v), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{out}^{c} = \sum_{in}^{c} + \sum_{u \in c, v \notin c, e(u, v) \in E} w(u, v)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; m = \sum_{e(u, v) \in E} w(u, v).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{in}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех внутренних рёбер сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{out}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех рёбер, исходящих из вершин сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; &amp;amp;mdash; нормализующий коэффициент, сумма весов рёбер графа.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро &amp;amp;mdash; та часть алгоритма, на которую приходится основное время работы алгоритма. В данном случае к вычислительному ядру не относится только часть инициализации. Вычислительное ядро включает в себя цикл, в котором необходимое число раз осуществляется прохождение по всем вершинам графа и отнесения их к соответствующим компонентам.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма==&lt;br /&gt;
???&lt;br /&gt;
== Схема реализации последовательного алгоритма== &lt;br /&gt;
В начальный момент времени каждой вершине приписана уникальная метка сообщества. Обновление меток вершин осуществляется по следующему принципу: у каждой вершины есть определенное число смежных вершин, которым приписаны метки каких-то сообществ, также у ребер между вершинами определены свои веса. На очередном шаге определим метку вершины &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. У соседей этой вершины метки сообществ, к которым они принадлежат, могут быть различными. Рассмотрим каждый тип меток. Для вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го типа считаем сумму весов ребер, которые соединяют эти вершины с изучаемой вершиной &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. Приписываем нашей вершине ту метку, для которой эта сумма оказалась максимальной. Итерации происходят до тех пор, пока меняются метки вершин. В стандартном алгоритме принято рассматривать вершины в случайном порядке, это позволяет улучшить метрику. Можно отказаться от переупорядочивания вершин для увеличения быстродействия вычислений. Также в параллельной версии программы потоки в рамках одного узла могут конкурировать, производить вычисления неравномерно, засчёт чего достигается эффект случайности в обработке вершин. &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма==&lt;br /&gt;
Сложность алгоритма: &amp;lt;math&amp;gt;O(n + m)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n, m&amp;lt;/math&amp;gt; &amp;amp;mdash; число вершин и ребер.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф==&lt;br /&gt;
== Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Разбиваем множество вершин на заданное число узлов. Каждый узел пересчитывает метки для своего набора вершин. Массивы меток для всех вершин синхронизируются с помощью операции MPI_Allgather.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму подаётся граф, который хранится как разреженная матрица смежности в формате CSR. &lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
== Свойства алгоритма==&lt;br /&gt;
К достоинствам алгоритма Label Propagation можно отнести следующие его аспекты:&lt;br /&gt;
* время работы&lt;br /&gt;
* количество итераций слабо зависит от размера графа&lt;br /&gt;
* прост в понимании&lt;br /&gt;
Недостатками алгоритма являются:&lt;br /&gt;
* недетерминированность, то есть на одном и том же наборе входных данных при новом запуске результат может получиться отличным от предыдущего&lt;br /&gt;
* при некоторых входных данных может давать плохие решения&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. Без OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 29.7823 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 15.4772 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 8.2046 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 5.09298 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. С OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 9.21499 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 4.37143 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 3.41528 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4&lt;br /&gt;
| 3.87224 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. Без OpenMP&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 68.7771 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 36.1929 s&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 21.6286 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 23.8237 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. C OpenMP&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 21.5797 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 11.7228 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 11.5657 s. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, начиная с определенного момента, когда время синхронизации меток для вершин становится соразмерным с временем вычисления меток. Чем менье степень вершин, тем раньше алгоритм перестает масштабироваться.&lt;br /&gt;
&lt;br /&gt;
=Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. &amp;quot;Lancichinetti-Fortunato-Radicchi Benchmark.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2015. Web. 13 November 2016 https://en.wikipedia.org/wiki/Lancichinetti-Fortunato-Radicchi_Benchmark&lt;br /&gt;
&lt;br /&gt;
2. &amp;quot;Help:Wiki markup.&amp;quot; Wikipedia, the free encyclopedia. 12 November 2016‎. Web. 13 November 2016 https://en.wikipedia.org/wiki/Help:Wiki_markup&lt;br /&gt;
&lt;br /&gt;
3. &amp;quot;Label Propagation Algorithm.&amp;quot; 9 November 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Label_Propagation_Algorithm&lt;br /&gt;
&lt;br /&gt;
4.  Спецкурс &amp;quot;Параллельная обработка больших графов&amp;quot; Лекция 4. к.т.н. Александр Сергеевич Семенов. 11 November 2016. Web. 13 November 2016. http://dislab.org/PLGP/PLGP_lecture4.pdf&lt;br /&gt;
&lt;br /&gt;
5. &amp;quot;Sparse matrix.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Sparse_matrix&lt;br /&gt;
&lt;br /&gt;
6. А.С.Антонов &amp;quot;Параллельное программирование с использованием технологии MPI&amp;quot;.-М.: Изд-во МГУ, 2004.-71 с.&lt;br /&gt;
&lt;br /&gt;
7. &amp;quot;OpenMP 4.5 Specifications&amp;quot; Nov 2015. Web. http://www.openmp.org/wp-content/uploads/openmp-4.5.pdf&lt;/div&gt;</summary>
		<author><name>LanaLana</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18609</id>
		<title>Алгоритм распространения констант для задачи поиска сообществ в социальном графе</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18609"/>
		<updated>2016-11-20T17:59:18Z</updated>

		<summary type="html">&lt;p&gt;LanaLana: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор студенческой работы: [[Участник:LanaLana|Светлана Илларионова]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
[[file: Search-communities.jpg|thumb|right|200px|Рисунок 1. Пример разбиения на сообщества]]&lt;br /&gt;
== Общее описание алгоритма==&lt;br /&gt;
Рассматривается задача поиска сообществ в неориенетированном графе с весами, значениями которых являются действительными неотрицательными числами. Приведем примеры, где в реальной жизни могут втсречаться такие структуры: задачи, возникающие в социальной медиа структуре (то есть это многочисленные социальные сети), задачи, связанные с медициной и биоинформатикой, бизнес-задачи. Главная идея, которую преследуют, решая вышеперечисленные проблемы &amp;amp;mdash; это выделение из общей совокупности объектов, групп, объекты внутри которых сильно взаимосвязаны. В качестве подхода к решению будем рассматривать алгоритм Label Propagation, применяя который получим, что вершины одного сообщества будут сильно связаны, а вершины из разных сообществ будут слабо связаны.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Дан граф &amp;lt;math&amp;gt; G = (V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V &amp;lt;/math&amp;gt; &amp;amp;mdash; множество вершин, &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; &amp;amp;mdash; множество ребер, &amp;lt;math&amp;gt; w (u, v) &amp;lt;/math&amp;gt; &amp;amp;mdash; вес каждого ребра &amp;lt;math&amp;gt; e(u, v) \in E, u, v \in V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Цель задачи &amp;amp;mdash; найти такое разбиение графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; на множество &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; непересекающихся сообществ вершин &amp;lt;math&amp;gt;c_i \subseteq V&amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; \cup c_i = V, \forall c_i \in C &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; c_i \cap c_j = \varnothing, \forall c_i, c_j \in C, i \neq j, &amp;lt;/math&amp;gt; чтобы максимизировать функционал модулярности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q = \sum_{c \in C} \left(\frac{\sum_{in}^{c}}{m} - \left[\frac{\sum{out}^{c}}{m} \right]^2\right)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt; \sum_{in}^{c} = \sum_{u, v \in c, e(u, v) \in E} w(u, v), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{out}^{c} = \sum_{in}^{c} + \sum_{u \in c, v \notin c, e(u, v) \in E} w(u, v)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; m = \sum_{e(u, v) \in E} w(u, v).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{in}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех внутренних рёбер сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{out}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех рёбер, исходящих из вершин сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; &amp;amp;mdash; нормализующий коэффициент, сумма весов рёбер графа.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро &amp;amp;mdash; та часть алгоритма, на которую приходится основное время работы алгоритма. В данном случае к вычислительному ядру не относится только часть инициализации. Вычислительное ядро включает в себя цикл, в котором необходимое число раз осуществляется прохождение по всем вершинам графа и отнесения их к соответствующим компонентам.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма==&lt;br /&gt;
???&lt;br /&gt;
== Схема реализации последовательного алгоритма== &lt;br /&gt;
В начальный момент времени каждой вершине приписана уникальная метка сообщества. Обновление меток вершин осуществляется по следующему принципу: у каждой вершины есть определенное число смежных вершин, которым приписаны метки каких-то сообществ, также у ребер между вершинами определены свои веса. На очередном шаге определим метку вершины &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. У соседей этой вершины метки сообществ, к которым они принадлежат, могут быть различными. Рассмотрим каждый тип меток. Для вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го типа считаем сумму весов ребер, которые соединяют эти вершины с изучаемой вершиной &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. Приписываем нашей вершине ту метку, для которой эта сумма оказалась максимальной. Итерации происходят до тех пор, пока меняются метки вершин. В стандартном алгоритме принято рассматривать вершины в случайном порядке, это позволяет улучшить метрику. Можно отказаться от переупорядочивания вершин для увеличения быстродействия вычислений. Также в параллельной версии программы потоки в рамках одного узла могут конкурировать, производить вычисления неравномерно, засчёт чего достигается эффект случайности в обработке вершин. &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма==&lt;br /&gt;
== Информационный граф==&lt;br /&gt;
== Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Разбиваем множество вершин на заданное число узлов. Каждый узел пересчитывает метки для своего набора вершин. Массивы меток для всех вершин синхронизируются с помощью операции MPI_Allgather.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму подаётся граф, который хранится как разреженная матрица смежности в формате CSR. &lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
== Свойства алгоритма==&lt;br /&gt;
К достоинствам алгоритма Label Propagation можно отнести следующие его аспекты:&lt;br /&gt;
* время работы&lt;br /&gt;
* количество итераций слабо зависит от размера графа&lt;br /&gt;
* прост в понимании&lt;br /&gt;
Недостатками алгоритма являются:&lt;br /&gt;
* недетерминированность, то есть на одном и том же наборе входных данных при новом запуске результат может получиться отличным от предыдущего&lt;br /&gt;
* при некоторых входных данных может давать плохие решения&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. Без OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 29.7823 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 15.4772 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 8.2046 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 5.09298 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. С OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 9.21499 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 4.37143 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 3.41528 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4&lt;br /&gt;
| 3.87224 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. Без OpenMP&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 68.7771 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 36.1929 s&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 21.6286 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 23.8237 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. C OpenMP&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 21.5797 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 11.7228 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 11.5657 s. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, начиная с определенного момента, когда время синхронизации меток для вершин становится соразмерным с временем вычисления меток. Чем менье степень вершин, тем раньше алгоритм перестает масштабироваться.&lt;br /&gt;
&lt;br /&gt;
=Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. &amp;quot;Lancichinetti-Fortunato-Radicchi Benchmark.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2015. Web. 13 November 2016 https://en.wikipedia.org/wiki/Lancichinetti-Fortunato-Radicchi_Benchmark&lt;br /&gt;
&lt;br /&gt;
2. &amp;quot;Help:Wiki markup.&amp;quot; Wikipedia, the free encyclopedia. 12 November 2016‎. Web. 13 November 2016 https://en.wikipedia.org/wiki/Help:Wiki_markup&lt;br /&gt;
&lt;br /&gt;
3. &amp;quot;Label Propagation Algorithm.&amp;quot; 9 November 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Label_Propagation_Algorithm&lt;br /&gt;
&lt;br /&gt;
4.  Спецкурс &amp;quot;Параллельная обработка больших графов&amp;quot; Лекция 4. к.т.н. Александр Сергеевич Семенов. 11 November 2016. Web. 13 November 2016. http://dislab.org/PLGP/PLGP_lecture4.pdf&lt;br /&gt;
&lt;br /&gt;
5. &amp;quot;Sparse matrix.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Sparse_matrix&lt;br /&gt;
&lt;br /&gt;
6. А.С.Антонов &amp;quot;Параллельное программирование с использованием технологии MPI&amp;quot;.-М.: Изд-во МГУ, 2004.-71 с.&lt;br /&gt;
&lt;br /&gt;
7. &amp;quot;OpenMP 4.5 Specifications&amp;quot; Nov 2015. Web. http://www.openmp.org/wp-content/uploads/openmp-4.5.pdf&lt;/div&gt;</summary>
		<author><name>LanaLana</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18595</id>
		<title>Алгоритм распространения констант для задачи поиска сообществ в социальном графе</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18595"/>
		<updated>2016-11-20T15:34:28Z</updated>

		<summary type="html">&lt;p&gt;LanaLana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор студенческой работы: [[Участник:LanaLana|Светлана Илларионова]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
[[file: Search-communities.jpg|thumb|right|200px|Рисунок 1. Пример разбиения на сообщества]]&lt;br /&gt;
== Общее описание алгоритма==&lt;br /&gt;
Рассматривается задача поиска сообществ в неориенетированном графе с весами, значениями которых являются действительными неотрицательными числами. Приведем примеры, где в реальной жизни могут втсречаться такие структуры: задачи, возникающие в социальной медиа структуре (то есть это многочисленные социальные сети), задачи, связанные с медициной и биоинформатикой, бизнес-задачи. Главная идея, которую преследуют, решая вышеперечисленные проблемы &amp;amp;mdash; это выделение из общей совокупности объектов, групп, объекты внутри которых сильно взаимосвязаны. В качестве подхода к решению будем рассматривать алгоритм Label Propagation, применяя который получим, что вершины одного сообщества будут сильно связаны, а вершины из разных сообществ будут слабо связаны.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Дан граф &amp;lt;math&amp;gt; G = (V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V &amp;lt;/math&amp;gt; &amp;amp;mdash; множество вершин, &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; &amp;amp;mdash; множество ребер, &amp;lt;math&amp;gt; w (u, v) &amp;lt;/math&amp;gt; &amp;amp;mdash; вес каждого ребра &amp;lt;math&amp;gt; e(u, v) \in E, u, v \in V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Цель задачи &amp;amp;mdash; найти такое разбиение графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; на множество &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; непересекающихся сообществ вершин &amp;lt;math&amp;gt;c_i \subseteq V&amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; \cup c_i = V, \forall c_i \in C &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; c_i \cap c_j = \varnothing, \forall c_i, c_j \in C, i \neq j, &amp;lt;/math&amp;gt; чтобы максимизировать функционал модулярности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q = \sum_{c \in C} \left(\frac{\sum_{in}^{c}}{m} - \left[\frac{\sum{out}^{c}}{m} \right]^2\right)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt; \sum_{in}^{c} = \sum_{u, v \in c, e(u, v) \in E} w(u, v), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{out}^{c} = \sum_{in}^{c} + \sum_{u \in c, v \notin c, e(u, v) \in E} w(u, v)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; m = \sum_{e(u, v) \in E} w(u, v).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{in}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех внутренних рёбер сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{out}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех рёбер, исходящих из вершин сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; &amp;amp;mdash; нормализующий коэффициент, сумма весов рёбер графа.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Вычислительное ядро &amp;amp;mdash; та часть алгоритма, на которую приходится основное время работы алгоритма. В данном случае к вычислительному ядру не относится только часть инициализации.&lt;br /&gt;
== Макроструктура алгоритма==&lt;br /&gt;
???&lt;br /&gt;
== Схема реализации последовательного алгоритма== &lt;br /&gt;
В начальный момент времени каждой вершине приписана уникальная метка сообщества. Обновление меток вершин осуществляется по следующему принципу: у каждой вершины есть определенное число смежных вершин, которым приписаны метки каких-то сообществ, также у ребер между вершинами определены свои веса. На очередном шаге определим метку вершины &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. У соседей этой вершины метки сообществ, к которым они принадлежат, могут быть различными. Рассмотрим каждый тип меток. Для вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го типа считаем сумму весов ребер, которые соединяют эти вершины с изучаемой вершиной &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. Приписываем нашей вершине ту метку, для которой эта сумма оказалась максимальной. Итерации происходят до тех пор, пока меняются метки вершин. В стандартном алгоритме принято рассматривать вершины в случайном порядке, это позволяет улучшить метрику. Можно отказаться от переупорядочивания вершин для увеличения быстродействия вычислений. Также в параллельной версии программы потоки в рамках одного узла могут конкурировать, производить вычисления неравномерно, засчёт чего достигается эффект случайности в обработке вершин. &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма==&lt;br /&gt;
== Информационный граф==&lt;br /&gt;
== Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Разбиваем множество вершин на заданное число узлов. Каждый узел пересчитывает метки для своего набора вершин. Массивы меток для всех вершин синхронизируются с помощью операции MPI_Allgather.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму подаётся граф, который хранится как разреженная матрица смежности в формате CSR. &lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
== Свойства алгоритма==&lt;br /&gt;
К достоинствам алгоритма Label Propagation можно отнести следующие его аспекты:&lt;br /&gt;
* время работы&lt;br /&gt;
* количество итераций слабо зависит от размера графа&lt;br /&gt;
* прост в понимании&lt;br /&gt;
Недостатками алгоритма являются:&lt;br /&gt;
* недетерминированность, то есть на одном и том же наборе входных данных при новом запуске результат может получиться отличным от предыдущего&lt;br /&gt;
* при некоторых входных данных может давать плохие решения&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. Без OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 29.7823 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 15.4772 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 8.2046 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 5.09298 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. С OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 9.21499 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 4.37143 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 3.41528 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4&lt;br /&gt;
| 3.87224 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. Без OpenMP&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 68.7771 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 36.1929 s&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 21.6286 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 23.8237 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. C OpenMP&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 21.5797 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 11.7228 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 11.5657 s. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, начиная с определенного момента, когда время синхронизации меток для вершин становится соразмерным с временем вычисления меток. Чем менье степень вершин, тем раньше алгоритм перестает масштабироваться.&lt;br /&gt;
&lt;br /&gt;
=Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. &amp;quot;Lancichinetti-Fortunato-Radicchi Benchmark.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2015. Web. 13 November 2016 https://en.wikipedia.org/wiki/Lancichinetti-Fortunato-Radicchi_Benchmark&lt;br /&gt;
&lt;br /&gt;
2. &amp;quot;Help:Wiki markup.&amp;quot; Wikipedia, the free encyclopedia. 12 November 2016‎. Web. 13 November 2016 https://en.wikipedia.org/wiki/Help:Wiki_markup&lt;br /&gt;
&lt;br /&gt;
3. &amp;quot;Label Propagation Algorithm.&amp;quot; 9 November 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Label_Propagation_Algorithm&lt;br /&gt;
&lt;br /&gt;
4.  Спецкурс &amp;quot;Параллельная обработка больших графов&amp;quot; Лекция 4. к.т.н. Александр Сергеевич Семенов. 11 November 2016. Web. 13 November 2016. http://dislab.org/PLGP/PLGP_lecture4.pdf&lt;br /&gt;
&lt;br /&gt;
5. &amp;quot;Sparse matrix.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Sparse_matrix&lt;br /&gt;
&lt;br /&gt;
6. А.С.Антонов &amp;quot;Параллельное программирование с использованием технологии MPI&amp;quot;.-М.: Изд-во МГУ, 2004.-71 с.&lt;br /&gt;
&lt;br /&gt;
7. &amp;quot;OpenMP 4.5 Specifications&amp;quot; Nov 2015. Web. http://www.openmp.org/wp-content/uploads/openmp-4.5.pdf&lt;/div&gt;</summary>
		<author><name>LanaLana</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18581</id>
		<title>Алгоритм распространения констант для задачи поиска сообществ в социальном графе</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18581"/>
		<updated>2016-11-20T13:29:38Z</updated>

		<summary type="html">&lt;p&gt;LanaLana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор студенческой работы: [[Участник:LanaLana|Светлана Илларионова]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
[[file: Search-communities.jpg|thumb|right|200px|Рисунок 1. Пример разбиения на сообщества]]&lt;br /&gt;
== Общее описание алгоритма==&lt;br /&gt;
Рассматривается задача поиска сообществ в неориенетированном графе с весами, значениями которых являются действительными неотрицательными числами.&lt;br /&gt;
В качестве подхода к решению будем рассматривать алгоритм Label Propagation. &lt;br /&gt;
Вершины одного сообщества должны быть сильно связаны, а вершины из разных сообществ должны быть слабо связаны.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Дан граф &amp;lt;math&amp;gt; G = (V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V &amp;lt;/math&amp;gt; &amp;amp;mdash; множество вершин, &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; &amp;amp;mdash; множество ребер, &amp;lt;math&amp;gt; w (u, v) &amp;lt;/math&amp;gt; &amp;amp;mdash; вес каждого ребра &amp;lt;math&amp;gt; e(u, v) \in E, u, v \in V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Цель задачи &amp;amp;mdash; найти такое разбиение графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; на множество &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; непересекающихся сообществ вершин &amp;lt;math&amp;gt;c_i \subseteq V&amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; \cup c_i = V, \forall c_i \in C &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; c_i \cap c_j = \varnothing, \forall c_i, c_j \in C, i \neq j, &amp;lt;/math&amp;gt; чтобы максимизировать функционал модулярности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q = \sum_{c \in C} \left(\frac{\sum_{in}^{c}}{m} - \left[\frac{\sum{out}^{c}}{m} \right]^2\right)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt; \sum_{in}^{c} = \sum_{u, v \in c, e(u, v) \in E} w(u, v), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{out}^{c} = \sum_{in}^{c} + \sum_{u \in c, v \notin c, e(u, v) \in E} w(u, v)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; m = \sum_{e(u, v) \in E} w(u, v).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{in}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех внутренних рёбер сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{out}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех рёбер, исходящих из вершин сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; &amp;amp;mdash; нормализующий коэффициент, сумма весов рёбер графа.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
== Макроструктура алгоритма==&lt;br /&gt;
== Схема реализации последовательного алгоритма== &lt;br /&gt;
В начальный момент времени каждой вершине приписана уникальная метка сообщества. Обновление меток вершин осуществляется по следующему принципу: у каждой вершины есть определенное число смежных вершин, которым приписаны метки каких-то сообществ, также у ребер между вершинами определены свои веса. На очередном шаге определим метку вершины &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. У соседей этой вершины метки сообществ, к которым они принадлежат, могут быть различными. Рассмотрим каждый тип меток. Для вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го типа считаем сумму весов ребер, которые соединяют эти вершины с изучаемой вершиной &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. Приписываем нашей вершине ту метку, для которой эта сумма оказалась максимальной. Итерации происходят до тех пор, пока меняются метки вершин. В стандартном алгоритме принято рассматривать вершины в случайном порядке, это позволяет улучшить метрику. Можно отказаться от переупорядочивания вершин для увеличения быстродействия вычислений. Также в параллельной версии программы потоки в рамках одного узла могут конкурировать, производить вычисления неравномерно, засчёт чего достигается эффект случайности в обработке вершин. &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма==&lt;br /&gt;
== Информационный граф==&lt;br /&gt;
== Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Разбиваем множество вершин на заданное число узлов. Каждый узел пересчитывает метки для своего набора вершин. Массивы меток для всех вершин синхронизируются с помощью операции MPI_Allgather.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму подаётся граф, который хранится как разреженная матрица смежности в формате CSR. &lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
== Свойства алгоритма==&lt;br /&gt;
К достоинствам алгоритма Label Propagation можно отнести следующие его аспекты:&lt;br /&gt;
* время работы&lt;br /&gt;
* количество итераций слабо зависит от размера графа&lt;br /&gt;
* прост в понимании&lt;br /&gt;
Недостатками алгоритма являются:&lt;br /&gt;
* недетерминированность, то есть на одном и том же наборе входных данных при новом запуске результат может получиться отличным от предыдущего&lt;br /&gt;
* при некоторых входных данных может давать плохие решения&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
== Алгоритм решения==&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Результаты работы алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. Без OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 29.7823 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 15.4772 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 8.2046 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 5.09298 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. С OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 9.21499 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 4.37143 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 3.41528 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4&lt;br /&gt;
| 3.87224 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. Без OpenMP&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 68.7771 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 36.1929 s&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 21.6286 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 23.8237 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. C OpenMP&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 21.5797 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 11.7228 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 11.5657 s. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, начиная с определенного момента, когда время синхронизации меток для вершин становится соразмерным с временем вычисления меток. Чем менье степень вершин, тем раньше алгоритм перестает масштабироваться.&lt;br /&gt;
&lt;br /&gt;
=Литература =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. &amp;quot;Lancichinetti-Fortunato-Radicchi Benchmark.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2015. Web. 13 November 2016 https://en.wikipedia.org/wiki/Lancichinetti-Fortunato-Radicchi_Benchmark&lt;br /&gt;
&lt;br /&gt;
2. &amp;quot;Help:Wiki markup.&amp;quot; Wikipedia, the free encyclopedia. 12 November 2016‎. Web. 13 November 2016 https://en.wikipedia.org/wiki/Help:Wiki_markup&lt;br /&gt;
&lt;br /&gt;
3. &amp;quot;Label Propagation Algorithm.&amp;quot; 9 November 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Label_Propagation_Algorithm&lt;br /&gt;
&lt;br /&gt;
4.  Спецкурс &amp;quot;Параллельная обработка больших графов&amp;quot; Лекция 4. к.т.н. Александр Сергеевич Семенов. 11 November 2016. Web. 13 November 2016. http://dislab.org/PLGP/PLGP_lecture4.pdf&lt;br /&gt;
&lt;br /&gt;
5. &amp;quot;Sparse matrix.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Sparse_matrix&lt;br /&gt;
&lt;br /&gt;
6. А.С.Антонов &amp;quot;Параллельное программирование с использованием технологии MPI&amp;quot;.-М.: Изд-во МГУ, 2004.-71 с.&lt;br /&gt;
&lt;br /&gt;
7. &amp;quot;OpenMP 4.5 Specifications&amp;quot; Nov 2015. Web. http://www.openmp.org/wp-content/uploads/openmp-4.5.pdf&lt;/div&gt;</summary>
		<author><name>LanaLana</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18580</id>
		<title>Алгоритм распространения констант для задачи поиска сообществ в социальном графе</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=18580"/>
		<updated>2016-11-20T13:29:13Z</updated>

		<summary type="html">&lt;p&gt;LanaLana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор студенческой работы: [[Участник:LanaLana|Светлана Илларионова]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
[[file: Search-communities.jpg|thumb|right|200px|Рисунок 1. Пример разбиения на сообщества]]&lt;br /&gt;
== Общее описание алгоритма==&lt;br /&gt;
Рассматривается задача поиска сообществ в неориенетированном графе с весами, значениями которых являются действительными неотрицательными числами.&lt;br /&gt;
В качестве подхода к решению будем рассматривать алгоритм Label Propagation. &lt;br /&gt;
Вершины одного сообщества должны быть сильно связаны, а вершины из разных сообществ должны быть слабо связаны.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Дан граф &amp;lt;math&amp;gt; G = (V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V &amp;lt;/math&amp;gt; &amp;amp;mdash; множество вершин, &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; &amp;amp;mdash; множество ребер, &amp;lt;math&amp;gt; w (u, v) &amp;lt;/math&amp;gt; &amp;amp;mdash; вес каждого ребра &amp;lt;math&amp;gt; e(u, v) \in E, u, v \in V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Цель задачи &amp;amp;mdash; найти такое разбиение графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; на множество &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; непересекающихся сообществ вершин &amp;lt;math&amp;gt;c_i \subseteq V&amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; \cup c_i = V, \forall c_i \in C &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; c_i \cap c_j = \varnothing, \forall c_i, c_j \in C, i \neq j, &amp;lt;/math&amp;gt; чтобы максимизировать функционал модулярности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q = \sum_{c \in C} \left(\frac{\sum_{in}^{c}}{m} - \left[\frac{\sum{out}^{c}}{m} \right]^2\right)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt; \sum_{in}^{c} = \sum_{u, v \in c, e(u, v) \in E} w(u, v), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{out}^{c} = \sum_{in}^{c} + \sum_{u \in c, v \notin c, e(u, v) \in E} w(u, v)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; m = \sum_{e(u, v) \in E} w(u, v).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{in}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех внутренних рёбер сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{out}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех рёбер, исходящих из вершин сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; &amp;amp;mdash; нормализующий коэффициент, сумма весов рёбер графа.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
== Макроструктура алгоритма==&lt;br /&gt;
== Схема реализации последовательного алгоритма== &lt;br /&gt;
В начальный момент времени каждой вершине приписана уникальная метка сообщества. Обновление меток вершин осуществляется по следующему принципу: у каждой вершины есть определенное число смежных вершин, которым приписаны метки каких-то сообществ, также у ребер между вершинами определены свои веса. На очередном шаге определим метку вершины &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. У соседей этой вершины метки сообществ, к которым они принадлежат, могут быть различными. Рассмотрим каждый тип меток. Для вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го типа считаем сумму весов ребер, которые соединяют эти вершины с изучаемой вершиной &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. Приписываем нашей вершине ту метку, для которой эта сумма оказалась максимальной. Итерации происходят до тех пор, пока меняются метки вершин. В стандартном алгоритме принято рассматривать вершины в случайном порядке, это позволяет улучшить метрику. Можно отказаться от переупорядочивания вершин для увеличения быстродействия вычислений. Также в параллельной версии программы потоки в рамках одного узла могут конкурировать, производить вычисления неравномерно, засчёт чего достигается эффект случайности в обработке вершин. &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма==&lt;br /&gt;
== Информационный граф==&lt;br /&gt;
== Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Разбиваем множество вершин на заданное число узлов. Каждый узел пересчитывает метки для своего набора вершин. Массивы меток для всех вершин синхронизируются с помощью операции MPI_Allgather.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму подаётся граф, который хранится как разреженная матрица смежности в формате CSR. &lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
== Свойства алгоритма==&lt;br /&gt;
К достоинствам алгоритма Label Propagation можно отнести следующие его аспекты:&lt;br /&gt;
* время работы&lt;br /&gt;
* количество итераций слабо зависит от размера графа&lt;br /&gt;
* прост в понимании&lt;br /&gt;
Недостатками алгоритма являются:&lt;br /&gt;
* недетерминированность, то есть на одном и том же наборе входных данных при новом запуске результат может получиться отличным от предыдущего&lt;br /&gt;
* при некоторых входных данных может давать плохие решения&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
== Алгоритм решения==&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Результаты работы алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. Без OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 29.7823 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 15.4772 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 8.2046 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 5.09298 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. С OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 9.21499 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 4.37143 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 3.41528 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4&lt;br /&gt;
| 3.87224 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. Без OpenMP&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 68.7771 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 36.1929 s&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 21.6286 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 23.8237 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. C OpenMP&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 21.5797 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 11.7228 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 11.5657 s. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, начиная с определенного момента, когда время синхронизации меток для вершин становится соразмерным с временем вычисления меток. Чем менье степень вершин, тем раньше алгоритм перестает масштабироваться.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. &amp;quot;Lancichinetti-Fortunato-Radicchi Benchmark.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2015. Web. 13 November 2016 https://en.wikipedia.org/wiki/Lancichinetti-Fortunato-Radicchi_Benchmark&lt;br /&gt;
&lt;br /&gt;
2. &amp;quot;Help:Wiki markup.&amp;quot; Wikipedia, the free encyclopedia. 12 November 2016‎. Web. 13 November 2016 https://en.wikipedia.org/wiki/Help:Wiki_markup&lt;br /&gt;
&lt;br /&gt;
3. &amp;quot;Label Propagation Algorithm.&amp;quot; 9 November 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Label_Propagation_Algorithm&lt;br /&gt;
&lt;br /&gt;
4.  Спецкурс &amp;quot;Параллельная обработка больших графов&amp;quot; Лекция 4. к.т.н. Александр Сергеевич Семенов. 11 November 2016. Web. 13 November 2016. http://dislab.org/PLGP/PLGP_lecture4.pdf&lt;br /&gt;
&lt;br /&gt;
5. &amp;quot;Sparse matrix.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Sparse_matrix&lt;br /&gt;
&lt;br /&gt;
6. А.С.Антонов &amp;quot;Параллельное программирование с использованием технологии MPI&amp;quot;.-М.: Изд-во МГУ, 2004.-71 с.&lt;br /&gt;
&lt;br /&gt;
7. &amp;quot;OpenMP 4.5 Specifications&amp;quot; Nov 2015. Web. http://www.openmp.org/wp-content/uploads/openmp-4.5.pdf&lt;/div&gt;</summary>
		<author><name>LanaLana</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=16686</id>
		<title>Алгоритм распространения констант для задачи поиска сообществ в социальном графе</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=16686"/>
		<updated>2016-11-13T15:52:17Z</updated>

		<summary type="html">&lt;p&gt;LanaLana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор студенческой работы: [[Участник:LanaLana|Светлана Илларионова]]&lt;br /&gt;
&lt;br /&gt;
== Постановка задачи ==&lt;br /&gt;
&lt;br /&gt;
[[file: Search-communities.jpg|thumb|right|200px|Рисунок 1. Пример разбиения на сообщества]]&lt;br /&gt;
&lt;br /&gt;
Рассматривается задача поиска сообществ в неориенетированном графе с весами, значение которых являются действительными неотрицательными числами.&lt;br /&gt;
&lt;br /&gt;
Дан граф &amp;lt;math&amp;gt; G = (V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V &amp;lt;/math&amp;gt; &amp;amp;mdash; множество вершин, &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; &amp;amp;mdash; множество ребер, &amp;lt;math&amp;gt; w (u, v) &amp;lt;/math&amp;gt; &amp;amp;mdash; вес каждого ребра &amp;lt;math&amp;gt; e(u, v) \in E, u, v \in V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Цель задачи &amp;amp;mdash; найти такое разбиение графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; на множество &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; непересекающихся сообществ вершин &amp;lt;math&amp;gt;c_i \subseteq V&amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; \cup c_i = V, \forall c_i \in C &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; c_i \cap c_j = \varnothing, \forall c_i, c_j \in C, i \neq j, &amp;lt;/math&amp;gt; чтобы максимизировать функционал модулярности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q = \sum_{c \in C} \left(\frac{\sum_{in}^{c}}{m} - \left[\frac{\sum{out}^{c}}{m} \right]^2\right)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt; \sum_{in}^{c} = \sum_{u, v \in c, e(u, v) \in E} w(u, v), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{out}^{c} = \sum_{in}^{c} + \sum_{u \in c, v \notin c, e(u, v) \in E} w(u, v)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; m = \sum_{e(u, v) \in E} w(u, v).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{in}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех внутренних рёбер сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{out}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех рёбер, исходящих из вершин сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; &amp;amp;mdash; нормализующий коэффициент, сумма весов рёбер графа.&lt;br /&gt;
Вершины одного сообщества должны быть сильно связаны, а вершины из разных сообществ должны быть слабо связаны.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
== Алгоритм решения==&lt;br /&gt;
&lt;br /&gt;
В качестве подхода к решению будем рассматривать алгоритм Label Propagation. К достоинствам данного алгоритма можно отнести следующие его аспекты:&lt;br /&gt;
* время работы&lt;br /&gt;
* количество итераций слабо зависит от размера графа&lt;br /&gt;
* прост в понимании&lt;br /&gt;
Недостатками алгоритма являются:&lt;br /&gt;
* недетерминированность, то есть на одном и том же наборе входных данных при новом запуске результат может получиться отличным от предыдущего&lt;br /&gt;
* при некоторых входных данных может давать плохие решения&lt;br /&gt;
&lt;br /&gt;
В начальный момент времени каждой вершине приписана уникальная метка сообщества. Обновление меток вершин осуществляется по следующему принципу: у каждой вершины есть определенное число смежных вершин, которым приписаны метки каких-то сообществ, также у ребер между вершинами определены свои веса. На очередном шаге определим метку вершины &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. У соседей этой вершины метки сообществ, к которым они принадлежат, могут быть различными. Рассмотрим каждый тип меток. Для вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го типа считаем сумму весов ребер, которые соединяют эти вершины с изучаемой вершиной &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. Приписываем нашей вершине ту метку, для которой эта сумма оказалась максимальной. Итерации происходят до тех пор, пока меняются метки вершин. В стандартном алгоритме принято рассматривать вершины в случайном порядке, это позволяет улучшить метрику. Можно отказаться от переупорядочивания вершин для увеличения быстродействия вычислений. Также в параллельной версии программы потоки в рамках одного узла могут конкурировать, производить вычисления неравномерно, засчёт чего достигается эффект случайности в обработке вершин. &lt;br /&gt;
&lt;br /&gt;
Граф хранится как разреженная матрица смежности в формате CSR. &lt;br /&gt;
&lt;br /&gt;
Разбиваем мноество вершин на заданное число узлов. Каждый узел пересчитывает метки для своего набора вершин. Массивы меток для всех вершин синхронизируются с помощью операции MPI_Allgather.&lt;br /&gt;
&lt;br /&gt;
== Результаты работы алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. Без OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 29.7823 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 15.4772 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 8.2046 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 5.09298 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. С OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 9.21499 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 4.37143 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 3.41528 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4&lt;br /&gt;
| 3.87224 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. Без OpenMP&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 68.7771 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 36.1929 s&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 21.6286 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 23.8237 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. C OpenMP&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 21.5797 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 11.7228 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 11.5657 s. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, начиная с определенного момента, когда время синхронизации меток для вершин становится соразмерным с временем вычисления меток. Чем менье степень вершин, тем раньше алгоритм перестает масштабироваться.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. &amp;quot;Lancichinetti-Fortunato-Radicchi Benchmark.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2015. Web. 13 November 2016 https://en.wikipedia.org/wiki/Lancichinetti-Fortunato-Radicchi_Benchmark&lt;br /&gt;
&lt;br /&gt;
2. &amp;quot;Help:Wiki markup.&amp;quot; Wikipedia, the free encyclopedia. 12 November 2016‎. Web. 13 November 2016 https://en.wikipedia.org/wiki/Help:Wiki_markup&lt;br /&gt;
&lt;br /&gt;
3. &amp;quot;Label Propagation Algorithm.&amp;quot; 9 November 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Label_Propagation_Algorithm&lt;br /&gt;
&lt;br /&gt;
4.  Спецкурс &amp;quot;Параллельная обработка больших графов&amp;quot; Лекция 4. к.т.н. Александр Сергеевич Семенов. 11 November 2016. Web. 13 November 2016. http://dislab.org/PLGP/PLGP_lecture4.pdf&lt;br /&gt;
&lt;br /&gt;
5. &amp;quot;Sparse matrix.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Sparse_matrix&lt;br /&gt;
&lt;br /&gt;
6. А.С.Антонов &amp;quot;Параллельное программирование с использованием технологии MPI&amp;quot;.-М.: Изд-во МГУ, 2004.-71 с.&lt;br /&gt;
&lt;br /&gt;
7. &amp;quot;OpenMP 4.5 Specifications&amp;quot; Nov 2015. Web. http://www.openmp.org/wp-content/uploads/openmp-4.5.pdf&lt;/div&gt;</summary>
		<author><name>LanaLana</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=16682</id>
		<title>Алгоритм распространения констант для задачи поиска сообществ в социальном графе</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=16682"/>
		<updated>2016-11-13T15:46:50Z</updated>

		<summary type="html">&lt;p&gt;LanaLana: /* Результаты работы алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
&lt;br /&gt;
[[file: Search-communities.jpg|thumb|right|200px|Рисунок 1. Пример разбиения на сообщества]]&lt;br /&gt;
&lt;br /&gt;
Рассматривается задача поиска сообществ в неориенетированном графе с весами, значение которых являются действительными неотрицательными числами.&lt;br /&gt;
&lt;br /&gt;
Дан граф &amp;lt;math&amp;gt; G = (V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V &amp;lt;/math&amp;gt; &amp;amp;mdash; множество вершин, &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; &amp;amp;mdash; множество ребер, &amp;lt;math&amp;gt; w (u, v) &amp;lt;/math&amp;gt; &amp;amp;mdash; вес каждого ребра &amp;lt;math&amp;gt; e(u, v) \in E, u, v \in V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Цель задачи &amp;amp;mdash; найти такое разбиение графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; на множество &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; непересекающихся сообществ вершин &amp;lt;math&amp;gt;c_i \subseteq V&amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; \cup c_i = V, \forall c_i \in C &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; c_i \cap c_j = \varnothing, \forall c_i, c_j \in C, i \neq j, &amp;lt;/math&amp;gt; чтобы максимизировать функционал модулярности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q = \sum_{c \in C} \left(\frac{\sum_{in}^{c}}{m} - \left[\frac{\sum{out}^{c}}{m} \right]^2\right)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt; \sum_{in}^{c} = \sum_{u, v \in c, e(u, v) \in E} w(u, v), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{out}^{c} = \sum_{in}^{c} + \sum_{u \in c, v \notin c, e(u, v) \in E} w(u, v)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; m = \sum_{e(u, v) \in E} w(u, v).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{in}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех внутренних рёбер сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{out}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех рёбер, исходящих из вершин сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; &amp;amp;mdash; нормализующий коэффициент, сумма весов рёбер графа.&lt;br /&gt;
Вершины одного сообщества должны быть сильно связаны, а вершины из разных сообществ должны быть слабо связаны.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
== Алгоритм решения==&lt;br /&gt;
&lt;br /&gt;
В качестве подхода к решению будем рассматривать алгоритм Label Propagation. К достоинствам данного алгоритма можно отнести следующие его аспекты:&lt;br /&gt;
* время работы&lt;br /&gt;
* количество итераций слабо зависит от размера графа&lt;br /&gt;
* прост в понимании&lt;br /&gt;
Недостатками алгоритма являются:&lt;br /&gt;
* недетерминированность, то есть на одном и том же наборе входных данных при новом запуске результат может получиться отличным от предыдущего&lt;br /&gt;
* при некоторых входных данных может давать плохие решения&lt;br /&gt;
&lt;br /&gt;
В начальный момент времени каждой вершине приписана уникальная метка сообщества. Обновление меток вершин осуществляется по следующему принципу: у каждой вершины есть определенное число смежных вершин, которым приписаны метки каких-то сообществ, также у ребер между вершинами определены свои веса. На очередном шаге определим метку вершины &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. У соседей этой вершины метки сообществ, к которым они принадлежат, могут быть различными. Рассмотрим каждый тип меток. Для вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го типа считаем сумму весов ребер, которые соединяют эти вершины с изучаемой вершиной &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. Приписываем нашей вершине ту метку, для которой эта сумма оказалась максимальной. Итерации происходят до тех пор, пока меняются метки вершин. В стандартном алгоритме принято рассматривать вершины в случайном порядке, это позволяет улучшить метрику. Можно отказаться от переупорядочивания вершин для увеличения быстродействия вычислений. Также в параллельной версии программы потоки в рамках одного узла могут конкурировать, производить вычисления неравномерно, засчёт чего достигается эффект случайности в обработке вершин. &lt;br /&gt;
&lt;br /&gt;
Граф хранится как разреженная матрица смежности в формате CSR. &lt;br /&gt;
&lt;br /&gt;
Разбиваем мноество вершин на заданное число узлов. Каждый узел пересчитывает метки для своего набора вершин. Массивы меток для всех вершин синхронизируются с помощью операции MPI_Allgather.&lt;br /&gt;
&lt;br /&gt;
== Результаты работы алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. Без OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 29.7823 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 15.4772 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 8.2046 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 5.09298 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200. С OpenMP.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 9.21499 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 4.37143 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 3.41528 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4&lt;br /&gt;
| 3.87224 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. Без OpenMP&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 68.7771 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 36.1929 s&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 21.6286 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 23.8237 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. C OpenMP&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 21.5797 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 11.7228 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 11.5657 s. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, начиная с определенного момента, когда время синхронизации меток для вершин становится соразмерным с временем вычисления меток. Чем менье степень вершин, тем раньше алгоритм перестает масштабироваться.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. &amp;quot;Lancichinetti-Fortunato-Radicchi Benchmark.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2015. Web. 13 November 2016 https://en.wikipedia.org/wiki/Lancichinetti-Fortunato-Radicchi_Benchmark&lt;br /&gt;
&lt;br /&gt;
2. &amp;quot;Help:Wiki markup.&amp;quot; Wikipedia, the free encyclopedia. 12 November 2016‎. Web. 13 November 2016 https://en.wikipedia.org/wiki/Help:Wiki_markup&lt;br /&gt;
&lt;br /&gt;
3. &amp;quot;Label Propagation Algorithm.&amp;quot; 9 November 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Label_Propagation_Algorithm&lt;br /&gt;
&lt;br /&gt;
4.  Спецкурс &amp;quot;Параллельная обработка больших графов&amp;quot; Лекция 4. к.т.н. Александр Сергеевич Семенов. 11 November 2016. Web. 13 November 2016. http://dislab.org/PLGP/PLGP_lecture4.pdf&lt;br /&gt;
&lt;br /&gt;
5. &amp;quot;Sparse matrix.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Sparse_matrix&lt;br /&gt;
&lt;br /&gt;
6. А.С.Антонов &amp;quot;Параллельное программирование с использованием технологии MPI&amp;quot;.-М.: Изд-во МГУ, 2004.-71 с.&lt;br /&gt;
&lt;br /&gt;
7. &amp;quot;OpenMP 4.5 Specifications&amp;quot; Nov 2015. Web. http://www.openmp.org/wp-content/uploads/openmp-4.5.pdf&lt;/div&gt;</summary>
		<author><name>LanaLana</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=16674</id>
		<title>Алгоритм распространения констант для задачи поиска сообществ в социальном графе</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=16674"/>
		<updated>2016-11-13T15:09:39Z</updated>

		<summary type="html">&lt;p&gt;LanaLana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
&lt;br /&gt;
[[file: Search-communities.jpg|thumb|right|200px|Рисунок 1. Пример разбиения на сообщества]]&lt;br /&gt;
&lt;br /&gt;
Рассматривается задача поиска сообществ в неориенетированном графе с весами, значение которых являются действительными неотрицательными числами.&lt;br /&gt;
&lt;br /&gt;
Дан граф &amp;lt;math&amp;gt; G = (V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V &amp;lt;/math&amp;gt; &amp;amp;mdash; множество вершин, &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; &amp;amp;mdash; множество ребер, &amp;lt;math&amp;gt; w (u, v) &amp;lt;/math&amp;gt; &amp;amp;mdash; вес каждого ребра &amp;lt;math&amp;gt; e(u, v) \in E, u, v \in V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Цель задачи &amp;amp;mdash; найти такое разбиение графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; на множество &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; непересекающихся сообществ вершин &amp;lt;math&amp;gt;c_i \subseteq V&amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; \cup c_i = V, \forall c_i \in C &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; c_i \cap c_j = \varnothing, \forall c_i, c_j \in C, i \neq j, &amp;lt;/math&amp;gt; чтобы максимизировать функционал модулярности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q = \sum_{c \in C} \left(\frac{\sum_{in}^{c}}{m} - \left[\frac{\sum{out}^{c}}{m} \right]^2\right)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt; \sum_{in}^{c} = \sum_{u, v \in c, e(u, v) \in E} w(u, v), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{out}^{c} = \sum_{in}^{c} + \sum_{u \in c, v \notin c, e(u, v) \in E} w(u, v)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; m = \sum_{e(u, v) \in E} w(u, v).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{in}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех внутренних рёбер сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{out}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех рёбер, исходящих из вершин сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; &amp;amp;mdash; нормализующий коэффициент, сумма весов рёбер графа.&lt;br /&gt;
Вершины одного сообщества должны быть сильно связаны, а вершины из разных сообществ должны быть слабо связаны.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
== Алгоритм решения==&lt;br /&gt;
&lt;br /&gt;
В качестве подхода к решению будем рассматривать алгоритм Label Propagation. К достоинствам данного алгоритма можно отнести следующие его аспекты:&lt;br /&gt;
* время работы&lt;br /&gt;
* количество итераций слабо зависит от размера графа&lt;br /&gt;
* прост в понимании&lt;br /&gt;
Недостатками алгоритма являются:&lt;br /&gt;
* недетерминированность, то есть на одном и том же наборе входных данных при новом запуске результат может получиться отличным от предыдущего&lt;br /&gt;
* при некоторых входных данных может давать плохие решения&lt;br /&gt;
&lt;br /&gt;
В начальный момент времени каждой вершине приписана уникальная метка сообщества. Обновление меток вершин осуществляется по следующему принципу: у каждой вершины есть определенное число смежных вершин, которым приписаны метки каких-то сообществ, также у ребер между вершинами определены свои веса. На очередном шаге определим метку вершины &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. У соседей этой вершины метки сообществ, к которым они принадлежат, могут быть различными. Рассмотрим каждый тип меток. Для вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го типа считаем сумму весов ребер, которые соединяют эти вершины с изучаемой вершиной &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. Приписываем нашей вершине ту метку, для которой эта сумма оказалась максимальной. Итерации происходят до тех пор, пока меняются метки вершин. В стандартном алгоритме принято рассматривать вершины в случайном порядке, это позволяет улучшить метрику. Можно отказаться от переупорядочивания вершин для увеличения быстродействия вычислений. Также в параллельной версии программы потоки в рамках одного узла могут конкурировать, производить вычисления неравномерно, засчёт чего достигается эффект случайности в обработке вершин. &lt;br /&gt;
&lt;br /&gt;
Граф хранится как разреженная матрица смежности в формате CSR. &lt;br /&gt;
&lt;br /&gt;
Разбиваем мноество вершин на заданное число узлов. Каждый узел пересчитывает метки для своего набора вершин. Массивы меток для всех вершин синхронизируются с помощью операции MPI_Allgather.&lt;br /&gt;
&lt;br /&gt;
== Результаты работы алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Тестирование производилось на графах LFR (Lancichinetti-Fortunato-Radicchi), которые широко используются для анализа работы методов выделения сообществ в графах, так как являются хорошо приближенными к реальным моделям.&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{18}&amp;lt;/math&amp;gt;, средняя степень вершины 200.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 9.21499 s.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 4.37143 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 3.41528 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4&lt;br /&gt;
| 3.87224 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. Без OpenMP&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 68.7771 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 36.1929 s&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| 21.6286 s.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 1&lt;br /&gt;
| 23.8237 s.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Размер графа &amp;lt;math&amp;gt;2^{21}&amp;lt;/math&amp;gt;, средняя степень вершин 30. C OpenMP&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Число процессов&lt;br /&gt;
! Число потоков&lt;br /&gt;
! Время (с)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 4&lt;br /&gt;
| 21.5797 s.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 4&lt;br /&gt;
| 11.7228 s.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4&lt;br /&gt;
| 11.5657 s. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Алгоритм перестает масштабироваться, начиная с определенного момента, когда время синхронизации меток для вершин становится соразмерным с временем вычисления меток. Чем менье степень вершин, тем раньше алгоритм перестает масштабироваться.&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. &amp;quot;Lancichinetti-Fortunato-Radicchi Benchmark.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2015. Web. 13 November 2016 https://en.wikipedia.org/wiki/Lancichinetti-Fortunato-Radicchi_Benchmark&lt;br /&gt;
&lt;br /&gt;
2. &amp;quot;Help:Wiki markup.&amp;quot; Wikipedia, the free encyclopedia. 12 November 2016‎. Web. 13 November 2016 https://en.wikipedia.org/wiki/Help:Wiki_markup&lt;br /&gt;
&lt;br /&gt;
3. &amp;quot;Label Propagation Algorithm.&amp;quot; 9 November 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Label_Propagation_Algorithm&lt;br /&gt;
&lt;br /&gt;
4.  Спецкурс &amp;quot;Параллельная обработка больших графов&amp;quot; Лекция 4. к.т.н. Александр Сергеевич Семенов. 11 November 2016. Web. 13 November 2016. http://dislab.org/PLGP/PLGP_lecture4.pdf&lt;br /&gt;
&lt;br /&gt;
5. &amp;quot;Sparse matrix.&amp;quot; Wikipedia, the free encyclopedia. 30 October 2016‎. Web. 13 November 2016. https://en.wikipedia.org/wiki/Sparse_matrix&lt;br /&gt;
&lt;br /&gt;
6. А.С.Антонов &amp;quot;Параллельное программирование с использованием технологии MPI&amp;quot;.-М.: Изд-во МГУ, 2004.-71 с.&lt;br /&gt;
&lt;br /&gt;
7. &amp;quot;OpenMP 4.5 Specifications&amp;quot; Nov 2015. Web. http://www.openmp.org/wp-content/uploads/openmp-4.5.pdf&lt;/div&gt;</summary>
		<author><name>LanaLana</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=16665</id>
		<title>Алгоритм распространения констант для задачи поиска сообществ в социальном графе</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=16665"/>
		<updated>2016-11-13T13:47:39Z</updated>

		<summary type="html">&lt;p&gt;LanaLana: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
&lt;br /&gt;
[[file: Search-communities.jpg|thumb|right|200px|Рисунок 1. Пример разбиения на сообщества]]&lt;br /&gt;
&lt;br /&gt;
Рассматривается задача поиска сообществ в неориенетированном графе с весами, значение которых являются действительными неотрицательными числами.&lt;br /&gt;
&lt;br /&gt;
Дан граф &amp;lt;math&amp;gt; G = (V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V &amp;lt;/math&amp;gt; &amp;amp;mdash; множество вершин, &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; &amp;amp;mdash; множество ребер, &amp;lt;math&amp;gt; w (u, v) &amp;lt;/math&amp;gt; &amp;amp;mdash; вес каждого ребра &amp;lt;math&amp;gt; e(u, v) \in E, u, v \in V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Цель задачи &amp;amp;mdash; найти такое разбиение графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; на множество &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; непересекающихся сообществ вершин &amp;lt;math&amp;gt;c_i \subseteq V&amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; \cup c_i = V, \forall c_i \in C &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; c_i \cap c_j = \varnothing, \forall c_i, c_j \in C, i \neq j, &amp;lt;/math&amp;gt; чтобы максимизировать функционал модулярности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q = \sum_{c \in C} \left(\frac{\sum_{in}^{c}}{m} - \left[\frac{\sum{out}^{c}}{m} \right]^2\right)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt; \sum_{in}^{c} = \sum_{u, v \in c, e(u, v) \in E} w(u, v), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{out}^{c} = \sum_{in}^{c} + \sum_{u \in c, v \notin c, e(u, v) \in E} w(u, v)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; m = \sum_{e(u, v) \in E} w(u, v).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{in}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех внутренних рёбер сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{out}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех рёбер, исходящих из вершин сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; &amp;amp;mdash; нормализующий коэффициент, сумма весов рёбер графа.&lt;br /&gt;
Вершины одного сообщества должны быть сильно связаны, а вершины из разных сообществ должны быть слабо связаны.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
== Алгоритм решения==&lt;br /&gt;
&lt;br /&gt;
В качестве подхода к решению будем рассматривать алгоритм Label Propagation. К достоинствам данного алгоритма можно отнести следующие его аспекты:&lt;br /&gt;
* время работы&lt;br /&gt;
* количество итераций слабо зависит от размера графа&lt;br /&gt;
* прост в понимании&lt;br /&gt;
Недостатками алгоритма являются:&lt;br /&gt;
* недетерминированность, то есть на одном и том же наборе входных данных при новом запуске результат может получиться отличным от предыдущего&lt;br /&gt;
* при некоторых входных данных может давать плохие решения&lt;br /&gt;
&lt;br /&gt;
В начальный момент времени каждой вершине приписана уникальная метка сообщества. Обновление меток вершин осуществляется по следующему принципу: у каждой вершины есть определенное число смежных вершин, которым приписаны метки каких-то сообществ, также у ребер между вершинами определены свои веса. На очередном шаге определим метку вершины &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. У соседей этой вершины метки сообществ, к которым они принадлежат, могут быть различными. Рассмотрим каждый тип меток. Для вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го типа считаем сумму весов ребер, которые соединяют эти вершины с изучаемой вершиной &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. Приписываем нашей вершине ту метку, для которой эта сумма оказалась максимальной. Итерации происходят до тех пор, пока меняются метки вершин. В стандартном алгоритме принято рассматривать вершины в случайном порядке, это позволяет улучшить метрику. Можно отказаться от переупорядочивания вершин для увеличения быстродействия вычислений. Также в параллельной версии программы потоки в рамках одного узла могут конкурировать, производить вычисления неравномерно, засчёт чего достигается эффект случайности в обработке вершин. &lt;br /&gt;
&lt;br /&gt;
Граф хранится как разреженная матрица смежности в формате CSR. &lt;br /&gt;
&lt;br /&gt;
Разбиваем множество вершин на заданное число узлов. Каждый узел пересчитывает метки для своего набора вершин. Массивы меток для всех вершин синхронизируются с помощью операции MPI_Allgather.&lt;/div&gt;</summary>
		<author><name>LanaLana</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=16652</id>
		<title>Алгоритм распространения констант для задачи поиска сообществ в социальном графе</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2_%D0%B2_%D1%81%D0%BE%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=16652"/>
		<updated>2016-11-13T12:38:54Z</updated>

		<summary type="html">&lt;p&gt;LanaLana: Новая страница: «== Постановка задачи ==  file: Search-communities.jpg|thumb|right|200px|Рисунок 1. Пример разбиения на сообщест…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи ==&lt;br /&gt;
&lt;br /&gt;
[[file: Search-communities.jpg|thumb|right|200px|Рисунок 1. Пример разбиения на сообщества]]&lt;br /&gt;
&lt;br /&gt;
Рассматривается задача поиска сообществ в неориенетированном графе с весами, значение которых являются действительными неотрицательными числами.&lt;br /&gt;
&lt;br /&gt;
Дан граф &amp;lt;math&amp;gt; G = (V, E)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V &amp;lt;/math&amp;gt; &amp;amp;mdash; множество вершин, &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; &amp;amp;mdash; множество ребер, &amp;lt;math&amp;gt; w (u, v) &amp;lt;/math&amp;gt; &amp;amp;mdash; вес каждого ребра &amp;lt;math&amp;gt; e(u, v) \in E, u, v \in V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Цель задачи &amp;amp;mdash; найти такое разбиение графа &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; на множество &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; непересекающихся сообществ вершин &amp;lt;math&amp;gt;c_i \subseteq V&amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; \cup c_i = V, \forall c_i \in C &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; c_i \cap c_j = \varnothing, \forall c_i, c_j \in C, i \neq j, &amp;lt;/math&amp;gt; чтобы максимизировать функционал модулярности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q = \sum_{c \in C} \left(\frac{\sum_{in}^{c}}{m} - \left[\frac{\sum{out}^{c}}{m} \right]^2\right)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt; \sum_{in}^{c} = \sum_{u, v \in c, e(u, v) \in E} w(u, v), &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{out}^{c} = \sum_{in}^{c} + \sum_{u \in c, v \notin c, e(u, v) \in E} w(u, v)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; m = \sum_{e(u, v) \in E} w(u, v).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{in}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех внутренних рёбер сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{out}^{c} &amp;lt;/math&amp;gt; &amp;amp;mdash; сумма весов всех рёбер, исходящих из вершин сообщества.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; &amp;amp;mdash; нормализующий коэффициент, сумма весов рёбер графа.&lt;br /&gt;
Вершины одного сообщества должны быть сильно связаны, а вершины из разных сообществ должны быть слабо связаны.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
== Алгоритм решения==&lt;br /&gt;
&lt;br /&gt;
В качестве подхода к решению будем рассматривать алгоритм Label Propagation. К достоинствам данного алгоритма можно отнести следующие его аспекты:&lt;br /&gt;
* время работы&lt;br /&gt;
* количество итераций слабо зависит от размера графа&lt;br /&gt;
* прост в понимании&lt;br /&gt;
Недостатками алгоритма являются:&lt;br /&gt;
* недетерминированность, то есть на одном и том же наборе входных данных при новом запуске результат может получиться отличным от предыдущего&lt;br /&gt;
* при некоторых входных данных может давать плохие решения&lt;br /&gt;
&lt;br /&gt;
В начальный момент времени каждой вершине приписана уникальная метка сообщества. Обновление меток вершин осуществляется по следующему принципу: у каждой вершины есть определенное число смежных вершин, которым приписаны метки каких-то сообществ, также у ребер между вершинами определены свои веса. На очередном шаге определим метку вершины &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. У соседей этой вершины метки сообществ, к которым они принадлежат, могут быть различными. Рассмотрим каждый тип меток. Для вершин &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го типа считаем сумму весов ребер, которые соединяют эти вершины с изучаемой вершиной &amp;lt;math&amp;gt;current&amp;lt;/math&amp;gt;. Приписываем нашей вершине ту метку, для которой эта сумма оказалась максимальной. Итерации происходят до тех пор, пока меняются метки вершин. В стандартном алгоритме принято рассматривать вершины в случайном порядке, это позволяет улучшить метрику. Можно отказаться от переупорядочивания вершин для увеличения быстродействия вычислений. Также в параллельной версии программы потоки в рамках одного узла могут конкурировать, производить вычисления неравномерно, засчёт чего достигается эффект случайности в обработке вершин. &lt;br /&gt;
&lt;br /&gt;
Граф хранится как разреженная матрица смежности в формате CSR. &lt;br /&gt;
&lt;br /&gt;
Разбиваем множество вершин на заданное число узлов.&lt;/div&gt;</summary>
		<author><name>LanaLana</name></author>
	</entry>
</feed>