Skip to content

Commit ed52165

Browse files
committed
add aulas 19~21, reduction and Karp
1 parent bd366d7 commit ed52165

File tree

13 files changed

+1966
-0
lines changed

13 files changed

+1966
-0
lines changed

Aulas/aula19.pdf

155 KB
Binary file not shown.

Aulas/aula20.pdf

170 KB
Binary file not shown.

Aulas/aula21.pdf

132 KB
Binary file not shown.

Listas/Complexidade Computacional.pdf

146 KB
Binary file not shown.

Livros/karp.pdf

10.4 MB
Binary file not shown.

reducao-subset-sum/caption2.sty

Lines changed: 406 additions & 0 deletions
Large diffs are not rendered by default.

reducao-subset-sum/main.bbl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
\begin{thebibliography}{}
2+
3+
\bibitem[cs3 ]{cs360}
4+
Answers to assignment 4.
5+
\newblock \url{https://www.cs.mcgill.ca/~jmerce1/a4ans.html}.
6+
7+
\bibitem[wik ]{wiki}
8+
Partition problem.
9+
\newblock \url{https://en.wikipedia.org/wiki/Partition_problem}.
10+
11+
\bibitem[Nakayama ]{hwsoln13}
12+
Nakayama, M.
13+
\newblock Homework 13 solutions.
14+
\newblock \url{https://web.njit.edu/~marvin/cs341/hw/hwsoln13.pdf}.
15+
16+
\end{thebibliography}

reducao-subset-sum/main.ind

Whitespace-only changes.

reducao-subset-sum/main.tex

Lines changed: 264 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,264 @@
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}
166 KB
Binary file not shown.

reducao-subset-sum/sbc-template.bib

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
@MISC{hwsoln13,
2+
author = "Marvin Nakayama",
3+
title = "Homework 13 Solutions",
4+
HOWPUBLISHED = "\url{https://web.njit.edu/~marvin/cs341/hw/hwsoln13.pdf}"
5+
}
6+
@MISC{cs360,
7+
title = "Answers to Assignment 4",
8+
HOWPUBLISHED = "\url{https://www.cs.mcgill.ca/~jmerce1/a4ans.html}"
9+
}
10+
@MISC{wiki,
11+
title = "Partition problem",
12+
HOWPUBLISHED = "\url{https://en.wikipedia.org/wiki/Partition_problem}"
13+
}

0 commit comments

Comments
 (0)