Chapter 17 first version
This commit is contained in:
parent
5341dd2cc7
commit
1d73d868c9
381
luku17.tex
381
luku17.tex
|
@ -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.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue