Dynamic programming
This commit is contained in:
parent
e2f30d154d
commit
2d13a03056
120
luku16.tex
120
luku16.tex
|
@ -250,27 +250,28 @@ The search reaches node 2 whose state is 1
|
|||
which means the graph contains a cycle.
|
||||
In this case, the cycle is $2 \rightarrow 3 \rightarrow 5 \rightarrow 2$.
|
||||
|
||||
\section{Dynaaminen ohjelmointi}
|
||||
\section{Dynamic programming}
|
||||
|
||||
If a directed graph is acyclic,
|
||||
dynamic programming can be applied to it.
|
||||
For example, we can solve the following
|
||||
problems concerning paths from a starting node
|
||||
to an ending node efficiently in $O(n+m)$ time:
|
||||
|
||||
Jos suunnattu verkko on syklitön,
|
||||
siihen voi soveltaa dynaamista ohjelmointia.
|
||||
Tämän avulla voi ratkaista tehokkaasti
|
||||
ajassa $O(n+m)$ esimerkiksi seuraavat
|
||||
ongelmat koskien verkossa olevia polkuja
|
||||
alkusolmusta loppusolmuun:
|
||||
\begin{itemize}
|
||||
\item montako erilaista polkua on olemassa?
|
||||
\item mikä on lyhin/pisin polku?
|
||||
\item mikä on pienin/suurin määrä kaaria polulla?
|
||||
\item mitkä solmut esiintyvät varmasti polulla?
|
||||
\item how many different paths are there?
|
||||
\item what is the shortest/longest path?
|
||||
\item what is the minimum/maximum number of edges in a path?
|
||||
\item which nodes certainly appear in the path?
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection{Polkujen määrän laskeminen}
|
||||
\subsubsection{Counting the number of paths}
|
||||
|
||||
As an example, let's calculate the number of paths
|
||||
from a starting node to an ending node
|
||||
in a directed, acyclic graph.
|
||||
For example, in the graph
|
||||
|
||||
Lasketaan esimerkkinä polkujen määrä
|
||||
alkusolmusta loppusolmuun suunnatussa,
|
||||
syklittömässä verkossa.
|
||||
Esimerkiksi verkossa
|
||||
\begin{center}
|
||||
\begin{tikzpicture}[scale=0.9]
|
||||
\node[draw, circle] (1) at (1,5) {$1$};
|
||||
|
@ -289,16 +290,16 @@ Esimerkiksi verkossa
|
|||
\path[draw,thick,->,>=latex] (3) -- (6);
|
||||
\end{tikzpicture}
|
||||
\end{center}
|
||||
on 3 polkua solmusta 4 solmuun 6:
|
||||
there are 3 paths from node 4 to node 6:
|
||||
\begin{itemize}
|
||||
\item $4 \rightarrow 1 \rightarrow 2 \rightarrow 3 \rightarrow 6$
|
||||
\item $4 \rightarrow 5 \rightarrow 2 \rightarrow 3 \rightarrow 6$
|
||||
\item $4 \rightarrow 5 \rightarrow 3 \rightarrow 6$
|
||||
\end{itemize}
|
||||
Ideana on käydä läpi verkon solmut topologisessa järjestyksessä
|
||||
ja laskea kunkin solmun kohdalla yhteen eri suunnista
|
||||
tulevien polkujen määrät.
|
||||
Verkon topologinen järjestys on seuraava:
|
||||
The idea is to go through the nodes in a topological sort,
|
||||
and calculate for each node the total number of paths
|
||||
that reach the node from different directions.
|
||||
In this case, the topological sort is as follows:
|
||||
|
||||
\begin{center}
|
||||
\begin{tikzpicture}[scale=0.9]
|
||||
|
@ -318,7 +319,7 @@ Verkon topologinen järjestys on seuraava:
|
|||
\path[draw,thick,->,>=latex] (3) -- (6);
|
||||
\end{tikzpicture}
|
||||
\end{center}
|
||||
Tuloksena ovat seuraavat lukumäärät:
|
||||
The numbers of paths are as follows:
|
||||
|
||||
\begin{center}
|
||||
\begin{tikzpicture}[scale=0.9]
|
||||
|
@ -346,22 +347,22 @@ Tuloksena ovat seuraavat lukumäärät:
|
|||
\end{tikzpicture}
|
||||
\end{center}
|
||||
|
||||
Esimerkiksi solmuun 2 pääsee solmuista 1 ja 5.
|
||||
Kumpaankin solmuun päättyy yksi polku solmusta 4 alkaen,
|
||||
joten solmuun 2 päättyy kaksi polkua solmusta 4 alkaen.
|
||||
Vastaavasti solmuun 3 pääsee solmuista 2 ja 5,
|
||||
joiden kautta tulee kaksi ja yksi polkua solmusta 4 alkaen.
|
||||
For example, there is an edge to node 2 from nodes 1 and 5.
|
||||
There is one path from node 4 to both node 1 and 5,
|
||||
so there are two paths from node 4 to node 2.
|
||||
Correspondingly, there is an edge to node 3 from nodes 2 and 5
|
||||
that correspond to two and one paths from node 4.
|
||||
|
||||
\subsubsection{Dijkstran algoritmin sovellukset}
|
||||
\subsubsection{Extending Dijkstra's algorithm}
|
||||
|
||||
\index{Dijkstran algoritmi@Dijkstran algoritmi}
|
||||
\index{Dijkstra's algorithm}
|
||||
|
||||
Dijkstran algoritmin sivutuotteena syntyy suunnattu, syklitön verkko,
|
||||
joka kertoo jokaiselle alkuperäisen verkon solmulle,
|
||||
mitä tapoja alkusolmusta on päästä kyseiseen solmuun lyhintä
|
||||
polkua käyttäen.
|
||||
Tähän verkkoon voi soveltaa edelleen dynaamista ohjelmointia.
|
||||
Esimerkiksi verkossa
|
||||
A by-product of Dijkstra's algorithm is a directed, acyclic
|
||||
graph that shows for each node in the original graph
|
||||
the possible ways to reach the node using a shortest path
|
||||
from the starting node.
|
||||
Dynamic programming can be applied also to this graph.
|
||||
For example, in the graph
|
||||
\begin{center}
|
||||
\begin{tikzpicture}
|
||||
\node[draw, circle] (1) at (0,0) {$1$};
|
||||
|
@ -379,8 +380,8 @@ Esimerkiksi verkossa
|
|||
\path[draw,thick,-] (2) -- node[font=\small,label=above:2] {} (3);
|
||||
\end{tikzpicture}
|
||||
\end{center}
|
||||
solmusta 1 lähteviin lyhimpiin polkuihin kuuluvat
|
||||
seuraavat kaaret:
|
||||
the following edges can belong to the shortest paths
|
||||
from node 1:
|
||||
\begin{center}
|
||||
\begin{tikzpicture}
|
||||
\node[draw, circle] (1) at (0,0) {$1$};
|
||||
|
@ -398,10 +399,9 @@ seuraavat kaaret:
|
|||
\end{tikzpicture}
|
||||
\end{center}
|
||||
|
||||
Koska kyseessä on suunnaton, syklitön verkko,
|
||||
siihen voi soveltaa dynaamista ohjelmointia.
|
||||
Niinpä voi esimerkiksi laskea, montako lyhintä polkua
|
||||
on olemassa solmusta 1 solmuun 5:
|
||||
Now we can, for example, calculate the number of
|
||||
shortest paths from node 1 to node 5
|
||||
using dynamic programming:
|
||||
\begin{center}
|
||||
\begin{tikzpicture}
|
||||
\node[draw, circle] (1) at (0,0) {$1$};
|
||||
|
@ -425,23 +425,22 @@ on olemassa solmusta 1 solmuun 5:
|
|||
\end{tikzpicture}
|
||||
\end{center}
|
||||
|
||||
\subsubsection{Ongelman esitys verkkona}
|
||||
\subsubsection{Representing problems as graphs}
|
||||
|
||||
Itse asiassa mikä tahansa dynaamisen ohjelmoinnin
|
||||
ongelma voidaan esittää suunnattuna, syklittömänä verkkona.
|
||||
Tällaisessa verkossa solmuja ovat dynaamisen
|
||||
ohjelmoinnin tilat ja kaaret kuvaavat,
|
||||
miten tilat riippuvat toisistaan.
|
||||
Actually, any dynamic programming problem
|
||||
can be represented as a directed, acyclic graph.
|
||||
In such a graph, each node is a dynamic programming state,
|
||||
and the edges indicate how the states depend on each other.
|
||||
|
||||
Tarkastellaan esimerkkinä tuttua tehtävää,
|
||||
jossa annettuna on rahamäärä $x$
|
||||
ja tehtävänä on muodostaa se kolikoista
|
||||
As an example, consider the problem
|
||||
where our task is to form a sum of money $x$
|
||||
using coins
|
||||
$\{c_1,c_2,\ldots,c_k\}$.
|
||||
Tässä tapauksessa voimme muodostaa verkon, jonka solmut
|
||||
vastaavat rahamääriä ja kaaret kuvaavat
|
||||
kolikkojen valintoja.
|
||||
Esimerkiksi jos kolikot ovat $\{1,3,4\}$
|
||||
ja $x=6$, niin verkosta tulee seuraava:
|
||||
In this case, we can construct a graph where
|
||||
each node corresponds to a sum of money,
|
||||
and the edges show how we can choose coins.
|
||||
For example, for coins $\{1,3,4\}$ and $x=6$,
|
||||
the graph is as follows:
|
||||
\begin{center}
|
||||
\begin{tikzpicture}[scale=0.9]
|
||||
\node[draw, circle] (0) at (0,0) {$0$};
|
||||
|
@ -470,12 +469,11 @@ ja $x=6$, niin verkosta tulee seuraava:
|
|||
\end{tikzpicture}
|
||||
\end{center}
|
||||
|
||||
Tätä verkkoesitystä käyttäen
|
||||
lyhin polku solmusta 0 solmuun $x$
|
||||
vastaa ratkaisua, jossa kolikoita on
|
||||
mahdollisimman vähän, ja polkujen yhteismäärä
|
||||
solmusta 0 solmuun $x$
|
||||
on sama kuin ratkaisujen yhteismäärä.
|
||||
Using this representation,
|
||||
the shortest path from node 0 to node $x$
|
||||
corresponds to a solution with minimum number of coins,
|
||||
and the total number of paths from node 0 to node $x$
|
||||
equals the total number of solutions.
|
||||
|
||||
\section{Tehokas eteneminen}
|
||||
|
||||
|
|
Loading…
Reference in New Issue