|
| 1 | +\documentclass[12pt]{article} |
| 2 | + |
| 3 | +\usepackage{sbc-template} |
| 4 | + |
| 5 | +\usepackage{graphicx,url} |
| 6 | +\usepackage{amsmath} |
| 7 | +\usepackage{enumitem} |
| 8 | +\usepackage[brazil]{babel} |
| 9 | +\usepackage[nottoc]{tocbibind} |
| 10 | +\usepackage[utf8]{inputenc} |
| 11 | +\usepackage[]{algorithm2e} |
| 12 | +\sloppy |
| 13 | + |
| 14 | +\title{Redução do Subset-Sum para o Set-Partition} |
| 15 | + |
| 16 | +\author{Arthur, Douglas, Felipe, Luiz, Sandro\\ |
| 17 | +RA105422, RA103654, RA102845, RA103491, RA98397} |
| 18 | +\address{Departamento de Informática -- Universidade Estadual de Maringá(UEM)} |
| 19 | + |
| 20 | +\begin{document} |
| 21 | + |
| 22 | +\maketitle |
| 23 | + |
| 24 | +\section{Breve descrição do Subset-Sum} |
| 25 | + |
| 26 | +Dado um conjunto (multiconjunto) $S = \{a_1,a_2,\cdots, a_n\}$ de números naturais e um valor $x$, descobrir se existe um subconjunto $S'\subseteq S$ tal que $\displaystyle\sum_{a \in S'} a = x$. Uma instância do problema terá resposta $true$ ou $false$. |
| 27 | + |
| 28 | +\subsection{Recorrência} |
| 29 | + |
| 30 | +$opt(S,x)\left\{\begin {matrix} |
| 31 | +true & se\;s=0\\ |
| 32 | +false & se\;n = 0 \wedge s\neq 0\\ |
| 33 | +opt(S-1,x) & se\;a_n \not\in S'\\ |
| 34 | +opt(S-1,x-a_n) & se\;a_n \in S' |
| 35 | +\end{matrix}\right.$ |
| 36 | + |
| 37 | +\subsection{Algoritmo Força Bruta} |
| 38 | + |
| 39 | +\begin{algorithm}[H] |
| 40 | +\SetKwFunction{SubsetSum}{SubsetSum} |
| 41 | +\SetAlgoFuncName{SubsetSum}{SubsetSum} |
| 42 | +\SubsetSum{S,x,n}{\\ |
| 43 | +\eIf{n = 0}{ |
| 44 | + \eIf{x = 0}{ans $\leftarrow true$}{ans $\leftarrow false$} |
| 45 | +} |
| 46 | +{ |
| 47 | + ans $\leftarrow$ \SubsetSum{S,x-S[n],n-1}\\ |
| 48 | + \If{ans = $false$ and $S[n] \leq x$}{ |
| 49 | + ans $\leftarrow$ \SubsetSum{S,x-S[n],n-1} |
| 50 | + } |
| 51 | +} |
| 52 | +\KwRet ans |
| 53 | +} |
| 54 | +\end{algorithm} |
| 55 | + |
| 56 | +\subsubsection{Análise de Complexidade} |
| 57 | + |
| 58 | +T(S,x) = T(S-1,x) + T(S-1,x-1) + $\Theta$(1) $\Rightarrow$ T(S,x) = $O(2^n)$ |
| 59 | +\subsection{Algoritmo Programação Dinâmica} |
| 60 | + |
| 61 | +\begin{algorithm}[H] |
| 62 | +\SetKwFunction{SubsetSumMemo}{SubsetSumMemo} |
| 63 | +\SetAlgoFuncName{SubsetSumMemo}{SubsetSumMemo} |
| 64 | +\SubsetSumMemo{S,x,n}{\\ |
| 65 | +\If{memo[n][x]=-1}{ |
| 66 | +\eIf{n = 0}{ |
| 67 | + \eIf{x = 0}{ans $\leftarrow true$}{ans $\leftarrow false$} |
| 68 | +} |
| 69 | +{ |
| 70 | + ans $\leftarrow$ \SubsetSumMemo{S,x-S[n],n-1}\\ |
| 71 | + \If{ans = $false$ and $S[n] \leq x$}{ |
| 72 | + ans $\leftarrow$ \SubsetSumMemo{S,x-S[n],n-1} |
| 73 | + } |
| 74 | +} |
| 75 | +ans $\leftarrow$ memo[n][x] |
| 76 | +} |
| 77 | +\KwRet memo[n][x] |
| 78 | +} |
| 79 | +\end{algorithm} |
| 80 | + |
| 81 | +\subsubsection{Análise de Complexidade} |
| 82 | + |
| 83 | +\# de subproblemas $\cdot$ tempo $/$ subproblemas = (n$\cdot$x)$\cdot$ $\Theta$(1) = $\Theta$(n$\cdot$x) |
| 84 | + |
| 85 | +\section{Breve descrição do Set-Partition} |
| 86 | + |
| 87 | +Dado um vetor de inteiros não negativos $P = \{p_1, p_2, \cdots, p_n\}$, decidir se há como dividir o vetor $P$ em dois subvetores, $Q_1$ e $Q_2$ tal que $\displaystyle\sum_{p' \in Q_1} p' = \displaystyle\sum_{p'' \in Q_2} p''$ e $Q_1 \cup Q_2 = P$. Uma instância do problema terá resposta $true$ ou $false$. |
| 88 | + |
| 89 | +\subsection{Recorrência} |
| 90 | + |
| 91 | +$opt(P,sum,n)\left\{\begin {matrix} |
| 92 | +false & se\;sum\% 2 = 1\\ |
| 93 | +SubsetSum(P,\frac{sum}{2},n) & se\;sum\% 2 = 0 |
| 94 | +\end{matrix}\right.$ |
| 95 | + |
| 96 | +\subsection{Algoritmo Força Bruta} |
| 97 | + |
| 98 | +\begin{algorithm}[H] |
| 99 | +\SetKwFunction{Partition}{Partition} |
| 100 | +\SetKwFunction{SubSetSumMemo}{SubSetSumMemo} |
| 101 | +\SetAlgoFuncName{Partition}{Partition} |
| 102 | +\SetAlgoFuncName{SubSetSumMemo}{SubSetSumMemo} |
| 103 | +\Partition{arr,n}{\\ |
| 104 | + sum $\leftarrow$ 0\\ |
| 105 | + \For{$i\leftarrow 1$ \KwTo n}{ |
| 106 | + sum $+=$ arr[i] |
| 107 | + } |
| 108 | + \If{sum\% 2 $\neq$ 0}{ |
| 109 | + \KwRet false |
| 110 | + } |
| 111 | + \KwRet \SubSetSumMemo{arr, $\frac{sum}{2}$,n} |
| 112 | +} |
| 113 | +\end{algorithm} |
| 114 | + |
| 115 | +\subsubsection{Análise de Complexidade} |
| 116 | + |
| 117 | +$\begin{matrix} |
| 118 | +Complexidade&=& n + \Theta(SubSetSumMemo)\\ |
| 119 | + \ &=& (n + (n \cdot x)) \cdot \Theta(1)\\ |
| 120 | + \ &=& O(n \cdot x) |
| 121 | +\end{matrix}$ |
| 122 | + |
| 123 | +\section{Set-Partition $\in$ $NP$} \label{sec:PartitionInNP} |
| 124 | + |
| 125 | +$Certificado$: Subconjunto $A$ tal que $A \subseteq S$. É possível verificar se os conjuntos $A$ e ($S-A$) têm somas iguais em tempo polinomial, bastando para isso somar os elementos do conjunto $A$ e os elementos do conjunto ($S-A$) e comparar a soma. Se esses números forem iguais, podemos afirmar que é $verdadeiro$. |
| 126 | + |
| 127 | +\subsection{Algoritmo verificador} |
| 128 | +\begin{algorithm}[H] |
| 129 | +\SetKwFunction{Verificador}{Verificador} |
| 130 | +\SetAlgoFuncName{Verificador}{Verificador} |
| 131 | +\Verificador{S,A}{\\ |
| 132 | + Soma $\leftarrow$ soma dos elementos de A\\ |
| 133 | + \For{$i\leftarrow 1$ \KwTo A.lenght}{ |
| 134 | + Flag $\leftarrow$ $False$\\ |
| 135 | + \For{$j \leftarrow 1$ \KwTo S.lenght}{ |
| 136 | + \If{A[i] = S[j]}{ |
| 137 | + retire o elemento do vetor $S$\\ |
| 138 | + Flag $\leftarrow True$ |
| 139 | + } |
| 140 | + } |
| 141 | + \If{!Flag}{ |
| 142 | + \KwRet $False$ |
| 143 | + } |
| 144 | + |
| 145 | + } |
| 146 | + Soma2 $\leftarrow$ soma dos elementos de $S$\\ |
| 147 | + \eIf{Soma = Soma2}{ |
| 148 | + \KwRet $True$ |
| 149 | + }{ |
| 150 | + \KwRet $False$ |
| 151 | + } |
| 152 | +} |
| 153 | +\end{algorithm} |
| 154 | +\section{Primeira redução} |
| 155 | + |
| 156 | +Dado um vetor $S$ e um valor $x$, onde há um subconjunto $S' \subseteq S$ em que a soma de seus elementos é igual a $x$, assuma que $k$ é a soma de todos os elementos do conjunto $S$. |
| 157 | +Redução de instâncias do $SubsetSum$ a instâncias do $SetPartition$: Dado um vetor $S$ e um valor $x$, entrada do $SubsetSum$, a entrada para o $Partition$ será $P = S \cup \{k-2x\}$ (realizar a união leva tempo polinomial). Devemos provar que a instância $\{S,x\} \in SubsetSum$ retorna verdadeiro se, e somente se, $\{P\} \in SetPartition$ também for verdadeiro. |
| 158 | + |
| 159 | +\subsection{Ida} |
| 160 | + |
| 161 | +Se há em $S$ um subconjunto $S'$, cuja soma de seus elemento resulta no valor $x$, é possível particionar o conjunto $P$ em dois subconjuntos de mesma soma. Seja o conjunto $S'' = S - S'$ e a soma de seus elementos igual a $k-x$. A soma dos elementos de $S'$ com o elemento $k-2x$ é igual a ($k-2x$) $+ x = k-x$. Portanto, é possível formar dois subconjuntos com soma igual a $k-x$. |
| 162 | + |
| 163 | +\subsection{Volta} |
| 164 | + |
| 165 | +Se $P$ pode ser particionado em dois subconjuntos de somas iguais ($S''$ e $S' \cup \{k - 2x\}$), então é possível identificar um subconjunto de $S$ cuja soma seja $x$. Ao retirar o elemento $k - 2x$ do subconjunto $P - S''$, obtemos um subconjunto de $S'$ que possui soma $x$, que queríamos demonstrar. |
| 166 | + |
| 167 | +\subsection{Casos de teste} |
| 168 | +Seja ‘k’ a soma do conjunto $S$ do $SubsetSum$, $x$ o $target$ para este problema, $s'$ o subconjunto cuja soma resulta no valor $x$, $s'' = S - s'$. $P$ representa o vetor do $SetPartition$ com a redução aplicada. |
| 169 | + |
| 170 | +\subsubsection{Exemplo 1} |
| 171 | +Primeiro devemos definir uma instância de $SubsetSum$, $S = \{1,2,3,4\}$ cuja soma é 10, selecionando o subconjunto $\{3,4\}$ em que a soma é 7, ou seja, $x = 7$. Dessa maneira, precisamos calcular $\{k-2x\}$.\\ |
| 172 | +$k = 10;\\ x = 7;\\ s' = \{3,4\};\\ s'' = \{1,2\};\\ k - 2x = -4$ |
| 173 | +\\ |
| 174 | +Aplicando o algoritmo de redução, obtemos o conjunto $P$. |
| 175 | +\\ |
| 176 | +$\begin{matrix} |
| 177 | +P &=& S \cup \{k-2x\}\\ |
| 178 | +\ &=& \{1,2,3,4\} \cup \{-4\}\\ |
| 179 | +\ &=& \{1,2,3,4,-4\}\\ |
| 180 | +\ &=& s'' \cup (s' \cup \{k-2x\})\\ |
| 181 | +\ &=& \{1,2\} \cup \{3,4,-4\} |
| 182 | +\end{matrix}$ |
| 183 | +\\ |
| 184 | +\textbf{$\Rightarrow$} Note que há dois subconjuntos que resultam em $k - x = 3$, $s'' = \{1,2\}$ e $s' \cup \{k - 2x\} = \{3,4,-4\}$, pois a soma dos elementos de $s''$ será sempre $k - x$, visto que $x$ é a soma dos elementos de $s'$ e $s'' = S - s'$. A soma do conjunto restante, isto é, $P - s'' = s' \cup \{k-2x\} = \{3,4,-4\}$ que resulta no valor $x + k - 2x = k -x = 7 + 10 - 2\cdot7 = 3$. Portanto, podemos afirmar que existem dois subconjuntos que satisfazem o requisito do $SetPartition$.\\ |
| 185 | +\\ |
| 186 | +\textbf{$\Leftarrow$} Agora partindo do conjunto $P$, vamos mostrar que existe um subconjunto que somado dê o valor de $x$. Dentro do conjunto $P$ temos dois subconjuntos com somas iguais a $k - x = 3$. $P = s'' \cup (s' \cup \{k - 2x\}) = \{1,2\} \cup \{3,4,-4\}$, e ao retirarmos o elemento $k - 2x = - 4$ do subconjunto $P - s'' = \{3,4-4\}$, obtém-se o subconjunto $s' = \{3,4\}$ que como definido anterior, tem soma igual a $x = 7$. |
| 187 | +\\ |
| 188 | +\subsubsection{Exemplo 2} |
| 189 | +Vamos utilizar outra instância do $Subsetsum$ $S = \{6,2,5,10\}$ em que a soma de todos elementos é 23, e $x = 15$, o subconjunto cuja soma é $x$ é $s' = \{5,10\}$. Novamente, precisamos calcular $k - 2x$.\\ |
| 190 | +$K = 23;\\x = 15;\\s' = \{5,10\};\\s'' = \{6,2\};\\k - 2x = -7$ |
| 191 | +\\ |
| 192 | +Aplicando o algoritmo de redução, temos: |
| 193 | +\\ |
| 194 | +$\begin{matrix} |
| 195 | +P &=& S \cup \{k-2x\}\\ |
| 196 | +\ &=& \{6,2,5,10\} \cup \{-7\}\\ |
| 197 | +\ &=& \{6,2,5,10,-7\}\\ |
| 198 | +\ &=& s'' \cup (s' \cup \{k-2x\})\\ |
| 199 | +\ &=& \{6,2\} \cup \{5,10,-7\} |
| 200 | +\end{matrix}$ |
| 201 | +\\ |
| 202 | +\textbf{$\Rightarrow$} Note que novamente há dois subconjuntos que resultam em $k - x = 8$, $s'' = \{6,2\}$ e $s' \cup \{k - 2x\} = \{5,10,-7\}$. O motivo é análogo ao exemplo anterior. Portanto, podemos afirmar que existem dois subconjuntos que satisfazem o requisito do $SetPartition$ para retornar verdadeiro.\\ |
| 203 | +\\ |
| 204 | +\textbf{$\Leftarrow$} Partindo do conjunto $P$, verificaremos se existe um subconjunto somado que resulta no valor de $x$. Dentro do conjunto $P$ temos dois subconjuntos com somas iguais a $k - x = 8$. $P = s'' \cup (s' \cup \{k - 2x\}) = \{6,2\} \cup \{5,10,-7\}$, e ao retirarmos o elemento $k - 2x = - 7$ do subconjunto $P - s'' = \{5,10-7\}$, obtém-se o subconjunto $s' = \{5,10\}$ que, como definido anterior, tem soma igual a $x = 15$. |
| 205 | + |
| 206 | +\section{Segunda redução} |
| 207 | + |
| 208 | +Seja ($S,x$) uma instância qualquer do $SubsetSum$. Vamos transformar esta instância em uma instância do $Partition$. Seja $k$ igual a soma dos elementos de $S$ e $P = S \;\cup a_1\; \cup\; a_2$, onde $a_1$ e $a_2$ são:\\ |
| 209 | +$a_1 = 2k + x \\a_2 = 3k - x$\\ |
| 210 | +A inserção desses dois elementos em $P$ pode ser feita em tempo polinomial. |
| 211 | +\subsection{Ida} |
| 212 | + |
| 213 | +Assuma que para uma entrada ($S,x$) o $SubsetSum$ retorne $verdadeiro$, portanto, existe um subvetor $S'\subseteq S$, tal que a soma de seus elementos é igual a $x$. Então, existe um conjunto $P = \{\{S - S'\} \cup \{a_1\} , S' \cup a_2\}$ que retorna verdadeiro para o $SetPartition$.\\ |
| 214 | +Calculando ($k - x$) $+$ ($2k + x$) , ($x$) $+$ ($3k - x$) fazemos as operações de união,em tempo polinomial, que resulta em dois subconjuntos cujo a soma de seus elementos é $3k$. Com isso podemos afirmar que haverá dois subconjuntos em $P$ que contém a mesma soma. |
| 215 | + |
| 216 | +\subsection{Volta} |
| 217 | + |
| 218 | +Agora assumimos que existem dois subconjuntos $P_1 \subseteq P$ e $P_2 \subseteq P$ tal que $P_1 \neq P_2$ e $\{P_1\} \cup \{P_2\} = P$, cujas somas possuem o mesmo valor. Como $P = \{\{S\},a_1,a_2\}$, a soma de todos os elementos contidos em $P$ é igual a $6k$. E com isso podemos garantir que $a_1$ e $a_2$ não podem aparecer no mesmo subconjunto, sendo assim, podemos supor que $a_1 \in P_1$ e $a_2 \in P_2$. Então, se fizermos $\{P_2\} - a_2$, é equivalente a fazermos $3k - $($3k - x$), que resulta em $x$. Portanto, está demonstrado que existe um valor $x \in P$ que satisfaz o problema do $SubsetSum$. |
| 219 | + |
| 220 | +\subsection{Caso de teste} |
| 221 | +Nesses exemplos, utilizaremos $k$ como a soma dos elementos do nosso conjunto inicial $S$, a variável $x$ será o $target$ do problema $SubsetSum$ e o vetor $s'$ é o subconjunto cuja soma resulta no valor $x$. |
| 222 | +\subsubsection{Exemplo 1} |
| 223 | +Utilizaremos uma instância de $SubsetSum$, pegando o vetor $S = \{2,5,3,9\}$, onde a soma de todos elementos é 19, selecionamos o subvetor $\{2,5\}$ em que a soma é 7. A partir do vetor $S$ vamos criar dois elementos $a_1$ e $a_2$.\\ |
| 224 | +$K = 19;\\x = 7;\\s' = \{2,5\};\\a_1 = 2k + x = 45;\\a_2 = 3k - x = 50$ |
| 225 | +\\ |
| 226 | +Aplicando o algoritmo de redução, obtemos o vetor $P$. |
| 227 | +\\ |
| 228 | +$\begin{matrix} |
| 229 | +P &=& \{\{S - s'\} \cup \{a_1\} , \{s' \cup a_2\}\}\\ |
| 230 | +\ &=& \{\{S - s'\} \cup \{a_1\} , \{s' \cup a_2\}\}\\ |
| 231 | +\ &=& \{\{\{2,5,3,9\} - \{2,5\} \cup \{45\}\} , \{\{2,5\} \cup \{50\}\}\}\\ |
| 232 | +\ &=& \{\{3,9,45\} , \{2,5,50\}\} |
| 233 | +\end{matrix}$\\ |
| 234 | +Note que a soma de $S$ é 19, ou seja, com a soma ímpar seria impossível o $SetPartition$ retornar verdadeiro. Mas após a redução, a soma do vetor $P$ é igual a 114. Além disso dentro do vetor $P$ há dois vetores possuem soma igual a 57, sendo assim o $SetPartition$ é verdade.\\ |
| 235 | +Agora partindo do vetor $P$, vamos mostrar que existe um $x$ válido. Dentro do vetor $P$ temos dois vetores com soma igual que vamos denominar $s_1 = \{3,9,45\}$ e $s_2 = \{2,5,50\}$.\\ |
| 236 | +Aplicando o algoritmo de redução, obtemos o vetor $s'$:\\ |
| 237 | +$\begin{matrix} |
| 238 | +s' &=& \{\{s_2\} - \{a_2\}\}\\ |
| 239 | +\ &=& \{2,5,50\} - \{50\}\\ |
| 240 | +\ &=& \{2,5\} |
| 241 | +\end{matrix}$\\ |
| 242 | +Em que a soma do vetor $s'$ é igual a 7, que é o valor de $x$ que queríamos. |
| 243 | +\subsubsection{Exemplo 2} |
| 244 | +Vamos pegar outra instância do $SubsetSum$, o vetor $S = \{3,7, 4,16,8\}$ onde a soma de todos elementos é 38, o subvetor \{3,7\} que a soma resulta em 10. Vamos criar os dois elementos para adicionarmos ao vetor.\\ |
| 245 | +$K = 38;\\x = 10;\\s' = \{3,7\};\\a_1 = 2k + x = 86;\\a_2 = 3k - x = 104$\\ |
| 246 | +Aplicando o algoritmo de redução, temos:\\ |
| 247 | +$\begin{matrix} |
| 248 | +P &=& \{\{S - s'\} \cup \{a_1\} , \{s' \cup a_2\}\}\\ |
| 249 | +\ &=& \{\{3,7,4,16,8\} - \{3,7\} \cup \{86\}, \{3,7\} \cup \{104\}\}\\ |
| 250 | +\ &=& \{\{4,16,8,86\} , \{3,7,104\}\} |
| 251 | +\end{matrix}$\\ |
| 252 | +Vemos que o vetor $P$ possui soma equivalente a 228, além disso dentro do vetor existem dois subvetores $s_1 = \{4,16,8,86\}$ e $s_2 = \{3,7,104\}$ em que ambos possuem a mesma soma. Sendo assim o vetor $P$ retorna verdade para esse vetor.\\ |
| 253 | +Novamente, partindo do vetor $P$ vamos provar que existe um subvetor que tem a soma exata de $x$. Aplicando o algoritmo de redução, temos:\\ |
| 254 | +$\begin{matrix} |
| 255 | +s' &=& \{\{s_2\} - \{a_2\}\}\\ |
| 256 | +\ &=& \{3,7,104\} - \{104\}\\ |
| 257 | +\ &=& \{3,7\} |
| 258 | +\end{matrix}$\\ |
| 259 | +\bibliographystyle{sbc} |
| 260 | +\bibliography{sbc-template} |
| 261 | +\cite{hwsoln13}. |
| 262 | +\cite{cs360}. |
| 263 | +\cite{wiki}. |
| 264 | +\end{document} |
0 commit comments