Chapter 19 first version
This commit is contained in:
parent
10619a5c9d
commit
d91017299b
453
luku19.tex
453
luku19.tex
|
@ -1,33 +1,30 @@
|
||||||
\chapter{Paths and circuits}
|
\chapter{Paths and circuits}
|
||||||
|
|
||||||
Tämä luku käsittelee kahdenlaisia polkuja verkossa:
|
This chapter focuses on two types of paths in a graph:
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item \key{Eulerin polku} on verkossa oleva
|
\item An \key{Eulerian path} is a path that
|
||||||
polku, joka kulkee tasan kerran jokaista
|
goes through each edge exactly once.
|
||||||
verkon kaarta pitkin.
|
\item A \key{Hamiltonian path} is a path
|
||||||
\item \key{Hamiltonin polku} on verkossa
|
that visits each node exactly once.
|
||||||
oleva polku, joka käy tasan kerran
|
|
||||||
jokaisessa verkon solmussa.
|
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
Vaikka Eulerin ja Hamiltonin polut
|
While Eulerian and Hamiltonian paths look like
|
||||||
näyttävät päältä päin
|
similar concepts at first glance,
|
||||||
samantapaisilta käsitteiltä,
|
the computational problems related to them
|
||||||
niihin liittyy hyvin erilaisia laskennallisia ongelmia.
|
are very different.
|
||||||
Osoittautuu, että yksinkertainen verkon solmujen
|
It turns out that a simple rule based on node degrees
|
||||||
asteisiin liittyvä sääntö ratkaisee, onko verkossa
|
determines if a graph contains an Eulerian path,
|
||||||
Eulerin polkua, ja polun muodostamiseen on myös
|
and there is also an efficient algorithm for
|
||||||
olemassa tehokas algoritmi.
|
finding the path.
|
||||||
Sen sijaan Hamiltonin polun etsimiseen ei tunneta
|
On the contrary, finding a Hamiltonian path is a NP-hard
|
||||||
mitään tehokasta algoritmia, vaan kyseessä on
|
problem and thus no efficient algorithm is known for solving the problem.
|
||||||
NP-vaikea ongelma.
|
|
||||||
|
|
||||||
\section{Eulerin polku}
|
\section{Eulerian path}
|
||||||
|
|
||||||
\index{Eulerin polku@Eulerin polku}
|
\index{Eulerian path}
|
||||||
|
|
||||||
\key{Eulerin polku} on verkossa oleva
|
An \key{Eulerian path} is a path
|
||||||
polku, joka kulkee tarkalleen kerran jokaista kaarta pitkin.
|
that goes exactly once through each edge in the graph.
|
||||||
Esimerkiksi verkossa
|
For example, the graph
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tikzpicture}[scale=0.9]
|
\begin{tikzpicture}[scale=0.9]
|
||||||
\node[draw, circle] (1) at (1,5) {$1$};
|
\node[draw, circle] (1) at (1,5) {$1$};
|
||||||
|
@ -44,7 +41,7 @@ Esimerkiksi verkossa
|
||||||
\path[draw,thick,-] (4) -- (5);
|
\path[draw,thick,-] (4) -- (5);
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
on Eulerin polku solmusta 2 solmuun 5:
|
has an Eulerian path from node 2 to node 5:
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tikzpicture}[scale=0.9]
|
\begin{tikzpicture}[scale=0.9]
|
||||||
\node[draw, circle] (1) at (1,5) {$1$};
|
\node[draw, circle] (1) at (1,5) {$1$};
|
||||||
|
@ -68,11 +65,11 @@ on Eulerin polku solmusta 2 solmuun 5:
|
||||||
\path[draw=red,thick,->,line width=2pt] (3) -- node[font=\small,label={[red]south:6.}] {} (5);
|
\path[draw=red,thick,->,line width=2pt] (3) -- node[font=\small,label={[red]south:6.}] {} (5);
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
\index{Eulerin kierros@Eulerin kierros}
|
\index{Eulerian circuit}
|
||||||
\key{Eulerin kierros}
|
An \key{Eulerian circuit}
|
||||||
on puolestaan Eulerin polku,
|
is an Eulerian path that begins and ends
|
||||||
jonka alku- ja loppusolmu ovat samat.
|
at the same node.
|
||||||
Esimerkiksi verkossa
|
For example, the graph
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tikzpicture}[scale=0.9]
|
\begin{tikzpicture}[scale=0.9]
|
||||||
\node[draw, circle] (1) at (1,5) {$1$};
|
\node[draw, circle] (1) at (1,5) {$1$};
|
||||||
|
@ -89,7 +86,7 @@ Esimerkiksi verkossa
|
||||||
\path[draw,thick,-] (2) -- (4);
|
\path[draw,thick,-] (2) -- (4);
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
on Eulerin kierros, jonka alku- ja loppusolmu on 1:
|
has an Eulerian circuit that starts and ends at node 1:
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tikzpicture}[scale=0.9]
|
\begin{tikzpicture}[scale=0.9]
|
||||||
\node[draw, circle] (1) at (1,5) {$1$};
|
\node[draw, circle] (1) at (1,5) {$1$};
|
||||||
|
@ -114,27 +111,27 @@ on Eulerin kierros, jonka alku- ja loppusolmu on 1:
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
||||||
\subsubsection{Olemassaolo}
|
\subsubsection{Existence}
|
||||||
|
|
||||||
Osoittautuu, että Eulerin polun ja kierroksen olemassaolo
|
It turns out that the existence of Eulerian paths and circuits
|
||||||
riippuu verkon solmujen asteista.
|
depends on the degrees of the nodes in the graph.
|
||||||
Solmun aste on sen naapurien määrä eli niiden solmujen määrä,
|
The degree of a node is the number of its neighbours, i.e.,
|
||||||
jotka ovat yhteydessä solmuun kaarella.
|
the number of nodes that are connected with a direct edge.
|
||||||
|
|
||||||
Suuntaamattomassa verkossa on Eulerin polku,
|
An undirected graph has an Eulerian path if all the edges
|
||||||
jos kaikki kaaret ovat samassa yhtenäisessä komponentissa ja
|
belong to the same connected component and
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item jokaisen solmun aste on parillinen \textit{tai}
|
\item the degree of each node is even \emph{or}
|
||||||
\item tarkalleen kahden solmun aste on pariton ja kaikkien
|
\item the degree of exactly two nodes is odd,
|
||||||
muiden solmujen aste on parillinen.
|
and the degree of all other nodes is even.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
Ensimmäisessä tapauksessa Eulerin polku on samalla myös Eulerin kierros.
|
In the first case, each Eulerian path is also an Eulerian circuit.
|
||||||
Jälkimmäisessä tapauksessa Eulerin polun alku- ja loppusolmu ovat
|
In the second case, the odd-degree nodes are the starting
|
||||||
paritonasteiset solmut ja se ei ole Eulerin kierros.
|
and ending nodes of an Eulerian path, and it is not an Eulerian circuit.
|
||||||
|
|
||||||
\begin{samepage}
|
\begin{samepage}
|
||||||
Esimerkiksi verkossa
|
For example, in the graph
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tikzpicture}[scale=0.9]
|
\begin{tikzpicture}[scale=0.9]
|
||||||
\node[draw, circle] (1) at (1,5) {$1$};
|
\node[draw, circle] (1) at (1,5) {$1$};
|
||||||
|
@ -152,34 +149,37 @@ Esimerkiksi verkossa
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
\end{samepage}
|
\end{samepage}
|
||||||
solmujen 1, 3 ja 4 aste on 2 ja solmujen 2 ja 5 aste on 3.
|
the degree of nodes 1, 3 and 4 is 2,
|
||||||
Tarkalleen kahden solmun aste on pariton,
|
and the degree of nodes 2 and 5 is 3.
|
||||||
joten verkossa on Eulerin polku solmujen 2 ja 5 välillä,
|
Exactly two nodes have an even degree,
|
||||||
mutta verkossa ei ole Eulerin kierrosta.
|
so there is an Eulerian path between nodes 2 and 5,
|
||||||
|
but the graph doesn't contain an Eulerian circuit.
|
||||||
|
|
||||||
Jos verkko on suunnattu, tilanne on hieman hankalampi.
|
In a directed graph, the situation is a bit more difficult.
|
||||||
Silloin Eulerin polun ja kierroksen olemassaoloon
|
In this case we should focus on indegree and outdegrees
|
||||||
vaikuttavat solmujen lähtö- ja tuloasteet.
|
of the nodes in the graph.
|
||||||
Solmun lähtöaste on solmusta lähtevien kaarten määrä,
|
The indegree of a node is the number of edges that
|
||||||
ja vastaavasti solmun tuloaste on solmuun tulevien kaarten määrä.
|
end at the node,
|
||||||
|
and correspondingly, the outdegree is the number of
|
||||||
|
edges that begin at the node.
|
||||||
|
|
||||||
Suunnatussa verkossa on Eulerin polku, jos
|
A directed graph contains an Eulerian path
|
||||||
kaikki kaaret ovat samassa vahvasti yhtenäisessä
|
if all the edges belong to the same strongly
|
||||||
komponentissa ja
|
connected component and
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item jokaisen solmun lähtö- ja tuloaste on sama \textit{tai}
|
\item each node has the same indegree and outdegree \emph{or}
|
||||||
\item yhdessä solmussa lähtöaste on yhden suurempi kuin tuloaste,
|
\item in one node, indegree is one larger than outdegree,
|
||||||
toisessa solmussa tuloaste on yhden suurempi kuin lähtöaste
|
in another node, outdegree is one larger than indegree,
|
||||||
ja kaikissa muissa solmuissa lähtö- ja tuloaste on sama.
|
and all other nodes have the same indegree and outdegree.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
Tilanne on vastaava kuin suuntaamattomassa verkossa:
|
In the first case,
|
||||||
ensimmäisessä tapauksessa Eulerin polku on myös Eulerin kierros,
|
each Eulerian path is also an Eulerian circuit,
|
||||||
ja toisessa tapauksessa verkossa on vain Eulerin polku,
|
and in the second case, the graph only contains an Eulerian path
|
||||||
jonka lähtösolmussa lähtöaste on suurempi ja
|
that begins at the node whose outdegree is larger
|
||||||
päätesolmussa tuloaste on suurempi.
|
and ends at the node whose indegree is larger.
|
||||||
|
|
||||||
Esimerkiksi verkossa
|
For example, in the graph
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tikzpicture}[scale=0.9]
|
\begin{tikzpicture}[scale=0.9]
|
||||||
\node[draw, circle] (1) at (1,5) {$1$};
|
\node[draw, circle] (1) at (1,5) {$1$};
|
||||||
|
@ -196,10 +196,11 @@ Esimerkiksi verkossa
|
||||||
\path[draw,thick,->,>=latex] (5) -- (4);
|
\path[draw,thick,->,>=latex] (5) -- (4);
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
solmuissa 1, 3 ja 4 sekä lähtöaste että tuloaste on 1.
|
nodes 1, 3 and 4 have both indegree 1 and outdegree 1,
|
||||||
Solmussa 2 tuloaste on 1 ja lähtöaste on 2,
|
node 2 has indegree 1 and outdegree 2,
|
||||||
kun taas solmussa 5 tulosate on 2 ja lähtöaste on 1.
|
and node 5 has indegree 2 and outdegree 1.
|
||||||
Niinpä verkossa on Eulerin polku solmusta 2 solmuun 5:
|
Hence, the graph contains an Eulerian path
|
||||||
|
from node 2 to node 5:
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tikzpicture}[scale=0.9]
|
\begin{tikzpicture}[scale=0.9]
|
||||||
\node[draw, circle] (1) at (1,5) {$1$};
|
\node[draw, circle] (1) at (1,5) {$1$};
|
||||||
|
@ -224,45 +225,45 @@ Niinpä verkossa on Eulerin polku solmusta 2 solmuun 5:
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
||||||
\subsubsection{Hierholzerin algoritmi}
|
\subsubsection{Hierholzer's algorithm}
|
||||||
|
|
||||||
\index{Hierholzerin algoritmi@Hierholzerin algoritmi}
|
\index{Hierholzer's algorithm}
|
||||||
|
|
||||||
\key{Hierholzerin algoritmi} muodostaa Eulerin kierroksen
|
\key{Hierholzer's algorithm} constructs an Eulerian circuit
|
||||||
suuntaamattomassa verkossa.
|
in an undirected graph.
|
||||||
Algoritmi olettaa, että kaikki kaaret ovat samassa
|
The algorithm assumes that all edges belong to
|
||||||
komponentissa ja jokaisen solmun aste on parillinen.
|
the same connected component,
|
||||||
Algoritmi on mahdollista toteuttaa niin, että sen
|
and the degree of each node is even.
|
||||||
aikavaativuus on $O(n+m)$.
|
The algorithm can be implemented in $O(n+m)$ time.
|
||||||
|
|
||||||
Hierholzerin algoritmi muodostaa ensin verkkoon jonkin kierroksen,
|
First, the algorithm constructs a circuit that contains
|
||||||
johon kuuluu osa verkon kaarista.
|
some (not necessarily all) of the edges in the graph.
|
||||||
Sen jälkeen algoritmi alkaa laajentaa kierrosta
|
After this, the algorithm extends the circuit
|
||||||
lisäämällä sen osaksi uusia alikierroksia.
|
step by step by adding subcircuits to it.
|
||||||
Tämä jatkuu niin kauan, kunnes kaikki kaaret kuuluvat
|
This continues until all edges have been added
|
||||||
kierrokseen ja siitä on tullut Eulerin kierros.
|
and the Eulerian circuit is ready.
|
||||||
|
|
||||||
Algoritmi laajentaa kierrosta valitsemalla jonkin
|
The algorithm extends the circuit by always choosing
|
||||||
kierrokseen kuuluvan solmun $x$,
|
a node $x$ that belongs to the circuit but has
|
||||||
jonka kaikki kaaret eivät ole vielä mukana kierroksessa.
|
some edges that are not included in the circuit.
|
||||||
Algoritmi muodostaa solmusta $x$ alkaen uuden polun
|
The algorith constructs a new path from node $x$
|
||||||
kulkien vain sellaisia kaaria, jotka eivät ole
|
that only contains edges that are not in the circuit.
|
||||||
mukana kierroksessa.
|
Since the degree of each node is even,
|
||||||
Koska jokaisen solmun aste on parillinen,
|
sooner or later the path will return to node $x$
|
||||||
ennemmin tai myöhemmin polku palaa takaisin lähtösolmuun $x$.
|
which creates a subcircuit.
|
||||||
|
|
||||||
Jos verkossa on kaksi paritonasteista solmua,
|
If the graph contains two odd-degree nodes,
|
||||||
Hierholzerin algoritmilla voi myös muodostaa
|
Hierholzer's algorithm can also be used for
|
||||||
Eulerin polun lisäämällä kaaren
|
constructing an Eulerian path by adding an
|
||||||
paritonasteisten solmujen välille.
|
extra edge between the odd-degree nodes.
|
||||||
Tämän jälkeen verkosta voi etsiä ensin
|
After this, we can first construct an Eulerian circuit
|
||||||
Eulerin kierroksen ja poistaa siitä sitten
|
and then remove the extra edge,
|
||||||
ylimääräisen kaaren, jolloin tuloksena on Eulerin polku.
|
which produces an Eulerian path in the original graph.
|
||||||
|
|
||||||
\subsubsection{Esimerkki}
|
\subsubsection{Example}
|
||||||
|
|
||||||
\begin{samepage}
|
\begin{samepage}
|
||||||
Tarkastellaan algoritmin toimintaa seuraavassa verkossa:
|
Let's consider the following graph:
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tikzpicture}[scale=0.9]
|
\begin{tikzpicture}[scale=0.9]
|
||||||
\node[draw, circle] (1) at (3,5) {$1$};
|
\node[draw, circle] (1) at (3,5) {$1$};
|
||||||
|
@ -288,9 +289,10 @@ Tarkastellaan algoritmin toimintaa seuraavassa verkossa:
|
||||||
\end{samepage}
|
\end{samepage}
|
||||||
|
|
||||||
\begin{samepage}
|
\begin{samepage}
|
||||||
Oletetaan, että algoritmi aloittaa
|
Assume that the algorithm first creates a circuit
|
||||||
ensimmäisen kierroksen solmusta 1.
|
that begins at node 1.
|
||||||
Siitä syntyy kierros $1 \rightarrow 2 \rightarrow 3 \rightarrow 1$:
|
One possible circuit is
|
||||||
|
$1 \rightarrow 2 \rightarrow 3 \rightarrow 1$:
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tikzpicture}[scale=0.9]
|
\begin{tikzpicture}[scale=0.9]
|
||||||
\node[draw, circle] (1) at (3,5) {$1$};
|
\node[draw, circle] (1) at (3,5) {$1$};
|
||||||
|
@ -318,8 +320,8 @@ Siitä syntyy kierros $1 \rightarrow 2 \rightarrow 3 \rightarrow 1$:
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
\end{samepage}
|
\end{samepage}
|
||||||
|
After this, the algorithm adds
|
||||||
Seuraavaksi algoritmi lisää mukaan kierroksen
|
a subcircuit
|
||||||
$2 \rightarrow 5 \rightarrow 6 \rightarrow 2$:
|
$2 \rightarrow 5 \rightarrow 6 \rightarrow 2$:
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tikzpicture}[scale=0.9]
|
\begin{tikzpicture}[scale=0.9]
|
||||||
|
@ -350,8 +352,7 @@ $2 \rightarrow 5 \rightarrow 6 \rightarrow 2$:
|
||||||
\path[draw=red,thick,->,line width=2pt] (3) -- node[font=\small,label={[red]east:6.}] {} (1);
|
\path[draw=red,thick,->,line width=2pt] (3) -- node[font=\small,label={[red]east:6.}] {} (1);
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
Finally, the algorithm adds a subcircuit
|
||||||
Lopuksi algoritmi lisää mukaan kierroksen
|
|
||||||
$6 \rightarrow 3 \rightarrow 4 \rightarrow 7 \rightarrow 6$:
|
$6 \rightarrow 3 \rightarrow 4 \rightarrow 7 \rightarrow 6$:
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tikzpicture}[scale=0.9]
|
\begin{tikzpicture}[scale=0.9]
|
||||||
|
@ -386,17 +387,16 @@ $6 \rightarrow 3 \rightarrow 4 \rightarrow 7 \rightarrow 6$:
|
||||||
\path[draw=red,thick,->,line width=2pt] (3) -- node[font=\small,label={[red]east:10.}] {} (1);
|
\path[draw=red,thick,->,line width=2pt] (3) -- node[font=\small,label={[red]east:10.}] {} (1);
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
Now all edges are included in the circuit,
|
||||||
|
so we have successfully constructed an Eulerian circuit.
|
||||||
|
|
||||||
Nyt kaikki kaaret ovat kierroksessa,
|
\section{Hamiltonian path}
|
||||||
joten Eulerin kierros on valmis.
|
|
||||||
|
|
||||||
\section{Hamiltonin polku}
|
\index{Hamiltonian path}
|
||||||
|
|
||||||
\index{Hamiltonin polku@Hamiltonin polku}
|
A \key{Hamiltonian path} is a path
|
||||||
\key{Hamiltonin polku}
|
that visits each node in the graph exactly once.
|
||||||
on verkossa oleva polku,
|
For example, the graph
|
||||||
joka kulkee tarkalleen kerran jokaisen solmun kautta.
|
|
||||||
Esimerkiksi verkossa
|
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tikzpicture}[scale=0.9]
|
\begin{tikzpicture}[scale=0.9]
|
||||||
\node[draw, circle] (1) at (1,5) {$1$};
|
\node[draw, circle] (1) at (1,5) {$1$};
|
||||||
|
@ -413,7 +413,7 @@ Esimerkiksi verkossa
|
||||||
\path[draw,thick,-] (4) -- (5);
|
\path[draw,thick,-] (4) -- (5);
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
on Hamiltonin polku solmusta 1 solmuun 3:
|
contains a Hamiltonian path from node 1 to node 3:
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tikzpicture}[scale=0.9]
|
\begin{tikzpicture}[scale=0.9]
|
||||||
\node[draw, circle] (1) at (1,5) {$1$};
|
\node[draw, circle] (1) at (1,5) {$1$};
|
||||||
|
@ -436,11 +436,12 @@ on Hamiltonin polku solmusta 1 solmuun 3:
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
||||||
\index{Hamiltonin kierros@Hamiltonin kierros}
|
\index{Hamiltonian circuit}
|
||||||
Jos Hamiltonin polun alku- ja loppusolmu on sama,
|
|
||||||
kyseessä on \key{Hamiltonin kierros}.
|
If a Hamiltonian path begins and ends at the same node,
|
||||||
Äskeisessä verkossa on myös
|
it is called a \key{Hamiltonian circuit}.
|
||||||
Hamiltonin kierros, jonka alku- ja loppusolmu on solmu 1:
|
The graph above also has an Hamiltonian circuit
|
||||||
|
that begins and ends at node 1:
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tikzpicture}[scale=0.9]
|
\begin{tikzpicture}[scale=0.9]
|
||||||
\node[draw, circle] (1) at (1,5) {$1$};
|
\node[draw, circle] (1) at (1,5) {$1$};
|
||||||
|
@ -464,89 +465,85 @@ Hamiltonin kierros, jonka alku- ja loppusolmu on solmu 1:
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
||||||
\subsubsection{Olemassaolo}
|
\subsubsection{Existence}
|
||||||
|
|
||||||
Hamiltonin polun olemassaoloon ei tiedetä
|
No efficient way is known to check if a graph
|
||||||
mitään verkon rakenteeseen liittyvää ehtoa,
|
contains a Hamiltonian path.
|
||||||
jonka voisi tarkistaa tehokkaasti.
|
Still, in some special cases we can be certain
|
||||||
Joissakin erikoistapauksissa voidaan silti sanoa
|
that the graph contains a Hamiltonian path.
|
||||||
varmasti, että verkossa on Hamiltonin polku.
|
|
||||||
|
|
||||||
Yksinkertainen havainto on, että jos verkko on täydellinen
|
A simple observation is that if the graph is complete,
|
||||||
eli jokaisen solmun välillä on kaari,
|
i.e., there is an edge between all pairs of nodes,
|
||||||
niin siinä on Hamiltonin polku.
|
it also contains a Hamiltonian path.
|
||||||
Myös vahvempia tuloksia on saatu aikaan:
|
Also stronger results have been achieved:
|
||||||
|
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item
|
\item
|
||||||
\index{Diracin lause@Diracin lause}
|
\index{Dirac's theorem}
|
||||||
\key{Diracin lause}:
|
\key{Dirac's theorem}:
|
||||||
Jos jokaisen verkon solmun aste on $n/2$ tai suurempi,
|
If the degree of each node is at least $n/2$,
|
||||||
niin verkossa on Hamiltonin polku.
|
the graph contains a Hamiltonian path.
|
||||||
\item
|
\item
|
||||||
\index{Oren lause@Oren lause}
|
\index{Ore's theorem}
|
||||||
\key{Oren lause}:
|
\key{Ore's theorem}:
|
||||||
Jos jokaisen ei-vierekkäisen solmuparin asteiden summa
|
If the sum of degrees of each non-adjacent pair of nodes
|
||||||
on $n$ tai suurempi,
|
is at least $n$,
|
||||||
niin verkossa on Hamiltonin polku.
|
the graph contains a Hamiltonian path.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
Yhteistä näissä ja muissa tuloksissa on,
|
A common feature in these theorems and other results is
|
||||||
että ne takaavat Hamiltonin polun olemassaolon,
|
that they guarantee that a Hamiltonian path exists
|
||||||
jos verkossa on \textit{paljon} kaaria.
|
if the graph has \emph{a lot} of edges.
|
||||||
Tämä on ymmärrettävää, koska mitä enemmän
|
This makes sense because the more edges the graph has,
|
||||||
kaaria verkossa on, sitä enemmän mahdollisuuksia
|
the more possibilities we have to construct a Hamiltonian graph.
|
||||||
Hamiltonin polun muodostamiseen on olemassa.
|
|
||||||
|
|
||||||
\subsubsection{Muodostaminen}
|
\subsubsection{Construction}
|
||||||
|
|
||||||
Koska Hamiltonin polun olemassaoloa ei voi tarkastaa tehokkaasti,
|
Since there is no efficient way to check if a Hamiltonian
|
||||||
on selvää, että polkua ei voi myöskään muodostaa tehokkaasti,
|
path exists, it is clear that there is also no method
|
||||||
koska muuten polun olemassaolon voisi selvittää yrittämällä
|
for constructing the path efficiently, because otherwise
|
||||||
muodostaa sen.
|
we could just try to construct the path and see
|
||||||
|
whether it exists.
|
||||||
|
|
||||||
Yksinkertaisin tapa etsiä Hamiltonin polkua on käyttää
|
A simple way to search for a Hamiltonian path is
|
||||||
peruuttavaa hakua, joka käy läpi kaikki vaihtoehdot
|
to use a backtracking algorithm that goes through all
|
||||||
polun muodostamiseen.
|
possibilities how to construct the path.
|
||||||
Tällaisen algoritmin aikavaativuus on ainakin luokkaa $O(n!)$,
|
The time complexity of such an algorithm is at least $O(n!)$,
|
||||||
koska $n$ solmusta voidaan muodostaa $n!$ järjestystä,
|
because there are $n!$ different ways to form a path
|
||||||
jossa ne voivat esiintyä polulla.
|
from $n$ nodes.
|
||||||
|
|
||||||
Tehokkaampi tapa perustuu dynaamiseen ohjelmointiin
|
A more efficient solution is based on dynamic programming
|
||||||
luvun 10.4 tapaan.
|
(see Chapter 10.4).
|
||||||
Ideana on määritellä funktio $f(s,x)$,
|
The idea is to define a function $f(s,x)$,
|
||||||
jossa $s$ on verkon solmujen osajoukko ja
|
where $s$ is a subset of nodes, and $x$
|
||||||
$x$ on yksi osajoukon solmuista.
|
is one of the nodes in the subset.
|
||||||
Funktio kertoo, onko olemassa Hamiltonin polkua,
|
The function indicates whether there is a Hamiltonian path
|
||||||
joka käy läpi joukon $s$ solmut päätyen solmuun $x$.
|
that visits the nodes in $s$ and ends at node $x$.
|
||||||
Tällainen ratkaisu on mahdollista toteuttaa ajassa $O(2^n n^2)$.
|
It is possible to implement this solution in $O(2^n n^2)$ time.
|
||||||
|
|
||||||
\section{De Bruijnin jono}
|
\section{De Bruijn sequence}
|
||||||
|
|
||||||
\index{de Bruijnin jono@de Bruijnin jono}
|
\index{De Bruijn sequence}
|
||||||
|
|
||||||
\key{De Bruijnin jono}
|
A \key{De Bruijn sequence} is a string that contains
|
||||||
on merkkijono, jonka osajonona on tarkalleen
|
every string of length $n$
|
||||||
kerran jokainen $k$-merkkisen aakkoston
|
exactly once as a substring, for a fixed
|
||||||
$n$ merkin yhdistelmä.
|
alphabet that consists of $k$ characters.
|
||||||
Tällaisen merkkijonon pituus on
|
The length of such a string is
|
||||||
$k^n+n-1$ merkkiä.
|
$k^n+n-1$ characters.
|
||||||
Esimerkiksi kun $k=2$ ja $n=3$,
|
For example, when $n=3$ and $k=2$,
|
||||||
niin yksi mahdollinen de Bruijnin jono on
|
an example of a De Bruijn sequence is
|
||||||
\[0001011100.\]
|
\[0001011100.\]
|
||||||
Tämän merkkijono osajonot ovat kaikki
|
The substrings of this string are all
|
||||||
kolmen bitin yhdistelmät
|
combinations of three bits:
|
||||||
000, 001, 010, 011, 100, 101, 110 ja 111.
|
000, 001, 010, 011, 100, 101, 110 and 111.
|
||||||
|
|
||||||
Osoittautuu, että de Bruijnin jono
|
It turns out that each De Bruijn sequence
|
||||||
vastaa Eulerin kierrosta sopivasti
|
corresponds to an Eulerian circuit in a graph.
|
||||||
muodostetussa verkossa.
|
The idea is to construct the graph so that
|
||||||
Ideana on muodostaa verkko niin,
|
each node contains a combination of $n-1$ characters
|
||||||
että jokaisessa solmussa on $n-1$
|
and each edge adds one character to the string.
|
||||||
merkin yhdistelmä ja liikkuminen
|
The following graph corresponds to the example case:
|
||||||
kaarta pitkin muodostaa uuden
|
|
||||||
$n$ merkin yhdistelmän.
|
|
||||||
Esimerkin tapauksessa verkosta tulee seuraava:
|
|
||||||
|
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tikzpicture}
|
\begin{tikzpicture}
|
||||||
|
@ -568,26 +565,27 @@ Esimerkin tapauksessa verkosta tulee seuraava:
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
||||||
Eulerin kierros tässä verkossa tuottaa merkkijonon,
|
An Eulerian path in this graph produces a string
|
||||||
joka sisältää kaikki $n$ merkin yhdistelmät,
|
that contains all strings of length $n$.
|
||||||
kun mukaan otetaan aloitussolmun merkit sekä
|
The string contains the characters in the starting node,
|
||||||
kussakin kaaressa olevat merkit.
|
and all character in the edges.
|
||||||
Alkusolmussa on $n-1$ merkkiä ja kaarissa
|
The starting node contains $n-1$ characters
|
||||||
on $k^n$ merkkiä, joten tuloksena on
|
and there are $k^n$ characters in the edges,
|
||||||
lyhin mahdollinen merkkijono.
|
so the length of the string is $k^n+n-1$.
|
||||||
|
|
||||||
\section{Ratsun kierros}
|
\section{Knight's tour}
|
||||||
|
|
||||||
\index{ratsun kierros@ratsun kierros}
|
\index{knight's tour}
|
||||||
|
|
||||||
\key{Ratsun kierros} on tapa liikuttaa ratsua
|
A \key{knight's tour} is a sequence of moves
|
||||||
shakin sääntöjen mukaisesti $n \times n$ -kokoisella
|
of a knight on an $n \times n$ chessboard
|
||||||
shakkilaudalla niin,
|
following the rules of chess where the knight
|
||||||
että ratsu käy tarkalleen kerran jokaisessa ruudussa.
|
visits each square exactly once.
|
||||||
Ratsun kierros on \key{suljettu}, jos ratsu palaa lopuksi alkuruutuun,
|
The tour is \key{closed} if the knight finally
|
||||||
ja muussa tapauksessa kierros on \key{avoin}.
|
returns to the starting square and
|
||||||
|
otherwise the tour is \key{open}.
|
||||||
|
|
||||||
Esimerkiksi tapauksessa $5 \times 5$ yksi ratsun kierros on seuraava:
|
For example, here's a knight's tour on a $5 \times 5$ board:
|
||||||
|
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tikzpicture}[scale=0.7]
|
\begin{tikzpicture}[scale=0.7]
|
||||||
|
@ -620,31 +618,31 @@ Esimerkiksi tapauksessa $5 \times 5$ yksi ratsun kierros on seuraava:
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
||||||
Ratsun kierros shakkilaudalla vastaa Hamiltonin polkua verkossa,
|
A knight's tour corresponds to a Hamiltonian path in a graph
|
||||||
jonka solmut ovat ruutuja ja kahden solmun välillä on kaari,
|
whose nodes represent the squares of the board,
|
||||||
jos ratsu pystyy siirtymään solmusta toiseen shakin sääntöjen mukaisesti.
|
and two nodes are connected with an edge if a knight
|
||||||
|
can move between the squares according to the rules of chess.
|
||||||
|
|
||||||
Peruuttava haku on luonteva menetelmä ratsun kierroksen muodostamiseen.
|
A natural way to solve the problem is to use backtracking.
|
||||||
Hakua voi tehostaa erilaisilla \key{heuristiikoilla},
|
The search can be made more efficient by using
|
||||||
jotka pyrkivät ohjaamaan ratsua niin, että kokonainen kierros
|
\key{heuristics} that attempts to guide the knight so that
|
||||||
tulee valmiiksi nopeasti.
|
a complete tour will be found quickly.
|
||||||
|
|
||||||
\subsubsection{Warnsdorffin sääntö}
|
\subsubsection{Warnsdorff's rule}
|
||||||
|
|
||||||
\index{heuristiikka@heuristiikka}
|
\index{heuristic}
|
||||||
\index{Warnsdorffin sxxntz@Warnsdorffin sääntö}
|
\index{Warnsdorff's rule}
|
||||||
|
|
||||||
\key{Warnsdorffin sääntö} on yksinkertainen
|
\key{Warnsdorff's rule} is a simple and good heuristic
|
||||||
ja hyvä heuristiikka
|
for finding a knight's tour.
|
||||||
ratsun kierroksen etsimiseen.
|
Using the rule, it is possible to efficiently find a tour
|
||||||
Sen avulla on mahdollista löytää nopeasti ratsun kierros
|
even on a large board.
|
||||||
suurestakin ruudukosta.
|
The idea is to always move the knight so that it ends up
|
||||||
Ideana on siirtää ratsua aina niin,
|
in a square where the number of possible moves is as
|
||||||
että se päätyy ruutuun, josta on mahdollisimman \emph{vähän}
|
\emph{small} as possible.
|
||||||
mahdollisuuksia jatkaa kierrosta.
|
|
||||||
|
|
||||||
Esimerkiksi seuraavassa tilanteessa on valittavana
|
For example, in the following case there are five
|
||||||
viisi ruutua, joihin ratsu voi siirtyä:
|
possible squares where the knight can move:
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tikzpicture}[scale=0.7]
|
\begin{tikzpicture}[scale=0.7]
|
||||||
\draw (0,0) grid (5,5);
|
\draw (0,0) grid (5,5);
|
||||||
|
@ -657,8 +655,9 @@ viisi ruutua, joihin ratsu voi siirtyä:
|
||||||
\node at (3.5,1.5) {$d$};
|
\node at (3.5,1.5) {$d$};
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
Tässä tapauksessa Warnsdorffin sääntö valitsee ruudun $a$,
|
In this case, Warnsdorff's rule moves the knight to square $a$,
|
||||||
koska tämän valinnan jälkeen on vain yksi mahdollisuus
|
because after this choice there is only a single possible move.
|
||||||
jatkaa kierrosta. Muissa valinnoissa mahdollisuuksia olisi kolme.
|
The other choices would move the knight to squares where
|
||||||
|
there are three moves available.
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue