Você está na página 1de 17

UNIVERSIDADE ESTADUAL DO CEAR

CENTRO DE CINCIAS E TECNOLOGIA


CURSO DE GRADUAO EM CINCIA DA COMPUTAO

JOO GONALVES FILHO & FELIPE DE ALMEIDA XAVIER

TRABALHO DE COMPLEXIDADE: PROBLEMA DA


MOCHILA VALIOSA

PROFESSOR: VALDISIO VIANA

FORTALEZA - CEAR
2012

RESUMO

Este trabalho aborda o Problema da Mochila Valiosa, em que temos que decidir dentre os objetos disponveis quais levar para a viagem na mochila, sendo que no podemos ultrapassar
o peso suportado pela mochila e devemos levar o mximo possvel de objetos mais valiosos.
Foram implementados diversos algoritmos para resolver o problema, indo desde um algoritmo
exato, como por Fora Bruta, at heursticas, como os algoritmos Gulosos por Peso, Utiliadade
e Custo Relativo como tambm um Algoritmo Gentico. No final deste trabalho expomos os
testes realizados com vrias instncias e um grfico comparando os algoritmos.

SUMRIO

1 DEFINIO DO PROBLEMA DA MOCHILA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2 ALGORITMOS PARA O PROBLEMA DA MOCHILA . . . . . . . . . . . . . . . . . . . . . . . . . .

2.1 Fora Bruta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.2 Programao Dinmica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.3 Algoritmo Guloso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.4 Algoritmo Gentico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3 RESULTADOS DOS TESTES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13


3.1 Tempo de execuo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2 Convergncia das solues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
BIBLIOGRAFIA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

DEFINIO DO PROBLEMA DA MOCHILA

Figura 1: Problema da mochila. Fonte: Wikipdia


No problema clssico 0-1 da mochila (knapsack problem), temos n itens que podem ser
carregados na mochila, onde cada item j possui associado um peso p j e um valor de utilidade
u j e a mochila possui capacidade c para transportar os itens, nesse trabalho a soma das utilidade
dos itens deve ser pelo menos d.
Ento temos um problema de otimizao combinatria onde queremos carregar itens
que somem o mximo possvel de utilidade sem estourar a capacidade da mochila. Na modelagem desse problema utilizamos um vetor de tamanho n, onde cada elemento do vetor x j um
item, se x j = 1, ento o item est na bolsa, seno no est caso x j = 0.
Para exemplificar, suponha que Bob esteja indo viajar e sua mochila so comporte 15kg
como mostrado na Figura 2, ento ele precisa decidir quais itens ir levar consigo, querendo ele
somar o mximo possvel de dinheiro de seus itens, tendo em mente que ele precisa lever no
mnimo d reais em de itens.
Podemos modelar o problema utilizando programao linear inteira da seguinte forma:
Maximizar z = nj=1 u j x j
Sujeito a d nj=1 p j x j c
x j {0, 1}, j {1, ...n}
O problema da mochila NP-Dficil (MARTELLO; PISINGER; TOTH, 2000) existem vrias
solues propostas, tanto exatas como de heursticas, aqui abordaremos o de fora bruta, com
heurstica gulosa, com programao dinmica e algoritmo gentico.

ALGORITMOS PARA O PROBLEMA DA MOCHILA

Dividimos os algoritmos implementados em duas categorias exatos e heursticas. Os


exatos iro retornar o valor timo para o problema, mas ter um custo computacional muito mais
alto do que usando uma heurstica que tenta chegar o mais prximo possvel da soluo tima,
os algoritmos gulosos e o de programao dinmica pode ser visto em (VIANA; MOREIRA,
2011).
2.1

Fora Bruta

