Skip to content

Commit 8408839

Browse files
committed
BFS в терминах линейной алгебры. Заготовка.
1 parent c22f6c4 commit 8408839

File tree

5 files changed

+172
-4
lines changed

5 files changed

+172
-4
lines changed

tex/FormalLanguageConstrainedReachabilityLectureNotes.bib

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1478,3 +1478,21 @@ @book{Courcelle2009
14781478
}
14791479

14801480
@INPROCEEDINGS{9286186, author={Elekes, Márton and Nagy, Attila and Sándor, Dávid and Antal, János Benjamin and Davis, Timothy A. and Szárnyas, Gábor}, booktitle={2020 IEEE High Performance Extreme Computing Conference (HPEC)}, title={A GraphBLAS solution to the SIGMOD 2014 Programming Contest using multi-source BFS}, year={2020}, volume={}, number={}, pages={1-7}, doi={10.1109/HPEC43674.2020.9286186}}
1481+
1482+
@inproceedings{10.1145/3315454.3329962,
1483+
author = {Spampinato, Daniele G. and Sridhar, Upasana and Low, Tze Meng},
1484+
title = {Linear Algebraic Depth-First Search},
1485+
year = {2019},
1486+
isbn = {9781450367172},
1487+
publisher = {Association for Computing Machinery},
1488+
address = {New York, NY, USA},
1489+
url = {https://doi.org/10.1145/3315454.3329962},
1490+
doi = {10.1145/3315454.3329962},
1491+
abstract = {There is a recent push by a segment of the graph community to implement graph algorithms in the language of linear algebra. However, graph algorithms that depend on depth-first search (DFS) techniques are often highlighted as limitations of the linear algebraic approach as linear algebraic formulation of DFS algorithms are few, if any. This paper provides a linear algebraic approach for developing DFS graph algorithms and demonstrates its use for defining three classical DFS-based computations: Binary tree traversal, topological sort, and biconnected components.},
1492+
booktitle = {Proceedings of the 6th ACM SIGPLAN International Workshop on Libraries, Languages and Compilers for Array Programming},
1493+
pages = {93–104},
1494+
numpages = {12},
1495+
keywords = {post-order traversal, pre-order traversal, topological sort, biconnected components, depth-first search, adjacency matrix, graph algorithms, linear algebra, permutations},
1496+
location = {Phoenix, AZ, USA},
1497+
series = {ARRAY 2019}
1498+
}

tex/GraphTheoryIntro.tex

Lines changed: 97 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,28 +175,121 @@ \section{Основные определения}
175175

176176
Таким образом, уже можно заметить, что введение моноида как абстракции позволяет достаточно унифицированным образом смотреть на различные графы и их матрицы смежности. Далее мы увидим, что данный путь позволит решать унифицированным образом достаточно широкий круг задач, связанных с анализом путей в графах. Но сперва мы сформулируем различные варианты задачи поиска путей в графе. % Это необходимо для формулировки задач, на решение которых мы в конечном итоге нацелены.
177177

178+
178179
\section{Обход графа в ширину}
179180

180-
Обход графа в ширину --- это одна из фундаментальных задач анализа графов, для решения которой существует соответствующий алгоритм, изложенный в классической литературе (см., например,~\cite{} или ~\cite{}).
181+
Обход графа в ширину (Breadth-First Search, BFS) --- это одна из фундаментальных задач анализа графов, для решения которой существует соответствующий алгоритм, изложенный в классической литературе (подробнее, например, в~\cite{} или ~\cite{}).
182+
Данный алгоритм является основой для многих алгоритмов поиска в графе.
181183

182-
В общих чертах, задача заключается в том, чтобы начиная с некоторой вершины графа (источника) обойти все достижимые из неё вершины в некотором порядке. Шаг --- просмотр все смежных. И так для всего фронта. Главное не посещать одну и ту же вершину несколько раз.
184+
В общих чертах, задача заключается в том, чтобы начиная с некоторой заданной вершины графа (источника) обойти все достижимые из неё вершины в некотором порядке.
185+
Шаг --- просмотр все смежных. И так для всего фронта. Главное не посещать одну и ту же вершину несколько раз.
183186

184187
Псевдокод классического алгоритма
185188

186189
Пример.
187190

188-
Алгоритм обхода в ширину может быть переформулирован в терминах матрично-векторных операций. Решение через линейную алгебру.
191+
Алгоритм обхода в ширину может быть переформулирован в терминах матрично-векторных операций следующим образом\footnote{
192+
Стоит отметить, что ситуация со не менее известным обходом в глубину (Depth-First Search, DFS) более сложная:
193+
на момент написания текста не известно естественного выражения данного обхода в терминах линейной алгебры.
194+
Доказательство невозможности такого построения также не предъявлены.
195+
При этом, решения для частных случаев (деревья, ориентированные графы без циклов) предложены, например, в работе~\cite{10.1145/3315454.3329962}}.
196+
Пусть фронт --- вектор размера $n$, а сам граф представлен матрицей смежности.
197+
Тогда один шаг --- получение нового фронта --- это умножение текущего фронта на матрицу смежности.
198+
Для того, чтобы отслеживать посещённые вершины нужна маска.
189199

190200
Псевдокод алгоритма на ЛА
191201

192-
Пример.
202+
\begin{example}
203+
204+
В качестве примера рассмотрим обход в ширину графа из примера~\ref{example:diGraph} начиная с вершины 2.
205+
Для обозначения текущего фронта будем использовать зелёный цвет, а для достижимых из него за один шаг --- жёлтый.
206+
207+
\begin{tabular}[t]{c | c }
208+
\input{figures/graph/graph_BFS_1.tex}
209+
&
210+
\begin{minipage}{0.7\textwidth}
211+
$
212+
\text{visited} =
213+
\begin{pmatrix}
214+
0 & 0 & 0 & 0
215+
\end{pmatrix}
216+
$
217+
\\
218+
$
219+
\begin{pmatrix}
220+
0 & 0 & 1 & 0
221+
\end{pmatrix}
222+
\begin{pmatrix}
223+
0 & 1 & 0 & 0 \\
224+
0 & 0 & 1 & 0 \\
225+
1 & 0 & 0 & 1 \\
226+
0 & 0 & 1 & 0
227+
\end{pmatrix} =
228+
\begin{pmatrix}
229+
1 & 0 & 0 & 1
230+
\end{pmatrix}
231+
$
232+
\\
233+
$
234+
\text{new\_front} =
235+
\begin{pmatrix}
236+
1 & 0 & 0 & 1
237+
\end{pmatrix}
238+
\begin{pmatrix}
239+
0 & 0 & 0 & 0
240+
\end{pmatrix}
241+
=
242+
\begin{pmatrix}
243+
1 & 0 & 0 & 1
244+
\end{pmatrix}
245+
$
246+
\end{minipage}
247+
\\ \hline
248+
\input{figures/graph/graph_BFS_2.tex}
249+
&
250+
$
251+
\begin{pmatrix}
252+
1 & 0 & 0 & 1
253+
\end{pmatrix}
254+
\begin{pmatrix}
255+
0 & 1 & 0 & 0 \\
256+
0 & 0 & 1 & 0 \\
257+
1 & 0 & 0 & 1 \\
258+
0 & 0 & 1 & 0
259+
\end{pmatrix} =
260+
\begin{pmatrix}
261+
0 & 1 & 1 & 0
262+
\end{pmatrix}
263+
$
264+
\\ \hline
265+
\input{figures/graph/graph_BFS_3.tex}
266+
&
267+
$
268+
\begin{pmatrix}
269+
0 & 1 & 0 & 0
270+
\end{pmatrix}
271+
\begin{pmatrix}
272+
0 & 1 & 0 & 0 \\
273+
0 & 0 & 1 & 0 \\
274+
1 & 0 & 0 & 1 \\
275+
0 & 0 & 1 & 0
276+
\end{pmatrix} =
277+
\begin{pmatrix}
278+
0 & 0 & 1 & 0
279+
\end{pmatrix}
280+
$
281+
\end{tabular}
282+
283+
\end{example}
284+
193285

194286
multiple-source BFS. Тот же обход в ширину, только источников несколько и надо помнить, какая из вершин из какого источника достижима. Постановка задачи. Решение через линейную алгебру~\cite{9286186} Уже не вектор, а матрица: храним информацию про каждую стартовую вершину отдельно.
195287

196288
Псевдокод алгоритма на ЛА
197289

198290
Пример.
199291

292+
200293
\section{Задачи поиска путей}
201294

202295
Одна из классических задач анализа графов --- это задача поиска путей между вершинами с различными ограничениями.

tex/figures/graph/graph_BFS_1.tex

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
\begin{tikzpicture}[]
2+
% Apex angle 60 degrees
3+
\node[isosceles triangle,
4+
isosceles triangle apex angle=60,
5+
draw=none,fill=none,
6+
minimum size=2cm] (T60) at (3,0){};
7+
8+
9+
\node[state,fill=yellow] (q_0) at (T60.right corner) {$0$};
10+
\node[state] (q_1) at (T60.left corner) {$1$};
11+
\node[state,fill=green] (q_2) at (T60.apex) {$2$};
12+
\node[state,fill=yellow] (q_3) [right=1.5cm of q_2] {$3$};
13+
\path[->]
14+
(q_0) edge (q_1)
15+
(q_1) edge (q_2)
16+
(q_2) edge (q_0)
17+
(q_2) edge [bend left] (q_3)
18+
(q_3) edge [bend left] (q_2);
19+
\end{tikzpicture}

tex/figures/graph/graph_BFS_2.tex

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
\begin{tikzpicture}[]
2+
% Apex angle 60 degrees
3+
\node[isosceles triangle,
4+
isosceles triangle apex angle=60,
5+
draw=none,fill=none,
6+
minimum size=2cm] (T60) at (3,0){};
7+
8+
9+
\node[state,fill=green] (q_0) at (T60.right corner) {$0$};
10+
\node[state,fill=yellow] (q_1) at (T60.left corner) {$1$};
11+
\node[state,fill=yellow, draw=red] (q_2) at (T60.apex) {$2$};
12+
\node[state,fill=green] (q_3) [right=1.5cm of q_2] {$3$};
13+
\path[->]
14+
(q_0) edge (q_1)
15+
(q_1) edge (q_2)
16+
(q_2) edge (q_0)
17+
(q_2) edge [bend left] (q_3)
18+
(q_3) edge [bend left] (q_2);
19+
\end{tikzpicture}

tex/figures/graph/graph_BFS_3.tex

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
\begin{tikzpicture}[]
2+
% Apex angle 60 degrees
3+
\node[isosceles triangle,
4+
isosceles triangle apex angle=60,
5+
draw=none,fill=none,
6+
minimum size=2cm] (T60) at (3,0){};
7+
8+
9+
\node[state] (q_0) at (T60.right corner) {$0$};
10+
\node[state,fill=green] (q_1) at (T60.left corner) {$1$};
11+
\node[state,fill=yellow, draw=red] (q_2) at (T60.apex) {$2$};
12+
\node[state] (q_3) [right=1.5cm of q_2] {$3$};
13+
\path[->]
14+
(q_0) edge (q_1)
15+
(q_1) edge (q_2)
16+
(q_2) edge (q_0)
17+
(q_2) edge [bend left] (q_3)
18+
(q_3) edge [bend left] (q_2);
19+
\end{tikzpicture}

0 commit comments

Comments
 (0)