Dynamic programming

This commit is contained in:
Antti H S Laaksonen 2017-01-08 17:07:23 +02:00
parent e2f30d154d
commit 2d13a03056
1 changed files with 59 additions and 61 deletions

View File

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