Esse algoritmo exato o mais trivial de se pensar, a ideia dele bem simples, teste todas as possibilidades que existem e guarde a melhor, essa ser a soluo tima para o problema.
Ele pode ser implementado de vrias formas, mas nesse trabalho utilizamos contagem
de nmeros binrios para poder fazer o teste de todas as possibilidades. Como uma soluo
para mochila representada como vetor de 0s e 1s, inicializamos o vetor com 0s, sendo essa a
primeira soluo, ento para gerar as demais possibilidades feito um incremento de mais um
em binrio at que o algoritmo passe por todos os possvel valores do vetor.
Podemos ver abaixo o pseudocdigo do algoritmo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

entrada :
c: capicidade total da mochila
n: numero de itens da mochila
d: valor minimo de peso carregado
P [1... n ]: vetor dos pesos dos itens
U [1... n ]: vetor dos valores de utilidade dos itens
saida :

um vetor X [1.. n] que representa a solucao encontrada ,


o valor da solucao encotrada e o somatorio das valores
de utilidade que estao na mochila

forcaBruta (c ,n ,d ,P [] , U [])
totaldeIteracoes = potencia (2 , n ) - 1
melhorSolucao = 0
melhorNumero = 0
para i = 0 ate totaldeIteracoes
pegaBinario (X ,n , i) // coloca em X a solucao corrente
solucaoCorrente = pegaSolucao (X ,b ,c , d)
// retorna o valor da solucao para o vetor atual de X

21
22
23
24
25
26
27

// caso nao seja uma solucao valida , ou seja menor que d ,


// retorna -1
se ( solucaoCorrente > melhorSolucao )
melhorSolucao = solucaoCorrente
melhorNumero = i
pegaBinario (X ,n , melhorNumero )
retorne X

fcil notar que a complexidade do pior caso desse algoritmo de O(2n ), pois como
temos um vetor binrio de tamanho n, existiro todas essas possibilidades. Por exemplo para n =
3 temos 8 possibilidades, para vermos isso basta aplicarmos um pouco de anlise combinatria,
para cada posio do vetor temos dois valores possves 0 e 1, como o tamanho 3, ento
calculamos 2 2 2 = 8. Esse algoritmo invivel, quando n j chegar a valores altos, o tempo
de resposta desse algoritmo ser de anos.
2.2

Programao Dinmica

A ideia do uso da programao dinmica de reaproveitar solues anteriores para


conseguir as posteriores, guardando elas em uma tabela. Para conseguirmos montar essa tabela
transformamos uma recurso em iterao.
Para isso definimos a tabela t da seguinte forma: t[i,Y ], onde i = 0, 1..n a quantidade
de itens para essa soluo e Y = 0, 1...c a quantidade mxima de peso carregado para essa
soluo. Assim notamos que t[0,Y ] = 0 para todo Y , agora se i > 0 temos que:

t[i,Y ] = A se p[i] > Y e


t[i,Y ] = max(A,B) se p[i] <= Y , onde
A = t[i 1,Y ] e B = t[i 1,Y p[i]] + u[i]
Quando p[i] > Y indica que esse item tem uma peso maior que a capacidade da mochila
para essa soluo, ento ela tem o mesmo valor que anterior, por isso atribuimos ela o valor
mximo anterior t[i 1,Y ]. Caso contrrio existe capicidade na mochila ento ne caso atribuimos B o valor de soluo mxima com Y p[i] de capacidade e acrescentamos a utilidade do
item i, somando u[i]. O pseudocdigo desse algoritmo mostrado abaixo:
1
2
3
4
5

c: capicidade total da mochila


n: numero de itens da mochila
d: valor minimo de peso carregado
P [1... n ]: vetor dos pesos dos itens
U [1... n ]: vetor dos valores de utilidade dos itens

