This commit is contained in:
Antti H S Laaksonen 2017-01-02 20:29:56 +02:00
parent 3441c7f60e
commit c5d795fbbd
1 changed files with 61 additions and 60 deletions

View File

@ -622,25 +622,23 @@ because each value $f(y,x)$ can be calculated
in constant time using the values of the in constant time using the values of the
adjacent squares. adjacent squares.
\section{Repunpakkaus} \section{Knapsack}
\index{repunpakkaus@repunpakkaus} \index{knapsack}
\key{Repunpakkaus} on klassinen ongelma, \key{Knapsack} is a classic problem where we
jossa annettuna on $n$ tavaraa, are given $n$ objects with weights
joiden painot ovat $p_1,p_2,\ldots,p_n$ and values
$p_1,p_2,\ldots,p_n$ ja arvot ovat
$a_1,a_2,\ldots,a_n$. $a_1,a_2,\ldots,a_n$.
Tehtävänä on valita reppuun pakattavat tavarat Our task is to choose a subset of the objects
niin, että tavaroiden such that the sum of the weights is at most $x$
painojen summa on enintään $x$ and the sum of the values is as large as possible.
ja tavaroiden arvojen summa on mahdollisimman suuri.
\begin{samepage} \begin{samepage}
Esimerkiksi jos tavarat ovat For example, if the objects are
\begin{center} \begin{center}
\begin{tabular}{rrr} \begin{tabular}{rrr}
tavara & paino & arvo \\ object & weight & value \\
\hline \hline
A & 5 & 1 \\ A & 5 & 1 \\
B & 6 & 3 \\ B & 6 & 3 \\
@ -649,65 +647,68 @@ D & 5 & 3 \\
\end{tabular} \end{tabular}
\end{center} \end{center}
\end{samepage} \end{samepage}
ja suurin sallittu yhteispaino on 12, and the maximum total weight is 12,
niin paras ratkaisu on pakata reppuun tavarat $B$ ja $D$. the optimal solution is to select objects $B$ and $D$.
Niiden yhteispaino $6+5=11$ ei ylitä rajaa 12 Their total weight $6+5=11$ doesn't exceed 12,
ja arvojen summa and their total value $3+3=6$ is as large as possible.
on $3+3=6$, mikä on paras mahdollinen tulos.
Tämä tehtävä on mahdollista ratkaista kahdella eri This task is possible to solve in two different ways
tavalla dynaamisella ohjelmoinnilla using dynamic programming.
riippuen siitä, tarkastellaanko ongelmaa We can either regard the problem as maximizing the
maksimointina vai minimointina. total value of the objects or
Käymme seuraavaksi läpi molemmat ratkaisut. minimizing the total weight of the objects.
\subsubsection{Ratkaisu 1} \subsubsection{Solution 1}
\textit{Maksimointi:} Merkitään $f(k,u)$ \textit{Maximization:} Let $f(k,u)$
suurinta mahdollista tavaroiden yhteisarvoa, denote the largest possible total value
kun reppuun pakataan jokin osajoukko when a subset of objects $1 \ldots k$ is selected
tavaroista $1 \ldots k$, such that the total weight is $u$.
jossa tavaroiden yhteispaino on $u$. The solution for the problem is
Ratkaisu tehtävään on suurin arvo the largest value
$f(n,u)$, kun $0 \le u \le x$. $f(n,u)$ where $0 \le u \le x$.
Rekursiivinen kaava funktion laskemiseksi on A recursive formula for calculating
\[f(k,u) = \max(f(k-1,u),f(k-1,u-p_k)+a_k),\] the function is
koska kohdassa $k$ oleva tavara joko otetaan tai ei oteta \[f(k,u) = \max(f(k-1,u),f(k-1,u-p_k)+a_k)\]
mukaan ratkaisuun. because we can either include or not include
Pohjatapauksina on $f(0,0)=0$ ja $f(0,u)=-\infty$, object $k$ in the solution.
kun $u \neq 0$. Tämän ratkaisun aikavaativuus on $O(nx)$. The base cases are $f(0,0)=0$ and $f(0,u)=-\infty$
when $u \neq 0$. The time compexity of
the solution is $O(nx)$.
Esimerkin tilanteessa optimiratkaisu on In the example case, the optimal solution is
$f(4,11)=6$, joka muodostuu seuraavan ketjun kautta: $f(4,11)=6$ that can be constructed
using the following sequence:
\[f(4,11)=f(3,6)+3=f(2,6)+3=f(1,0)+3+3=f(0,0)+3+3=6.\] \[f(4,11)=f(3,6)+3=f(2,6)+3=f(1,0)+3+3=f(0,0)+3+3=6.\]
\subsubsection{Ratkaisu 2} \subsubsection{Solution 2}
\textit{Minimointi:} Merkitään $f(k,u)$ \textit{Minization:} Let $f(k,u)$
pienintä mahdollista tavaroiden yhteispainoa, denote the smallest possible total weight
kun reppuun pakataan jokin osajoukko when a subset of objects
tavaroista $1 \ldots k$, $1 \ldots k$ is selected such
jossa tavaroiden yhteisarvo on $u$. that the total weight is $u$.
Ratkaisu tehtävään on suurin arvo $u$, The solution for the problem is the
jolle pätee $0 \le u \le s$ ja $f(n,u) \le x$, largest value $u$
missä $s=\sum_{i=1}^n a_i$. for which $0 \le u \le s$ and $f(n,u) \le x$
Rekursiivinen kaava funktion laskemiseksi on where $s=\sum_{i=1}^n a_i$.
\[f(k,u) = \min(f(k-1,u),f(k-1,u-a_k)+p_k)\] A recursive formula for calculating the function is
ratkaisua 1 vastaavasti. \[f(k,u) = \min(f(k-1,u),f(k-1,u-a_k)+p_k).\]
Pohjatapauksina on $f(0,0)=0$ ja $f(0,u)=\infty$, kun $u \neq 0$. as in solution 1.
Tämän ratkaisun aikavaativuus on $O(ns)$. The base cases are $f(0,0)=0$ and $f(0,u)=\infty$
when $u \neq 0$.
The time complexity of the solution is $O(ns)$.
Esimerkin tilanteessa optimiratkaisu on In the example case, the optimal solution is $f(4,6)=11$
$f(4,6)=11$, joka muodostuu seuraavan ketjun kautta: that can be constructed using the following sequence:
\[f(4,6)=f(3,3)+5=f(2,3)+5=f(1,0)+6+5=f(0,0)+6+5=11.\] \[f(4,6)=f(3,3)+5=f(2,3)+5=f(1,0)+6+5=f(0,0)+6+5=11.\]
~\\ ~\\
Kiinnostava seikka on, että eri asiat syötteessä It is interesting to note how the features of the input
vaikuttavat ratkaisuiden tehokkuuteen. affect on the efficiency of the solutions.
Ratkaisussa 1 tavaroiden painot vaikuttavat tehokkuuteen The efficiency of solution 1 depends on the weights
mutta arvoilla ei ole merkitystä. of the objects, while the efficiency of solution 2
Ratkaisussa 2 puolestaan tavaroiden arvot vaikuttavat depends on the values of the objects.
tehokkuuteen mutta painoilla ei ole merkitystä.
\section{Editointietäisyys} \section{Editointietäisyys}