Skip to content

Commit 5653316

Browse files
authored
Merge pull request #16 from bahbyega/bahbyega_dev
Примеры для Multiple Source RPQ
2 parents 9288391 + d08f3e7 commit 5653316

File tree

2 files changed

+210
-0
lines changed

2 files changed

+210
-0
lines changed

tex/LinearAlgebra.tex

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,24 @@ \section{Матрицы и вектора}
411411
$$
412412
\end{example}
413413

414+
415+
\begin{definition}[Прямая сумма матриц]
416+
Пусть даны матрицы $M_{n_1\times m_1}$ и $N_{n_2\times m_2}$. Тогда \emph{прямой суммой} этих матриц называется матрица $L_{n_1+n_2 \times m_1+m_2}$ вида
417+
$$
418+
L =
419+
\left[
420+
\begin{matrix}
421+
M & 0 \\
422+
0 & N
423+
\end{matrix}
424+
\right]
425+
$$
426+
427+
Где 0 обозначает нулевой блок. Прямая сумма обозначается $L = M \bigoplus N$.
428+
429+
\end{definition}
430+
431+
414432
\begin{definition}[Взятие подматрицы]
415433
Пусть дана матрица $M_{n\times m}$. Тогда
416434
$

tex/RPQ.tex

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,198 @@ \section{Достижимость с несколькими источникам
1212

1313
Достижимость от нескольких стартовых вершин через обход в ширину, основанный на линейной алгебре~\cite{9286186}.
1414

15+
В классической версии обхода в ширину, основанного на линейной алгебре, используется вектор, куда записывается фронт обхода графа. Так, один раз перемножая этот вектор на матрицу смежности графа, можно совершать один шаг в обходе графа. Покажем на примере, как данный метод может быть использован, когда мы накладываем формальные ограничения на путь в графе.
16+
17+
\begin{example}
18+
Возьмём граф.
19+
\begin{center}
20+
\label{input_rpq}
21+
\begin{tikzpicture}[node distance=2cm,shorten >=1pt,on grid,auto]
22+
\node[state] (q_0) {$0$};
23+
\node[state] (q_1) [above=of q_0] {$1$};
24+
\node[state] (q_2) [right=of $(q_0)!0.5!(q_1)$] {$2$};
25+
\node[state] (q_3) [right=of q_2] {$3$};
26+
\path[->]
27+
(q_0) edge node {a} (q_1)
28+
(q_1) edge node[pos=0.3] {a} (q_2)
29+
(q_2) edge node[pos=0.7] {a} (q_0)
30+
(q_2) edge[bend left] node[above] {b} (q_3)
31+
(q_3) edge[bend left] node {b} (q_2);
32+
\end{tikzpicture}
33+
\end{center}
34+
35+
Его матрица смежности имеет следующий вид.
36+
\[ G_2 =
37+
\begin{pmatrix}
38+
. & [a] & . & . \\
39+
. & . & [a] & . \\
40+
[a] & . & . & [b] \\
41+
. & . & [b] & .
42+
\end{pmatrix}
43+
\]
44+
45+
Или, если представить её в булевом виде.
46+
\begin{alignat*}{7}
47+
& &&G_{0\_A} &&= \begin{pmatrix}
48+
0 & 1 & 0 & 0 \\
49+
0 & 0 & 1 & 0 \\
50+
1 & 0 & 0 & 0 \\
51+
0 & 0 & 0 & 0 \\
52+
\end{pmatrix} \ \ \ \ &&G_{0\_B} &&= \begin{pmatrix}
53+
0 & 0 & 0 & 0 \\
54+
0 & 0 & 0 & 0 \\
55+
0 & 0 & 0 & 1 \\
56+
0 & 0 & 1 & 0 \\
57+
\end{pmatrix}
58+
\end{alignat*}
59+
60+
Зададим формальные ограничения с помощью регулярного выражения $ba$, которое представляется автоматом из трех последовательных состояний.
61+
62+
\begin{center}
63+
\begin{tikzpicture}[shorten >=1pt,on grid,auto]
64+
\node[state, initial] (q_0) at (0,0) {$0$};
65+
\node[state] (q_1) at (2,0) {$1$};
66+
\node[state, accepting] (q_2) at (4,0) {$2$};
67+
\path[->]
68+
(q_0) edge node {$b$} (q_1)
69+
(q_1) edge node {$a$} (q_2);
70+
\end{tikzpicture}
71+
\end{center}
72+
73+
74+
Нам хочется совершать обход по графу и автомату одновременно, поэтому также представим автомат в булевом виде.
75+
\begin{alignat*}{7}
76+
& &&R_{0\_A} &&= \begin{pmatrix}
77+
0 & 0 & 0 \\
78+
0 & 0 & 0 \\
79+
0 & 1 & 0
80+
\end{pmatrix} \ \ \ \ &&R_{0\_B} &&= \begin{pmatrix}
81+
0 & 0 & 0 \\
82+
1 & 0 & 0 \\
83+
0 & 0 & 0
84+
\end{pmatrix}
85+
\end{alignat*}
86+
87+
Для синхронизации обхода составим блочно---диагональную матрицу как прямую сумму матриц $R_{0\_A}$, $G_{0\_A}$ и $R_{0\_B}$, $G_{0\_B}$ соответственно.
88+
\begin{alignat*}{7}
89+
& &&D_{0\_A} &&= \begin{pmatrix}
90+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
91+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
92+
0 & 1 & 0 & 0 & 0 & 0 & 0 \\
93+
0 & 0 & 0 & 0 & 1 & 0 & 0 \\
94+
0 & 0 & 0 & 0 & 0 & 1 & 0 \\
95+
0 & 0 & 0 & 1 & 0 & 0 & 0 \\
96+
0 & 0 & 0 & 0 & 0 & 0 & 0
97+
\end{pmatrix} \ \ \ \ &&D_{0\_B} &&= \begin{pmatrix}
98+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
99+
1 & 0 & 0 & 0 & 0 & 0 & 0 \\
100+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
101+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
102+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
103+
0 & 0 & 0 & 0 & 0 & 0 & 1 \\
104+
0 & 0 & 0 & 0 & 0 & 1 & 0
105+
\end{pmatrix}
106+
\end{alignat*}
107+
108+
Допустим, что стартовыми вершинами в графе будут выбраны вершины 0 и 3.
109+
Теперь создадим вектор $v = $ \fbox{1 1 1} \fbox{1 0 0 1}, где в первой части стоят три единицы, соответствующие каждому состоянию автомата, в котором мы можем находиться. Во второй части содержится фронт обхода графа, на данном шаге это стартовые вершины.
110+
111+
Получим новый фронт.
112+
\begin{alignat*}{7}
113+
& \begin{matrix}
114+
\fbox{1 1 1} \fbox{1 0 0 1}
115+
\end{matrix} && \begin{pmatrix}
116+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
117+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
118+
0 & 1 & 0 & 0 & 0 & 0 & 0 \\
119+
0 & 0 & 0 & 0 & 1 & 0 & 0 \\
120+
0 & 0 & 0 & 0 & 0 & 1 & 0 \\
121+
0 & 0 & 0 & 1 & 0 & 0 & 0 \\
122+
0 & 0 & 0 & 0 & 0 & 0 & 0
123+
\end{pmatrix} &&= \begin{matrix}
124+
\fbox{0 1 0} \fbox{0 1 0 0}
125+
\end{matrix}
126+
\end{alignat*}
127+
128+
\begin{alignat*}{7}
129+
& \begin{matrix}
130+
\fbox{1 1 1} \fbox{1 0 0 1}
131+
\end{matrix} && \begin{pmatrix}
132+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
133+
1 & 0 & 0 & 0 & 0 & 0 & 0 \\
134+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
135+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
136+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
137+
0 & 0 & 0 & 0 & 0 & 0 & 1 \\
138+
0 & 0 & 0 & 0 & 0 & 1 & 0
139+
\end{pmatrix} &&= \begin{matrix}
140+
\fbox{1 0 0} \fbox{0 0 1 0}
141+
\end{matrix}
142+
\end{alignat*}
143+
144+
Тем самым, \fbox{0 1 0} \fbox{0 1 0 0} + \fbox{1 0 0} \fbox{0 0 1 0} = \fbox{1 1 0} \fbox{0 1 1 0}. То есть в наш фронт \fbox{0 1 1 0} попали вершины 1 и 2.
145+
Однако вершина 1 лишняя, так как на первом шаге мы должны были пройти только по ребрам с меткой $b$. Это произошло, потому что в векторе $v$ не хранится информация о текущем состоянии в автомате.
146+
147+
Для этого в разработанном алгоритме предлагается расклеить $v$ в матрицу из трех векторов.
148+
\begin{alignat*}{7}
149+
& &&M &&=\begin{matrix}
150+
\fbox{1 0 0} \fbox{1 0 0 1} \\
151+
\fbox{0 1 0} \fbox{1 0 0 1} \\
152+
\fbox{0 0 1} \fbox{1 0 0 1}
153+
\end{matrix}
154+
\end{alignat*}
155+
156+
И совершать обход следующим образом.
157+
\begin{alignat*}{7}
158+
& \begin{matrix}
159+
\fbox{1 0 0} \fbox{1 0 0 1} \\
160+
\fbox{0 1 0} \fbox{1 0 0 1} \\
161+
\fbox{0 0 1} \fbox{1 0 0 1}
162+
\end{matrix} && \begin{pmatrix}
163+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
164+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
165+
0 & 1 & 0 & 0 & 0 & 0 & 0 \\
166+
0 & 0 & 0 & 0 & 1 & 0 & 0 \\
167+
0 & 0 & 0 & 0 & 0 & 1 & 0 \\
168+
0 & 0 & 0 & 1 & 0 & 0 & 1 \\
169+
0 & 0 & 0 & 0 & 0 & 1 & 0
170+
\end{pmatrix} &&= \begin{matrix}
171+
\fbox{0 0 0} \fbox{0 1 0 0} \\
172+
\fbox{0 0 0} \fbox{0 1 0 0} \\
173+
\fbox{0 1 0} \fbox{0 1 0 0}
174+
\end{matrix}
175+
\end{alignat*}
176+
177+
\begin{alignat*}{7}
178+
& \begin{matrix}
179+
\fbox{1 0 0} \fbox{1 0 0 1} \\
180+
\fbox{0 1 0} \fbox{1 0 0 1} \\
181+
\fbox{0 0 1} \fbox{1 0 0 1}
182+
\end{matrix} && \begin{pmatrix}
183+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
184+
1 & 0 & 0 & 0 & 0 & 0 & 0 \\
185+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
186+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
187+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
188+
0 & 0 & 0 & 0 & 0 & 0 & 1 \\
189+
0 & 0 & 0 & 0 & 0 & 1 & 0
190+
\end{pmatrix} &&= \begin{matrix}
191+
\fbox{0 0 0} \fbox{0 0 1 0} \\
192+
\fbox{1 0 0} \fbox{0 0 1 0} \\
193+
\fbox{0 0 0} \fbox{0 0 1 0}
194+
\end{matrix}
195+
\end{alignat*}
196+
\end{example}
197+
198+
Видно, что к вершине 2 можно прийти из нулевого состояния автомата \fbox{1 0 0} \fbox{0 0 1 0}, а к вершине 1 из первого \fbox{0 1 0} \fbox{0 1 0 0}.
199+
200+
Теперь левая часть матрицы $M$ неизменяема, так как каждая её строчка содержит информацию о том, из какого состояния автомата достигаются вершины фронта.
201+
Правая часть матрицы $M$ содержит этот фронт.e
202+
203+
204+
Перейдем к формальному описанию алгоритма.
205+
206+
15207
Алгоритм принимает на вход граф $\mathcal{G}$, детерминированный конечный автомат $\mathcal{R}$, описывающий регулярную грамматику, и множество начальных вершин $V_{src}$ графа.
16208

17209
Граф $\mathcal{G}$ и автомат $\mathcal{R}$ можно представить в виде булевых матриц смежности. Так, в виде словаря для каждой метки графа заводится булева матрица смежности, на месте $(i, j)$ ячейки которой стоит 1, если $i$ и $j$ вершины графа соединены ребром данной метки. Такая же операция проводится для автомата грамматики $\mathcal{R}$.

0 commit comments

Comments
 (0)