6
7 saida : um vetor X [1.. n] que representa a solucao encontrada ,
8
o valor da solucao encotrada e o somatorio das valores
9
de utilidade que estao na mochila
10
11 PGDinamica (c ,n ,d ,P [] , U [])
12
melhorSolucao = 0
13
14
para y = 0 ate c
15
t [0][ y ] = 0
16
para i = 1 ate n
17
a = t[i -1][ y]
18
se p[i ] > Y
19
b = 0
20
senao
21
b = t [i -1][ y -P [i ]] + U [i]
22
t[i ][ y ] = max (a ,b )
23
24
// essa parte monta X
25
26
para i = n ate 1
27
se t [i ][ y] = t [i -1][ y ]
28
X[ i] = 0
29
senao
30
X[ i] = 1
31
y = y - P[i ]
32
melhorSolucao = melhorSolucao + U [i]
33
retorne X

Para montar o vetor X, feito o 1o se, que indica que soluo da posio [i, j] igual
a de [i 1, y], ento por que no houve incluso de item entre essas duas solues nesse caso
X[i] = 0, indicando que esse item no foi colocado, caso contrrio ele colocado setando 1, e
ento diminuindo Y de P[i], indicando que i est na mochila, logo seu peso deve ser descontado
de Y. Assim prossegue at ter percorrido todos os itens.
Enxergamos que as dimenses da tabela nXc e ela que indica a complexidade desse
algoritmo, ou seja ele possui O(nc), isso indica que temos uma grande melhoria em relao ao
de fora bruta, mas ainda assim existem alguns problemas, podemos ter problemas com poucos
itens, porm com algoritmo com custo elevado, isso vai depender da proporo de c escolhida,
alm disso podemos temos que checar o uso da memria que pode ser muito extenso.

2.3

Algoritmo Guloso

Diferente dos anteriores o algoritmo guloso no garante a soluo tima, ele consegue
uma aproximada, em alguns casos ele pode at conseguir retornar a soluo tima. O algoritmo
busca o colocar os melhores itens at que no haja mais espao na mochila, para saber quais so
os melhores itens, o algoritmo guloso pode se basear, no valor de utilidade do item, no peso do
p
item, ou no custo relativo que u jj .
Para colocarmos os itens na mochila, precisamos fazer uma ordenao, se nos basearmos pelo valor de utilidade, ento nesse caso ordenamos o vetor de utilidades, em ordem
decrescente e assim vamos percorrendo esse vetor e "colocando"os itens na mochila enquanto
houver capacidade e no acabar os itens. Podemos ver a implementao no cdigo abaixo (o
modo de fazer o algoritmo se baseando no peso e no custo relativo de maneira semelhante)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

entrada :
c: capicidade total da mochila
n: numero de itens da mochila
d: valor minimo de peso carregado
P [1... n ]: vetor dos pesos dos itens
U [1... n ]: vetor dos valores de utilidade dos itens
saida :

um vetor X [1.. n] que representa a solucao encontrada ,


o valor da solucao encotrada e o somatorio das valores
de utilidade que estao na mochila

gulosoPorUtilidade (c ,n ,d ,P [] , U [])
ordeneBaseadoNoValorUtilidade (P [] , U [] , n )
X = {0 ,0 ,...0}
pesoLivreCorrente = c
melhorSolucao = 0
para i = 1 ate n
se P [i] <= pesoLivreCorrente
pesoLivreCorrente = pesoLivreCorrente - P[ i]
X[ i] = 1
melhorSolucao = melhorSolucao + U [i]
se melhorSolucao >= d
retorne X
senao
retorne naoEncontrouSolucao

Pode ser visto que pode ser ele no consiga encontrar nenhuma solucao devido a

restrio que a soma dos valores de utilidade deve ser pelo menos d, em nossos testes, tanto
o guloso baseado peso como custo relativo, tentam executar o por valor de utilidade, caso eles
no consigam atigir d, mas se o de valor de utilidade no conseguir soluo, ento realmente
no retornado nenhuma soluo.
A complexidade desse algoritmo fica dependente do mtodo de ordenao usado, se
usarmos por exemplo o MergeSort, teremos complexidade de O(nlogn + n) que mesmo que
O(nlogn). Em nossa implementao utilizamos o QuickSort que apesar de ter uma complexidade no pior caso de O(n2 ), ele possui no caso mdio (nlogn) e utilizando tcnicas para evitar
pior caso, ele consegue resultados semelhantes ao MergeSort ou at melhores como obtidos em
(HOARE, 1962)

