Skip to content

Commit 3ca2cff

Browse files
committed
Auto stash before merge of "dev" and "origin/dev"
1 parent 72915de commit 3ca2cff

File tree

2 files changed

+54
-230
lines changed

2 files changed

+54
-230
lines changed

tex/Project.tex

Whitespace-only changes.

tex/RPQ.tex

Lines changed: 54 additions & 230 deletions
Original file line numberDiff line numberDiff line change
@@ -128,235 +128,25 @@ \section{Достижимость с несколькими источникам
128128
1 & 0 & 0 & 0 & 0 & 0 & 0 \\
129129
0 & 0 & 1 & 0 & 0 & 0 & 0 \\
130130
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
131-
\hline
132-
0 & 0 & 0 & 0 & 0 & 0 & 1 \\
133-
0 & 0 & 0 & 0 & 0 & 1 & 0 \\
134-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
135-
0 & 0 & 0 & 1 & 0 & 0 & 0
136-
\end{array}\right)
137-
\end{alignat*}
138-
139-
Пусть мы решаем частный случай задачи достижимости с несколькими стартовыми вершинами (multiple--source)
140-
--- достижимость с одной стартовой вершиной (single--source).
141-
142-
Пусть единственной начальной вершиной в графе будет вершина $0$.
143-
144-
Теперь создадим вектор $v = $ $\fbox{1 0 0} \fbox{1 0 0 0}$, где в первой части стоит единица на месте начального состояния $0$ в автомате.
145-
Во второй части содержится фронт обхода графа, на первом шаге это всегда множество стартовых вершин. В данном случае единица стоит на месте
146-
единственной стартовой вершины --- $0$.
147-
148-
Совершим один шаг в обходе графа и получим новый фронт обхода графа.
149-
\begin{alignat*}{7}
150-
a:\,\,
151-
& \begin{matrix}
152-
\fbox{1 0 0} \fbox{1 0 0 0}
153-
\end{matrix} &&
154-
\times
155-
\left(\begin{array}{c c c | c c c c}
156-
0 & 1 & 0 & 0 & 0 & 0 & 0 \\
157-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
158-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
159-
\hline
160-
0 & 0 & 0 & 0 & 1 & 0 & 0 \\
161-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
162-
0 & 0 & 0 & 1 & 0 & 0 & 0 \\
163-
0 & 0 & 0 & 0 & 0 & 0 & 0
164-
\end{array}\right)
165-
&&= \begin{matrix}
166-
\fbox{0 1 0} \fbox{0 1 0 0}
167-
\end{matrix}
168-
\end{alignat*}
169-
170-
\begin{alignat*}{7}
171-
b:\,\,
172-
& \begin{matrix}
173-
\fbox{1 0 0} \fbox{1 0 0 0}
174-
\end{matrix} &&
175-
\times
176-
\left(\begin{array}{c c c | c c c c}
177-
1 & 0 & 0 & 0 & 0 & 0 & 0 \\
178131
0 & 0 & 1 & 0 & 0 & 0 & 0 \\
179132
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
180-
\hline
181-
0 & 0 & 0 & 0 & 0 & 0 & 1 \\
182-
0 & 0 & 0 & 0 & 0 & 1 & 0 \\
183-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
184-
0 & 0 & 0 & 1 & 0 & 0 & 0
185-
\end{array}\right)
186-
&&= \begin{matrix}
187-
\fbox{1 0 0} \fbox{0 0 0 1}
188-
\end{matrix}
189-
\end{alignat*}
190-
191-
Сложим два полученных вектора, чтобы получить новый фронт обхода графа: $\fbox{0 1 0} \fbox{0 1 0 0}$ + $\fbox{1 0 0} \fbox{0 0 0 1} = \fbox{1 1 0} \fbox{0 1 0 1}$.
192-
193-
То есть в наш фронт \fbox{0 1 0 1} попали вершины 1 и 3 соотвественно. А именно, мы совершили следующие переходы в графе и автомате.
194-
195-
\begin{alignat*}{7}
196-
\begin{tikzpicture}[node distance=2cm,shorten >=1pt,on grid,auto]
197-
\node[state, red] (q_0) {$1$};
198-
\node[state] (q_1) [above=of q_0] {$2$};
199-
\node[state] (q_2) [right=of $(q_0)!0.5!(q_1)$] {$0$};
200-
\node[state, red] (q_3) [right=of q_2] {$3$};
201-
\path[->, red]
202-
(q_2) edge node[pos=0.7] {a} (q_0)
203-
(q_2) edge[bend left] node[above] {b} (q_3);
204-
\path[->]
205-
(q_0) edge node {b} (q_1)
206-
(q_1) edge node[pos=0.3] {a} (q_2)
207-
(q_3) edge[bend left] node {b} (q_2);
208-
\end{tikzpicture}
209-
&\hspace{20px}
210-
\begin{tikzpicture}[shorten >=1pt,on grid,auto]
211-
\node[state, draw=none] (q_3) at (0,0) {$$}; % empty node for alignment
212-
\node[state, initial, red] (q_0) at (0,1) {$0$};
213-
\node[state, red] (q_1) at (2,1) {$1$};
214-
\node[state, accepting] (q_2) at (4,1) {$2$};
215-
\path[->, red]
216-
(q_0) edge node {$a$} (q_1);
217-
\path[->]
218-
(q_1) edge node {$b$} (q_2);
219-
\draw (q_0) edge[loop above, red] node {$b$} (q_0);
220-
\end{tikzpicture}
221-
\end{alignat*}
222-
223-
Совершим еще один шаг алгоритма. Теперь вектор $v$, на который мы умножаем матрицы, имеет следующий вид $\fbox{1 1 0} \fbox{0 1 0 1}$.
224-
225-
\begin{alignat*}{7}
226-
a:\,\,
227-
& \begin{matrix}
228-
\fbox{1 1 0} \fbox{0 1 0 1}
229-
\end{matrix} &&
230-
\times
231-
\left(\begin{array}{c c c | c c c c}
232-
0 & 1 & 0 & 0 & 0 & 0 & 0 \\
233-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
234-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
235-
\hline
236-
0 & 0 & 0 & 0 & 1 & 0 & 0 \\
237-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
238-
0 & 0 & 0 & 1 & 0 & 0 & 0 \\
239-
0 & 0 & 0 & 0 & 0 & 0 & 0
240-
\end{array}\right)
241-
&&= \begin{matrix}
242-
\fbox{0 1 0} \fbox{0 0 0 0}
243-
\end{matrix}
244-
\end{alignat*}
245-
246-
\begin{alignat*}{7}
247-
b:\,\,
248-
& \begin{matrix}
249-
\fbox{1 1 0} \fbox{0 1 0 1}
250-
\end{matrix} &&
251-
\times
252-
\left(\begin{array}{c c c | c c c c}
253-
1 & 0 & 0 & 0 & 0 & 0 & 0 \\
254-
0 & 0 & 1 & 0 & 0 & 0 & 0 \\
255-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
256-
\hline
257-
0 & 0 & 0 & 0 & 0 & 0 & 1 \\
258-
0 & 0 & 0 & 0 & 0 & 1 & 0 \\
259-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
260-
0 & 0 & 0 & 1 & 0 & 0 & 0
261-
\end{array}\right)
262-
&&= \begin{matrix}
263-
\fbox{1 0 1} \fbox{1 0 1 0}
264-
\end{matrix}
265-
\end{alignat*}
266-
267-
$\fbox{0 1 0} \fbox{0 0 0 0}$ + $\fbox{1 0 1} \fbox{1 0 1 0} = \fbox{1 1 1} \fbox{1 0 1 0}$.
268-
То есть в наш фронт \fbox{1 0 1 0} попали вершины 0 и 2 соотвественно. Мы совершили следующие переходы в графе и автомате.
269-
270-
\begin{alignat*}{7}
271-
\begin{tikzpicture}[node distance=2cm,shorten >=1pt,on grid,auto]
272-
\node[state, gray] (q_0) {$1$};
273-
\node[state, teal] (q_1) [above=of q_0] {$2$};
274-
\node[state, teal] (q_2) [right=of $(q_0)!0.5!(q_1)$] {$0$};
275-
\node[state, gray] (q_3) [right=of q_2] {$3$};
276-
\path[->, gray]
277-
(q_2) edge node[pos=0.7] {a} (q_0)
278-
(q_2) edge[bend left] node[above] {b} (q_3);
279-
\path[->, red]
280-
(q_0) edge node {b} (q_1)
281-
(q_3) edge[bend left] node {b} (q_2);
282-
\path[->]
283-
(q_1) edge node[pos=0.3] {a} (q_2);
284-
\end{tikzpicture}
285-
&\hspace{20px}
286-
\begin{tikzpicture}[shorten >=1pt,on grid,auto]
287-
\node[state, draw=none] (q_3) at (0,0) {$$}; % empty node for alignment
288-
\node[state, initial, red] (q_0) at (0,1) {$0$};
289-
\node[state, gray] (q_1) at (2,1) {$1$};
290-
\node[state, accepting, teal] (q_2) at (4,1) {$2$};
291-
\path[->, gray]
292-
(q_0) edge node {$a$} (q_1);
293-
\path[->, red]
294-
(q_1) edge node {$b$} (q_2);
295-
\draw (q_0) edge[loop above, red] node {$b$} (q_0);
296-
\end{tikzpicture}
297-
\end{alignat*}
298-
299-
При этом, можно заметить, что мы достигли конечной вершины в автомате. Последний элемент левой части результирующего
300-
вектора $\fbox{1 1 \textcolor{red}{1}} \fbox{1 0 1 0}$ отвечает за состояние 2, которое является конечным. А значит, обход необходимо остановить, и текущие вершины фронта
301-
обхода графа записать в ответ.
302-
303-
Таким образом, вершины графа 0 и 2 являются ответом. Однако вершина 0 --- лишняя. Регулярное выражение $b^*ab$ не подразумевает, что
304-
вершина 0 в графе может быть достигнута. Она могла бы быть достигнута по пустой строке в случае, если бы регулярное выражение имело вид $b^*$ или
305-
по строке $aba$ в случае, если бы регулярное выражение имело вид $b^*aba$.
306-
307-
Это произошло, потому что в векторе $v$ должна кодироваться информация о паре --- вершине графа и состоянии автомата.
308-
Достигнув вершины 0, мы оказались в конечном состоянии автомата, которое было получено с помощью другой вершины --- вершины 2.
309-
310-
Эту проблему можно решить, закодировав информацию о каждой такой паре в несколько векторов $v$, и ограничив левую
311-
часть вектора $v$ таким образом, чтобы в ней всегда была лишь одна единица.
312-
313-
Тогда мы получим, что вектор $v$ вида $\fbox{1 0 0} \fbox{1 0 1 0}$ будет хранить информацию о парах (0, 0) и (0, 2),
314-
где первый элемент пары --- состояние автомата, а второй --- вершина графа.
315-
316-
Аналогично, вектор $v$ вида $\fbox{0 1 0} \fbox{0 1 1 0}$ кодирует информацию о парах (1, 1) и (1, 2).
317-
Вектор $v$ вида $\fbox{0 0 1} \fbox{0 0 1 1}$ кодирует информацию о парах (2, 2) и (2, 3).
318-
319-
Таким образом, мы будем понимать, в каком состоянии автомата мы находимся для каждой из вершин фронта обхода графа.
320-
321-
Рассмотрим, как это применяется в разработанном алгоритме, который представлен далее.
322-
323-
Предлагается ``расклеить'' $v$ в матрицу $M$, состоящую из трех векторов, добавив два вектора $\fbox{0 1 0} \fbox{0 0 0 0}$ и $\fbox{0 0 1} \fbox{0 0 0 0}$.
324-
Во второй части этих векторов стоят нули, так как \fbox{0 1 0} и \fbox{0 0 1} кодируют состояния автомата 1 и 2, которые не являются начальными.
325-
326-
\begin{alignat*}{7}
327-
& &&M &&=\begin{matrix}
328-
\fbox{1 0 0} \fbox{1 0 0 0} \\
329-
\fbox{0 1 0} \fbox{0 0 0 0} \\
330-
\fbox{0 0 1} \fbox{0 0 0 0}
331-
\end{matrix}
332-
\end{alignat*}
333-
334-
И совершать обход тем же самым образом, но сохранив с помощью матрицы $M$ дополнительную информацию о парах (состояние, вершина).
335-
336-
\begin{alignat*}{7}
337-
a:\,\,
338-
& \begin{matrix}
339-
\fbox{1 0 0} \fbox{1 0 0 0} \\
340-
\fbox{0 1 0} \fbox{0 0 0 0} \\
341-
\fbox{0 0 1} \fbox{0 0 0 0}
342-
\end{matrix} &&
343-
\times
344-
\left(\begin{array}{c c c | c c c c}
345-
0 & 1 & 0 & 0 & 0 & 0 & 0 \\
346-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
347-
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
348-
\hline
349133
0 & 0 & 0 & 0 & 1 & 0 & 0 \\
350134
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
351135
0 & 0 & 0 & 1 & 0 & 0 & 0 \\
352136
0 & 0 & 0 & 0 & 0 & 0 & 0
353-
\end{array}\right)
354-
&&= \begin{matrix}
355-
\fbox{0 1 0} \fbox{0 1 0 0} \\
356-
\fbox{0 0 0} \fbox{0 0 0 0} \\
357-
\fbox{0 0 0} \fbox{0 0 0 0}
358-
\end{matrix}
359-
\end{alignat*}
137+
\end{pmatrix} \ \ \ \ &&D_{0\_B} &&= \begin{pmatrix}
138+
0 & 1 & 0 & 0 & 0 & 0 & 0 \\
139+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
140+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
141+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
142+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
143+
0 & 0 & 0 & 0 & 0 & 0 & 1 \\
144+
0 & 0 & 0 & 0 & 0 & 1 & 0
145+
\end{pmatrix}
146+
\end{alignat*}
147+
148+
Допустим, что стартовыми вершинами в графе будут выбраны вершины 0 и 3.
149+
Теперь создадим вектор $v = $ \fbox{1 1 1} \fbox{1 0 0 1}, где в первой части стоят три единицы, соответствующие каждому состоянию автомата, в котором мы можем находиться. Во второй части содержится фронт обхода графа, на данном шаге это стартовые вершины.
360150
361151
\begin{alignat*}{7}
362152
b:\,\,
@@ -392,13 +182,47 @@ \section{Достижимость с несколькими источникам
392182
393183
В нашем примере матрица $M$ для следующего шага обхода выглядит следующим образом.
394184
395-
\begin{alignat*}{7}
396-
& &&M &&=\begin{matrix}
397-
\fbox{1 0 0} \fbox{0 0 0 1} \\
398-
\fbox{0 1 0} \fbox{0 1 0 0} \\
399-
\fbox{0 0 1} \fbox{0 0 0 0}
400-
\end{matrix}
401-
\end{alignat*}
185+
И совершать обход следующим образом.
186+
\begin{alignat*}{7}
187+
& \begin{matrix}
188+
\fbox{1 0 0} \fbox{1 0 0 1} \\
189+
\fbox{0 1 0} \fbox{1 0 0 1} \\
190+
\fbox{0 0 1} \fbox{1 0 0 1}
191+
\end{matrix} && \begin{pmatrix}
192+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
193+
0 & 0 & 1 & 0 & 0 & 0 & 0 \\
194+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
195+
0 & 0 & 0 & 0 & 1 & 0 & 0 \\
196+
0 & 0 & 0 & 0 & 0 & 1 & 0 \\
197+
0 & 0 & 0 & 1 & 0 & 0 & 0 \\
198+
0 & 0 & 0 & 0 & 0 & 0 & 0
199+
\end{pmatrix} &&= \begin{matrix}
200+
\fbox{0 0 0} \fbox{0 1 0 0} \\
201+
\fbox{0 0 0} \fbox{0 1 0 0} \\
202+
\fbox{0 1 0} \fbox{0 1 0 0}
203+
\end{matrix}
204+
\end{alignat*}
205+
206+
\begin{alignat*}{7}
207+
& \begin{matrix}
208+
\fbox{1 0 0} \fbox{1 0 0 1} \\
209+
\fbox{0 1 0} \fbox{1 0 0 1} \\
210+
\fbox{0 0 1} \fbox{1 0 0 1}
211+
\end{matrix} && \begin{pmatrix}
212+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
213+
1 & 0 & 0 & 0 & 0 & 0 & 0 \\
214+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
215+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
216+
0 & 0 & 0 & 0 & 0 & 0 & 0 \\
217+
0 & 0 & 0 & 0 & 0 & 0 & 1 \\
218+
0 & 0 & 0 & 0 & 0 & 1 & 0
219+
\end{pmatrix} &&= \begin{matrix}
220+
\fbox{0 0 0} \fbox{0 0 1 0} \\
221+
\fbox{1 0 0} \fbox{0 0 1 0} \\
222+
\fbox{0 0 0} \fbox{0 0 1 0}
223+
\end{matrix}
224+
\end{alignat*}
225+
\end{example}
402226
403227
Видно, что во фронт обхода графа попали вершины 1 и 3. В вершину 1 мы попали в состоянии 1, в вершину 3 --- в состоянии 0.
404228

0 commit comments

Comments
 (0)