From 2d13a0305648cb62742a6947f881a049256a53b6 Mon Sep 17 00:00:00 2001 From: Antti H S Laaksonen Date: Sun, 8 Jan 2017 17:07:23 +0200 Subject: [PATCH] Dynamic programming --- luku16.tex | 120 ++++++++++++++++++++++++++--------------------------- 1 file changed, 59 insertions(+), 61 deletions(-) diff --git a/luku16.tex b/luku16.tex index 8fd433f..96f4dc1 100644 --- a/luku16.tex +++ b/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}