2.4

Algoritmo Gentico

Algoritmo Gentico uma tcnica inspirada pela biologia evolutiva, sendo uma classe
particular de algoritmos evolutivos, que utilizada para encontrar solues para problemas de
otimizao combinatria, cujo objetivo descobrir a melhor combinao dos recursos disponveis para otimizar seu uso.
Algoritmos Genticos so implementados como uma simulao de computador em que
as melhores solues so encontradas em uma populao que vai evoluindo a cada gerao. O
processo de evoluo geralmente se inicia com uma populao criada aleatoriamente. A cada
gerao, as solues na populao sofrem cruzamentos e mutaes, suas adaptaes ento so
avaliadas e alguns indivduos so selecionados para a prxima gerao.
A seguir temos o processo do Algoritmo Gentico:

Inicializa Populao
Avalia Populao
Seleciona Reprodutores
Cruza Selecionados
Muta Resultantes
Avalia Resultantes
Atualiza Populao

Deve Parar?

No

Sim
FIM

Figura 2: Processo de AG
Explicando o algoritmo implementado:
O Algoritmo Gentico para o Problema da Mochila Valiosa (PMV) foi implementado
seguindo a estrutura como mostrado abaixo:
Cromossomo
O cromossomo do AG para a Mochila foi montado utilizando os prprios itens da

10

Mochila, onde cada alelo representa a presena de um objeto na Mochila com 0 ou 1. Assim,
para um PMV com 5 objetos temos a representao de um cromossomo:
10110
De acordo com o cromossomo acima, a Mochila estaria carregando os objetos 1, 3 e 4;
Gerar Populao Inicial
A populao inicial criada de forma aleatria. Como a representao de um indivduo
de forma binria, sorteado um nmero aleatoriamente entre 1 e 2Nob jetos . Em seguida, esse
nmero transformado em binrio para fazer parte da populao inicial. Com isso, conseguimos buscar um indivduo em todo o espao de possveis solues. No entando, o cromossomo
s considerado vlido se a soma do peso dos objetos contidos na Mochila no ultrapassa c e a
soma do valor desses objetos seja pelo menos d (Checagem de Validade). O valor do tamanho
da populao inicial parametrizado.
Fitness
A funo Fitness baseada no somatrio dos Valores dos objetos contidos em cada
Mochila. Ela formulada atravs uma regra de trs simples, onde para cada indivduo temos:
i 100
f itnessi = Valor
Sumvalores
i

i N, onde N a quantidade de alelos do cromossomo, o que nos d um valor entre


zero e cem.
Taxa
A funo da taxa utilizada para conseguirmos classificar os indivduos em termos de
proporo baseado agora no valor do fitness de cada indivduo. Tambm formulado atravs
de uma regra de trs simples, onde para cada um calculamos:
ratei =

f itnessi 100
Sum f itnessi

i N, onde N a quantidade de alelos do cromossomo, o que nos d um valor entre


zero e cem, sendo que agora, o somatrio das taxas nos d um valor fechado em cem, para
podermos aplicar o prximo passo.
Roleta
A funo da roleta foi implementada justamente utilizando o valor da taxa de cada
indivduo, como essas taxas so valores que somam um total de cem, possvel determinar
um valor mximo para cada indivduo da populao que ser utilizado para a seleo desses
indivduos para o cruzamento. Assim, uma populao com quatro indivduos, teramos:

11

