Você está na página 1de 7

Problema NP-Completo: Subset sum

Instituto de Informtica Universidade Federal do Rio Grande do Sul


19/12/2010

Csar Garcia Daudt Caio Licks Pires de Miranda

Resumo
Este artigo se prope a apresentar o problema da soma do subconjunto e mostrar, a partir de uma prova matemtica, que este problema NPCompleto. Assim, aps uma breve introduo, mostraremos que ele pode ser vericado em tempo polinomial (dado um certicado e uma instncia) e que possvel reduzir o problema NP-Completo 3-SAT (que tambm ser brevemente apresentado e explanado) ao do soma do subconjunto.

1
1.1

Introduo
Caracterizao do problema e rea de aplicao
subset sum problem

O problema da soma do subconjunto (em ingls, em, dado um conjunto de


S S

) consiste
S'

de inteiros, vericar se existe algum subconjunto


t

tal que a soma de seus elementos seja igual a um nmero-alvo

[1].

Um exemplo seria o seguinte:

Seja

o conjunto

{1, 2, 5, 9, -3}

o nmero alvo

Se consideramos o subconjunto

S' = {1, 9, -3}

, temos uma resposta posiS'

tiva ao problema, pois a soma dos elementos de

igual a t.

Se t

= 20

, no entanto, no existe subconjunto de S que possua como soma


S

de seus elementos este valor - de fato, o maior valor da soma de qualquer subconjunto de
17

O problema da soma do subconjunto tem aplicaes no campo da criptograa. Esta rea utiliza com freqncia problemas matemticos de particionamento de conjuntos, tpico no qual podemos inserir o problema referido. [2]

Prova

A prova de que este problema NP-Completo ser dada em dois passos: em 2.1, mostraremos que o problema da soma do subconjunto pode ser vericado em tempo polinomial - o que caracteriza todos os problemas da classe NP. Em 2.2, mostraremos que o problema 3-SAT pode ser reduzido em tempo polinomial ao problema apresentado nesse artigo. Em cada uma das provas, dar-se- um exemplo, de forma a elucidar o leitor sobre a demonstrao realizada.
2.1 Subset sum est em NP

2.1.1

Algoritmo de vericao e sua complexidade


S'

A demonstrao de que o problema em questo est na classe NP trivial: basta elaborarmos um algoritmo que, ao receber o subconjunto de t, ou 2.1.1.
1 2 3 4 5 6
false

(certicado)

e o nmero-alvo t, retorne true caso a soma dos elementos de S' for igual ao valor caso contrrio. O pseudocdigo deste algoritmo apresentado em

def verify_subset_sum ( Sl , t ) :
sum = 0

for i in S l :
sum += i

return ( sum == t )
Se considerarmos a soma como operao elementar e n o nmero de elementos de Sl, vemos claramente que o cdigo acima possui complexidade O(n), uma vez que a iterao da linha 3 executar NP.
n

vezes a acumulao do valor de

sum

Assim, mostramos que o problema da soma do subconjunto pertence classe

2.1.2

Exemplo de vericao
S

Seja

o conjunto

{1, 2, 16, 42}

e 2

o nmero alvo

21

Consideremos o subconjunto
igual a
17

S' = {1, 16}

. A soma dos valores de

S'

. Como este valor diferente de t, temos um retorno negativo

vericao do problema.
2.2 Subset sum NP-completo

2.2.1

Sobre o 3-SAT
k

O problema 3-SAT (s vezes tambm chamado de 3-CNF-SAT) consiste em, dada uma frmula lgica com clusulas unidas pelo operador lgico e
n

com exatamente 3 literais cada (estes unidos pelo operador ), encontrar a combinao de valores-verdade das [1] Este problema foi mostrado ser NP-Completo no ano de 1972 por Richard Karp, no mesmo artigo em que provou a NP-Completude de uma verso do problema da mochila muito similar ao problema da soma do subconjunto. [3] Assim, se reduzirmos o 3-SAT em tempo polinomial ao Subset sum, mostraremos que ele tambm NP-Completo. literais de tal forma que seja satisfeita.

2.2.2

Algoritmo de reduo e sua complexidade

O algoritmo de reduo do 3-SAT no Subset Sum como segue. Vale lembrar que tanto a prova quanto o algoritmo assumem que no possui nenhuma clusula com os literais x e x simultaneamente e que no incluiremos nenhum literal

y que no faa parte de em nosso mapeamento. No entanto, essas hipteses


