Chapter 19 first version

This commit is contained in:
Antti H S Laaksonen 2017-01-09 21:57:36 +02:00
parent 10619a5c9d
commit d91017299b
1 changed files with 226 additions and 227 deletions

View File

@ -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.