1 0 1 1 0, 32.7
1 0 1 1 1, 41.5
1 0 0 1 0, 15.0
0 0 0 1 0, 10.8
onde os valores ao lado do cromossomo representam a taxa de cada um, com isso
conseguimos que o 1a indivuo tenha um valor mximo de 32.7, o 2o um valor de 74.2, o 3o um
valor de 89.2 e o 4a 100.
Crossover
Antes de realizar o Crossover, feita uma seleo de pares de indivduos que iro
participar do cruzamento mtuamente, onde os que possuem maior fitness tm uma melhor
chance de participarem do cruzamento juntos. Assim, para o exemplo anterior do valor mximo,
seriam gerados 4 nmeros aleatrios em que cada um cairia dentro de um espao de um dos
indivduos. Com isso, supondo que teramos sorteado na seguinte ordem 2, 3, 1, 4, o cruzamento
seria aplicado entre os indivduos 2, 3 e depois 1, 4. O cruzamento ir gerar novos indivduos
com a mesma quantidade que a populao inicial. Ele baseado em um ponto de corte que
parametrizado. O cruzamento ento aplicado em cima desse ponto de corte, onde o 1o filho
recebe do ponto de corte ao comeo do cromossomo pai 1 junto do ponto de corte ao final do
cromossomo do pai 2. Isso de modo inverso feito para o filho 2. Dessa forma geramos os
indivduos novos para a populao.
Mutao
A mutao ralizada por meio da aleatoriedade, onde a quantidade de indivduos que
sofrero mutao dependente do tamanho do cromossomo. A taxa de mutao tambm
parametrizada, e com ela que decidido se cada alelo escolhido para mutao sofrer ou no
a mutao naquele cromossomo. A mutao quando aplicada sobre o alelo, ela apenas inverte
seu valor, saindo de zero para um ou de um para zero, dependendo do valor antes da mutao.
Avaliao
A funo de avaliao utilizada justamente para tratar os novos indivduos gerados.
Ela vai calcular o somatrio dos valores de cada objeto para cada cromossomo. Em seguida,
aplica a funo fitness, junto com a populao inicial para poder classificar todos os indivduos.
Atualizao
A ltima etapa do processo evolutivo se baseia em atualizar a populao escolhendo
os melhores indivduos que iro para a prxima gerao. A funo de atualizao ordena os
indivduos baseado na fitness para poder capturar os melhores cromossomos. Um detalhe nessa
etapa que a possibilidade de repetio de indivduo pode gerar uma convergncia precoce para

12

a soluo do problema, onde a populao seria preenchida com o mesmo indivduo repetido.
Para evitar esse problema, nessa etapa de atualizao, eliminamos todos os indivduos repetidos
dentre os indivduos pai e indivduos filho. Ao terminar a fase de atualizao, a nova populao
est pronta para ir para a prxima gerao. A quantidade de gerao realizadas tambm
parametrizada.
Um detalhe de implementao sobre o algoritmo gentico que em um caso, para
efeito de testes, chamamos os algoritmos Gulosos por custo e por volume para gerar a populao
inicial, os demais indivduos foram gerados de forma aleatria como explicado anteriormente.
No prximo tpico poderemos ver o resultado da aplicao dos algoritmos Gulosos na gerao
da populao inicial. Como o clculo para o tempo de execuo obtido depois que roda
todas as iteraes, no to notvel a diferena de tempo para encontrar a melhor soluo,
mas abservando as execues do algoritmo, notamos uma rpida convergncia para a melhor
soluo possvel encontrada.

13

RESULTADOS DOS TESTES

Para os testes foram utilizadas 11 (0..10) instncias, onde a primeira tem a seguinte
entrada:

n=30 c=200 d=1000


P= { 12, 11, 1, 22, 5, 12, 12, 13, 14, 90, 10, 10, 99, 17, 1, 2, 3, 5, 20, 7, 3, 12, 23, 43, 45,
2,7,5,1,1 }
U= { 121,11, 22, 499, 112, 122, 133, 144, 190, 110, 120, 199, 171, 10, 2, 322, 153, 320, 177,
333, 212, 203, 43, 45, 27, 75, 251, 101, 100, 100 }
Paras as 10 restantes usada variao da seguinte entrada:

n=100 c=5000 d=8000


P= { Nmeros randmicos inteiros entre 10 e 100 }
U= { Nmeros randmicos inteiros entre 10 e 1000 }
3.1

Tempo de execuo

Para realizao dos testes cada instncia foi rodada 30 vezes e depois tirada a mdia
do tempo gasto na execuo,

Grfico do Tempo de Execuo


0.09

Dinamica
GulosoUtilidade
GulosoPeso
GulosoRelativo
Genetico
GeneticoGuloso

0.08
Tempo de Execuo(s)

0.07
0.06
0.05
0.04
0.03
0.02
0.01
0
0

4
6
Nmero da Instncia

Figura 3: Grfico de teste

10

14

calculado a partir do comando time do linux e capturando o real time. Os testes foram executados em uma mquina com processador quadcore, com 2GB de ram com sistema operacional
Ubuntu 12.10. No calculamos para o fora bruta, devido ele gastar muito tempo executando
para instncia com n = 100, para o algoritmo gentico foi utilizado as seguintes configuraes:
Para instcia 0
populao = 10 ponto de corte = 10 nmero de iteraes = 1000 taxa de mutao = 10%
Para instcias de {1..10}
populao = 10 ponto de corte = 40 nmero de iteraes = 1000 taxa de mutao = 10%
Na Figura 3 vemos que em termo de tempo gasto o algoritmo que mais custoso
o gentico, isto devido ele ter sido configurado para ter 1000 iteraes e tambm por suas
checagens e tratamentos, diferente dos gulosos que o tempo de execuo depende apenas de um
mtodo de ordenao mais iteraes para colocar os itens na mochila.
Para a de programao dinmica podemos ver que para instncia 0, onde n = 30, ele
consegue um tempo similar aos gulosos, sendo ele exato, isso se deve a capacidade pequena
da mochila dessa instncia c = 200, ficamos apenas com 30*200 passos para a de programao
dinmica.
Mas vemos que nas demais instncias os gulosos conseguem manter um tempo praticamente fixo, mas a de programao dinmica sobe um pouco devido c = 5000 ter sofrido um
aumento grande.
3.2

Convergncia das solues

Tirando o algoritmo de programao dinmica, temos heursticas para o problema,


ento pode ser que no retornem a soluo tima, na tabela seguintes pegamos 3 instncias e
mostramos a melhor soluo achada das 30 execues de cada algoritmo:

15

Algoritmo

Soluo Instncia

Dinmica

49810

Gentico

48994

GenticoGuloso

49810

GulosoUtilidade 49810

GulosoPeso

48137

GulosoRelativo

46404

Dinmica

49411

Gentico

48760

GenticoGuloso

49411

GulosoUtilidade 49361

GulosoPeso

47081

GulosoRelativo

47416

Dinmica

51979

Gentico

51572

GenticoGuloso

51979

GulosoUtilidade 51979

GulosoPeso

49767

GulosoRelativo

50704

Na instncia 1 vemos que o gentico sozinho no conseguiu atingir a soluo tima,


apesar de chegar perto, mas quando juntamos os dois, o gentico guloso nas 3 instncias ele
consegue atingir a soluo tima(soluo da de programao dinmica). O melhor guloso foi
por utilidade apenas na instncia 2 que ele no conseguiu atingir o timo, os demais guloso no
conseguiram atingir timo em nenhuma instncia.

16

BIBLIOGRAFIA

HOARE, C.A.R. Quicksort. The Computer Journal, Br Computer Soc, v. 5, n. 1, p. 1016,


1962.
MARTELLO, S.; PISINGER, D.; TOTH, P. New trends in exact algorithms for the 01 knapsack problem. European Journal of Operational Research, Elsevier, v. 123, n. 2, p. 325332,
2000.
VIANA, G. V. R.; MOREIRA, F. V. C. Tcnicas de diviso e conquista e de programao dinmica para a resoluo de problemas de otimizao. Revista Cientfica da Faculdade Loureno
Filho, v. 8, n. 1, p. 527, 2011.