Chapter 17 first version

This commit is contained in:
Antti H S Laaksonen 2017-01-08 22:17:46 +02:00
parent 5341dd2cc7
commit 1d73d868c9
1 changed files with 192 additions and 189 deletions

View File

@ -1,20 +1,21 @@
\chapter{Strongly connectivity} \chapter{Strongly connectivity}
\index{vahvasti yhtenxinen verkko@vahvasti yhtenäinen verkko} \index{strongly connected graph}
Suunnatussa verkossa yhtenäisyys ei takaa sitä, In a directed graph, the directions of
että kahden solmun välillä olisi olemassa polkua, the edges restrict possible paths in the graph,
koska kaarten suunnat rajoittavat liikkumista. so even if the graph is connected,
Niinpä suunnattuja verkkoja varten on mielekästä this doesn't guarantee that there would be
määritellä uusi käsite, a path between any two nodes.
joka vaatii enemmän verkon yhtenäisyydeltä. Thus, it is meaningful to define a new concept
for directed graphs that requires more than connectivity.
Verkko on \key{vahvasti yhtenäinen}, A graph is \key{strongly connected}
jos mistä tahansa solmusta on olemassa polku if there is a path from any node to all
kaikkiin muihin solmuihin. other nodes in the graph.
Esimerkiksi seuraavassa kuvassa vasen For example, in the following picture,
verkko on vahvasti yhtenäinen, the left graph is strongly connected,
kun taas oikea verkko ei ole. while the right graph is not.
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9] \begin{tikzpicture}[scale=0.9]
@ -40,21 +41,21 @@ kun taas oikea verkko ei ole.
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Oikea verkko ei ole vahvasti yhtenäinen, The right graph is not strongly connected
koska esimerkiksi solmusta 2 ei ole because, for example, there is no path
polkua solmuun 1. from node 2 to node 1.
\index{vahvasti yhtenxinen komponentti@vahvasti yhtenäinen komponentti} \index{strongly connected component}
\index{komponenttiverkko@komponenttiverkko} \index{component graph}
Verkon \key{vahvasti yhtenäiset komponentit} The \key{strongly connected components}
jakavat verkon solmut mahdollisimman of a graph divide the graph into strongly connected
suuriin vahvasti yhtenäisiin osiin. subgraphs that are as large as possible.
Verkon vahvasti yhtenäiset komponentit The strongly connected components form an
muodostavat syklittömän \key{komponenttiverkon}, acyclic \key{component graph} that represents
joka kuvaa alkuperäisen verkon syvärakennetta. the deep structure of the original graph.
Esimerkiksi verkon For example, for the graph
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9,label distance=-2mm] \begin{tikzpicture}[scale=0.9,label distance=-2mm]
\node[draw, circle] (1) at (-1,1) {$7$}; \node[draw, circle] (1) at (-1,1) {$7$};
@ -77,7 +78,7 @@ Esimerkiksi verkon
\path[draw,thick,->] (6) -- (7); \path[draw,thick,->] (6) -- (7);
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
vahvasti yhtenäiset komponentit ovat the strongly connected components are as follows:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9] \begin{tikzpicture}[scale=0.9]
\node[draw, circle] (1) at (-1,1) {$7$}; \node[draw, circle] (1) at (-1,1) {$7$};
@ -105,7 +106,7 @@ vahvasti yhtenäiset komponentit ovat
\draw [red,thick,dashed,line width=2pt] (-6.5,0.5) rectangle (-7.5,-0.5); \draw [red,thick,dashed,line width=2pt] (-6.5,0.5) rectangle (-7.5,-0.5);
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
ja ne muodostavat seuraavan komponenttiverkon: The corresponding component graph is as follows:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9] \begin{tikzpicture}[scale=0.9]
\node[draw, circle] (1) at (-3,1) {$B$}; \node[draw, circle] (1) at (-3,1) {$B$};
@ -120,40 +121,41 @@ ja ne muodostavat seuraavan komponenttiverkon:
\path[draw,thick,->] (3) -- (4); \path[draw,thick,->] (3) -- (4);
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Komponentit ovat $A=\{1,2\}$, The components are $A=\{1,2\}$,
$B=\{3,6,7\}$, $C=\{4\}$ sekä $D=\{5\}$. $B=\{3,6,7\}$, $C=\{4\}$ and $D=\{5\}$.
Komponenttiverkko on syklitön, suunnattu verkko, A component graph is an acyclic, directed graph,
jonka käsittely on alkuperäistä verkkoa so it is easier to process than the original
helpompaa, koska siinä ei ole syklejä. graph because it doesn't contain cycles.
Niinpä komponenttiverkolle voi muodostaa Thus, as in Chapter 16, it is possible to
luvun 16 tapaan topologisen järjestyksen construct a topological sort for a component
ja soveltaa sen jälkeen dynaamista ohjelmintia graph and also use dynamic programming algorithms.
verkon käsittelyyn.
\section{Kosarajun algoritmi} \section{Kosaraju's algorithm}
\index{Kosarajun algoritmi@Kosarajun algoritmi} \index{Kosaraju's algorithm}
\key{Kosarajun algoritmi} on tehokas \key{Kosaraju's algorithm} is an efficient
menetelmä verkon method for finding the strongly connected components
vahvasti yhtenäisten komponenttien etsimiseen. of a directed graph.
Se suorittaa verkkoon It performs two depth-first searches:
kaksi syvyyshakua, joista ensimmäinen the first search constructs a list of nodes
kerää solmut listaan verkon rakenteen perusteella according to the structure of the graph,
ja toinen muodostaa vahvasti yhtenäiset komponentit. and the second search forms the strongly connected components.
\subsubsection{Syvyyshaku 1} \subsubsection{Search 1}
Algoritmin ensimmäinen vaihe muodostaa listan solmuista The first phase of the algorithm constructs
syvyyshaun käsittelyjärjestyksessä. a list of nodes in the order in which a
Algoritmi käy solmut läpi yksi kerrallaan, depth-first search processes them.
ja jos solmua ei ole vielä käsitelty, algoritmi suorittaa The algorithm goes through the nodes,
solmusta alkaen syvyyshaun. and begins a depth-first search at each
Solmu lisätään listalle, kun syvyyshaku on unprocessed node.
käsitellyt kaikki siitä lähtevät kaaret. Each node will be added to the list
after it has been processed.
Esimerkkiverkossa solmujen käsittelyjärjestys on: In the example graph the nodes are processed
in the following order:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9,label distance=-2mm] \begin{tikzpicture}[scale=0.9,label distance=-2mm]
\node[draw, circle] (1) at (-1,1) {$7$}; \node[draw, circle] (1) at (-1,1) {$7$};
@ -185,14 +187,15 @@ Esimerkkiverkossa solmujen käsittelyjärjestys on:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Solmun kohdalla oleva merkintä $x/y$ tarkoittaa, että solmun The notation $x/y$ means that
käsittely syvyyshaussa alkoi hetkellä $x$ ja päättyi hetkellä $y$. processing the node started at moment $x$
Kun solmut järjestetään käsittelyn päättymisajan and ended at moment $y$.
mukaan, tuloksena on seuraava järjestys: When the nodes are sorted according to
ending times, the result is the following list:
\begin{tabular}{ll} \begin{tabular}{ll}
\\ \\
solmu & päättymisaika \\ node & ending time \\
\hline \hline
4 & 5 \\ 4 & 5 \\
5 & 6 \\ 5 & 6 \\
@ -204,22 +207,23 @@ solmu & päättymisaika \\
\\ \\
\end{tabular} \end{tabular}
Solmujen käsittelyjärjestys algoritmin seuraavassa vaiheessa In the second phase of the algorithm,
tulee olemaan tämä järjestys käänteisenä eli $[3,7,6,1,2,5,4]$. the nodes will be processed
in reverse order: $[3,7,6,1,2,5,4]$.
\subsubsection{Syvyyshaku 2} \subsubsection{Search 2}
Algoritmin toinen vaihe muodostaa verkon vahvasti The second phase of the algorithm
yhtenäiset komponentit. forms the strongly connected components
Ennen toista syvyyshakua algoritmi muuttaa of the graph.
jokaisen kaaren suunnan käänteiseksi. First, the algorithm reverses every
Tämä varmistaa, edge in the graph.
että toisen syvyyshaun aikana löydetään This ensures that during the second search,
joka kerta vahvasti yhtenäinen komponentti, we will always find a strongly connected
johon ei kuulu ylimääräisiä solmuja. component without extra nodes.
Esimerkkiverkko on käännettynä seuraava:
The example graph becomes as follows
after reversing the edges:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9,label distance=-2mm] \begin{tikzpicture}[scale=0.9,label distance=-2mm]
\node[draw, circle] (1) at (-1,1) {$7$}; \node[draw, circle] (1) at (-1,1) {$7$};
@ -243,17 +247,16 @@ Esimerkkiverkko on käännettynä seuraava:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Tämän jälkeen algoritmi käy läpi After this, the algorithm goes through the nodes
solmut käänteisessä ensimmäisen syvyyshaun in the order defined by the first search.
tuottamassa järjestyksessä. If a node doesn't belong to a component,
Jos solmu ei kuulu vielä komponenttiin, the algorithm creates a new component
siitä alkaa uusi syvyyshaku. and begins a depth-first search
Solmun komponenttiin liitetään kaikki aiemmin where all new nodes found during the search
käsittelemättömät solmut, are added to the new component.
joihin syvyyshaku pääsee solmusta.
Esimerkkiverkossa muodostuu ensin komponentti In the example graph, the first component
solmusta 3 alkaen: begins at node 3:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9,label distance=-2mm] \begin{tikzpicture}[scale=0.9,label distance=-2mm]
@ -283,13 +286,13 @@ solmusta 3 alkaen:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Huomaa, että kaarten kääntämisen ansiosta komponentti Note that since we reversed all edges in the graph,
ei pääse ''vuotamaan'' muihin verkon osiin. the component doesn't ''leak'' to other parts in the graph.
\begin{samepage} \begin{samepage}
Sitten listalla ovat solmut 7 ja 6, mutta ne on jo liitetty The next nodes in the list are nodes 7 and 6,
komponenttiin. but they already belong to a component.
Seuraava uusi solmu on 1, josta muodostuu uusi komponentti: The next new component begins at node 1:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9,label distance=-2mm] \begin{tikzpicture}[scale=0.9,label distance=-2mm]
@ -320,8 +323,8 @@ Seuraava uusi solmu on 1, josta muodostuu uusi komponentti:
\end{center} \end{center}
\end{samepage} \end{samepage}
Viimeisenä algoritmi käsittelee solmut 5 ja 4, Finally, the algorithm processes nodes 5 and 5
jotka tuottavat loput vahvasti yhtenäiset komponentit: that create the remaining strongy connected components:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=0.9,label distance=-2mm] \begin{tikzpicture}[scale=0.9,label distance=-2mm]
@ -351,31 +354,34 @@ jotka tuottavat loput vahvasti yhtenäiset komponentit:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Algoritmin aikavaativuus on $O(n+m)$, The time complexity of the algorithm is $O(n+m)$
missä $n$ on solmujen määrä ja $m$ on kaarten määrä. where $n$ is the number of nodes and $m$
Tämä johtuu siitä, is the number of edges.
että algoritmi suorittaa kaksi syvyyshakua ja The reason for this is that the algorithm
kummankin haun aikavaativuus on $O(n+m)$. performs two depth-first searches and
each search takes $O(n+m)$ time.
\section{2SAT-ongelma} \section{2SAT problem}
\index{2SAT-ongelma} \index{2SAT problem}
Vahvasti yhtenäisyys liittyy myös \key{2SAT-ongelman} ratkaisemiseen. Strongly connectivity is also linked with the
Siinä annettuna on looginen lauseke muotoa \key{2SAT problem}.
In this problem, we are given a logical formula
\[ \[
(a_1 \lor b_1) \land (a_2 \lor b_2) \land \cdots \land (a_m \lor b_m), (a_1 \lor b_1) \land (a_2 \lor b_2) \land \cdots \land (a_m \lor b_m),
\] \]
jossa jokainen $a_i$ ja $b_i$ on joko looginen muuttuja where each $a_i$ and $b_i$ is either a logical variable
($x_1,x_2,\ldots,x_n$) ($x_1,x_2,\ldots,x_n$)
tai loogisen muuttujan negaatio ($\lnot x_1, \lnot x_2, \ldots, \lnot x_n$). or a negation of a logical variable
Merkit ''$\land$'' ja ''$\lor$'' tarkoittavat ($\lnot x_1, \lnot x_2, \ldots, \lnot x_n$).
loogisia operaatioita ''ja'' ja ''tai''. The symbols ''$\land$'' and ''$\lor$'' denote
Tehtävänä on valita muuttujille arvot niin, logical operators ''and'' and ''or''.
että lauseke on tosi, Our task is to assign each variable a value
tai todeta, että tämä ei ole mahdollista. so that the formula is true or state
that it is not possible.
Esimerkiksi lauseke For example, the formula
\[ \[
L_1 = (x_2 \lor \lnot x_1) \land L_1 = (x_2 \lor \lnot x_1) \land
(\lnot x_1 \lor \lnot x_2) \land (\lnot x_1 \lor \lnot x_2) \land
@ -383,34 +389,35 @@ L_1 = (x_2 \lor \lnot x_1) \land
(\lnot x_2 \lor \lnot x_3) \land (\lnot x_2 \lor \lnot x_3) \land
(x_1 \lor x_4) (x_1 \lor x_4)
\] \]
on tosi, kun $x_1$ ja $x_2$ ovat epätosia is true when $x_1$ and $x_2$ are false
ja $x_3$ ja $x_4$ ovat tosia. and $x_3$ and $x_4$ are true.
Vastaavasti lauseke However, the formula
\[ \[
L_2 = (x_1 \lor x_2) \land L_2 = (x_1 \lor x_2) \land
(x_1 \lor \lnot x_2) \land (x_1 \lor \lnot x_2) \land
(\lnot x_1 \lor x_3) \land (\lnot x_1 \lor x_3) \land
(\lnot x_1 \lor \lnot x_3) (\lnot x_1 \lor \lnot x_3)
\] \]
on epätosi riippumatta muuttujien valinnasta. is always false.
Tämän näkee siitä, että muuttujalle $x_1$ The reason for this is that we can't
ei ole mahdollista arvoa, joka ei tuottaisi ristiriitaa. choose a value for variable $x_1$
Jos $x_1$ on epätosi, pitäisi päteä sekä $x_2$ että $\lnot x_2$, without creating a contradiction.
mikä on mahdotonta. If $x_1$ is false, both $x_2$ and $\lnot x_2$
Jos taas $x_1$ on tosi, should hold which is impossible,
pitäisi päteä sekä $x_3$ että $\lnot x_3$, and if $x_1$ is true, both $x_3$ and $\lnot x_3$
mikä on myös mahdotonta. should hold which is impossible as well.
2SAT-ongelman saa muutettua verkoksi niin, The 2SAT problem can be represented as a graph
että jokainen muuttuja $x_i$ ja negaatio $\lnot x_i$ where the nodes correspond to
on yksi verkon solmuista variables $x_i$ and negations $\lnot x_i$,
ja muuttujien riippuvuudet ovat kaaria. and the edges determine the connections
Jokaisesta parista $(a_i \lor b_i)$ tulee kaksi between the variables.
kaarta: $\lnot a_i \to b_i$ sekä $\lnot b_i \to a_i$. Each pair $(a_i \lor b_i)$ generates two edges:
Nämä tarkoittavat, että jos $a_i$ ei päde, $\lnot a_i \to b_i$ and $\lnot b_i \to a_i$.
niin $b_i$:n on pakko päteä, ja päinvastoin. This means that if $a_i$ doesn't hold,
$b_i$ must hold, and vice versa.
Lausekkeen $L_1$ verkosta tulee nyt: The graph for formula $L_1$ is:
\\ \\
\begin{center} \begin{center}
\begin{tikzpicture}[scale=1.0,minimum size=2pt] \begin{tikzpicture}[scale=1.0,minimum size=2pt]
@ -435,8 +442,7 @@ Lausekkeen $L_1$ verkosta tulee nyt:
\path[draw,thick,->] (7) -- (5); \path[draw,thick,->] (7) -- (5);
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
And the graph for formula $L_2$ is:
Lausekkeen $L_2$ verkosta taas tulee:
\\ \\
\begin{center} \begin{center}
\begin{tikzpicture}[scale=1.0,minimum size=2pt] \begin{tikzpicture}[scale=1.0,minimum size=2pt]
@ -458,40 +464,43 @@ Lausekkeen $L_2$ verkosta taas tulee:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Verkon rakenne kertoo, onko 2SAT-ongelmalla ratkaisua. The structure of the graph indicates whether
Jos on jokin muuttuja $x_i$ niin, the corresponding 2SAT problem can be solved.
että $x_i$ ja $\lnot x_i$ ovat samassa If there is a variable $x_i$ such that
vahvasti yhtenäisessä komponentissa, both $x_i$ and $\lnot x_i$ belong to the
niin ratkaisua ei ole olemassa. same strongly connected component,
Tällöin verkossa on polku sekä $x_i$:stä then there are no solutions.
$\lnot x_i$:ään että $\lnot x_i$:stä $x_i$:ään, In this case, the graph contains
eli kumman tahansa arvon valitseminen a path from $x_i$ to $\lnot x_i$,
muuttujalle $x_i$ pakottaisi myös valitsemaan and also a path from $\lnot x_i$ to $x_i$,
vastakkaisen arvon, mikä on ristiriita. so both $x_i$ and $\lnot x_i$ should hold
Jos taas verkossa ei ole tällaista which is not possible.
solmua $x_i$, ratkaisu on olemassa. However, if the graph doesn't contain
such a variable, then there is always a solution.
Lausekkeen $L_1$ verkossa In the graph of formula $L_1$
mitkään solmut $x_i$ ja $\lnot x_i$ no nodes $x_i$ and $\lnot x_i$
eivät ole samassa vahvasti yhtenäisessä komponentissa, belong to the same strongly connected component,
mikä tarkoittaa, että ratkaisu on olemassa. so there is a solution.
Lausekkeen $L_2$ verkossa taas kaikki solmut In the graph of formula $L_2$
ovat samassa vahvasti yhtenäisessä komponentissa, all nodes belong to the same strongly connected component,
eli ratkaisua ei ole olemassa. so there are no solutions.
Jos ratkaisu on olemassa, muuttujien arvot saa selville If a solution exists, the values for the variables
käymällä komponenttiverkko läpi käänteisessä can be found by processing the nodes of the
topologisessa järjestyksessä. component graph in a reverse topological sort order.
Verkosta otetaan käsittelyyn ja poistetaan At each step, we process and remove a component
joka vaiheessa komponentti, that doesn't contain edges that lead to the
josta ei lähde kaaria muihin jäljellä remaining components.
oleviin komponentteihin. If the variables in the component don't have values,
Jos komponentin muuttujille ei ole vielä valittu arvoja, their values will be determined
ne saavat komponentin mukaiset arvot. according to the component,
Jos taas arvot on jo valittu, niitä ei muuteta. and if they already have values,
Näin jatketaan, kunnes jokainen lausekkeen muuttuja on saanut arvon. they are not changed.
The process continues until all variables
have been assigned a value.
Lausekkeen $L_1$ verkon komponenttiverkko on seuraava: The component graph for formula $L_1$ is as follows:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=1.0] \begin{tikzpicture}[scale=1.0]
\node[draw, circle] (1) at (0,0) {$A$}; \node[draw, circle] (1) at (0,0) {$A$};
@ -505,43 +514,37 @@ Lausekkeen $L_1$ verkon komponenttiverkko on seuraava:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Komponentit ovat The components are
$A = \{\lnot x_4\}$, $A = \{\lnot x_4\}$,
$B = \{x_1, x_2, \lnot x_3\}$, $B = \{x_1, x_2, \lnot x_3\}$,
$C = \{\lnot x_1, \lnot x_2, x_3\}$ sekä $C = \{\lnot x_1, \lnot x_2, x_3\}$ and
$D = \{x_4\}$. $D = \{x_4\}$.
Ratkaisun muodostuksessa When constructing the solution,
käsitellään ensin komponentti $D$, we first process component $D$
josta $x_4$ saa arvon tosi. where $x_4$ becomes true.
Sitten käsitellään komponentti $C$, After this, we process component $C$
josta $x_1$ ja $x_2$ tulevat epätodeksi where $x_1$ and $x_2$ become false
ja $x_3$ tulee todeksi. and $x_3$ becomes true.
Kaikki muuttujat ovat saaneet arvon, All variables have been assigned a value,
joten myöhemmin käsiteltävät so the remaining components $A$ and $B$
komponentit $B$ ja $A$ eivät vaikuta enää ratkaisuun. don't change the variables anymore.
Huomaa, että tämän menetelmän toiminta Note that this method works because the
perustuu verkon erityiseen rakenteeseen. structure of the graph is special.
Jos solmusta $x_i$ pääsee If there are paths from node $x_i$ to node $x_j$
solmuun $x_j$, and from node $x_j$ to node $\lnot x_j$,
josta pääsee solmuun $\lnot x_j$, then node $x_i$ never becomes true.
niin $x_i$ ei saa koskaan arvoa tosi. The reason for this is that there is also
Tämä johtuu siitä, että a path from node $\lnot x_j$ to node $\lnot x_i$,
solmusta $\lnot x_j$ täytyy and both $x_i$ and $x_j$ become false.
päästä myös solmuun $\lnot x_i$,
koska kaikki riippuvuudet
ovat verkossa molempiin suuntiin.
Niinpä sekä $x_i$ että $x_j$
saavat varmasti arvokseen epätosi.
\index{3SAT-ongelma} \index{3SAT problem}
2SAT-ongelman vaikeampi versio on \key{3SAT-ongelma}, A more difficult problem is the \key{3SAT problem}
jossa jokainen lausekkeen osa on muotoa where each part of the formula is of the form
$(a_i \lor b_i \lor c_i)$. $(a_i \lor b_i \lor c_i)$.
Tämän ongelman ratkaisemiseen \textit{ei} No efficient algorithm for solving this problem
tunneta tehokasta menetelmää, is known, but it is a NP-hard problem.
vaan kyseessä on NP-vaikea ongelma.