no fazem a demonstrao perder a generalidade. Com o intuito de facilitar o entendimento do leitor, segue uma descrio da seqncia de passos do pseudocdigo (sugere-se o acompanhamento em conjunto com o exemplo em 2.2.3):

Para cada um dos

literais de , criaremos dois nmeros: vi (corresponn+k

dente ao literal xi ) e vi (correspondente ao literal xi ). Esses nmeros possuiro exatamente cdigo) dgitos, sendo que cada dgito indicar um
create_numbers_from_literal

literal ou uma clusula (funo

do pseudo-

Para cada uma das


n+k

clusulas criaremos dois nmeros: si e si (correscre-

pondentes clusula Ck ). Estes nmeros tambm possuiro exatamente dgitos, cada um indicando um literal ou uma clusula (funo do pseudocdigo). 3
ate_numbers_from_clause

Para todos os vi e vi faremos o seguinte:

 Colocaremos com o valor 1 os dgitos do nmero em questo que


corresponderem ao literal que o originou (xi ou xi nesse caso) e tambm os correspondentes s clusulas em que o literal que originou esse nmero aparece (assim, se xi est na clusula Cj , o dgito desta clusula em vi tem valor 1)

 Caso contrrio, os dgitos possuem valor 0.


Para todos si , colocaremos 1 no dgito correspondente clusula que o
gerou e 0 nos outros.

Para todos si , colocaremos 2 no dgito correspondente clusula que o


gerou e 0 nos outros. Os nmeros supracitados pertencem ao conjunto S. Alm deles, geraremos nosso nmero-alvo t, que tambm possuir n+k dgitos, sendo os correspondentes aos literais iguais a 1 e os demais (clusulas) iguais 4. A idia por trs deste mapeamento a seguinte:

Selecionaremos para o conjunto


a
t

S'

aqueles nmeros cuja soma seja igual

As implicaes dessa seleo so as seguintes:

Se selecionarmos o nmero vi , o literal xi possui valor-verdade 1 em . Se o nmero selecionado for vi , o literal xi possui valor-verdade 0 em . Os nmeros sj e sj selecionados servem apenas para forar que a soma
nos dgitos correspondentes s clusulas seja exatamente 4, conforme a construo do nmero-alvo t.
1 2 3 4 5 6 7 8

def r e d u c t i o n ( p h i )
f o r e a c h l i t in p h i . l i t e r a l s S . add ( c r e a t e _ n u m b e r s _ f r o m _ l i t e r a l ( l i t ) ) f o r e a c h c l in p h i . c l a u s e s S . add ( create_numbers_from_clause ( c l ) )

return ( S )
4

Se consideramos que as funes


create_numbers_from_clause

create_numbers_from_literal

possuem custo 2 - uma vez que so responsveis

pela criao de 2 nmeros cada - vemos que esse que esse algoritmo possui custo

2n + 2k = 2(n + k ) (linhas 2 e 5, respectivamente), cuja complexidade pode ser


descrita como O(n+k). Nesse caso, conforme j dito anteriormente, nmero de literais e
k n

indica o

o nmero de clusulas da frmula .

O mapemanto demonstrado nessa seo prova que o problema 3-SAT pode ser reduzido em tempo polinomial para o problema da soma do subconjunto. Essa prova conclui o que nos propomos a mostrar: o subset NP-Completo.
sum

um problema

2.2.3

Exemplo de reduo

Neste exemplo, consideraremos o seguinte:

= C1 C2 C3 C4 . C1 = x1 x2 x3 . C2 = x1 x2 x3 . C3 = x1 x2 x3 . C4 = x1 x2 x3 .
Observadas essas condies, a tabela em 1 corresponde execuo da reduo descrita em 2.2 (excetuando-se t, todas as linhas da tabela correspondem aos nmeros de
S

).

Figura 1: Tabela da execuo do algoritmo As linhas em cinza claro na tabela correspondem aos nmeros selecionados para
S'

. Assim, temos:

S = {1000110; 101110; 10011; 1000; 2000; 200; 10; 1; 2} t=


sS

s = 1114444

Pela tabela, podemos inferir que a seguinte combinao de valores lgicos satisfaz : x1 = 0, x2 = 0, x3 = 1.

Referncias

Referncias
[1] Cormen Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Cliord.
Introduction to Algorithms

, The MIT Press, 2nd edition, 2002. , disponvel em http:

[2]

Subset sum problem - Wikipedia, the free encyclopedia

//en.wikipedia.org/wiki/Subset_sum_problem.
6

[3] Karp, Richard M. Reducibility Among Combinatorial Problems. Complexity


of Computer Computations

. New York: Plenum. p. 85103, 1972.