Você está na página 1de 5

Problema da Mochila An alise de Algoritmos

Ygor de Mello Canalli Nova Igua cu, 4 de Setembro de 2013


Resumo Este relat orio e produto de um trabalho da disciplina de An alise de Algoritmos, do curso de Ci encia da Computa c ao da Universidade Federal Rural do Rio de Janeiro, Departamento de Tecnologias e Linguagens. Faremos uma breve an alise do problema da mochila bin aria e fracion aria.

Introdu cao

Ser a feita uma breve an alise dos duas vers oes do problema da mochila: bin aria e fracion aria. Veremos, que apesar de serem muito semelhantes, as solu c oes s ao muito diferentes. Para a vers ao bin aria, atacaremos atrav es de uma t ecnica de programa c ao din amica, para a vers ao fracion aria, algoritmos gulosos.

Problema da mochila bin aria

O problema da mochila booleana, ou simplesmente problema da mochila (do ingl es knapstack problem ) e um problema de otimiza c ao linear inteira cujo objetivo e decidir quais objetos colocar numa mochila com capacidade limitada, onde cada objeto possui seu respectivo peso e valor associados, maximizando o valor dos objetos escolhidos sem ultrapassar a capacidade da mochila. Este e um problema naturalmente intrat avel, e portanto n ao h a conhecimento de um algoritmo que o resolva de maneira eciente. Atacaremos o problema atrav es da t ecnica de programa c ao din amica.

2.1

Formaliza c ao

Seja p = (p1 , p2 , . . . , pn ) o vetor dos pesos de n objetos, e v = (v1 , v2 , . . . , vn ) seus respectivos valores. Seja x = (x1 , x2 , . . . , xn ) um vetor de inteiros onde xi [0, 1], com 1 i n, e 1 caso o objeto i ser a colocado na mochila e 0 caso contr ario. Seja c N a capacidade da mochila. Objetivo: Determinar o vetor x que maximize
n

x v = x 1 v1 + x 2 v2 + + x n vn =
i=1

x i vi

Sujeito a: xpc Chamamos mochila vi avel uma solu c ao que atenda ` a restri c ao acima.

2.2

Programa c ao din amica

Podemos resolver o problema atrav es da t ecnica de programa c ao din amica. A id eia e guardar uma tabela as solu c oes da sub-inst ancias dos problema, isto e, na k - esima linha resolveremos de maneira otima a mochila de peso 0 k n. Se o i- esimo elemento estiver na solu c ao otima o valor desta solu c ao ser a vi mais o valor da melhor solu c ao para o problema da mochila com capacidade c pi , considerando apenas os i 1 primeiros itens. Caso contr ario (i.e., o i- esimo elemento n ao est a na solu c ao), o valor da solu c ao ser a o mesmo da inst ancia do problema com capacidade c tomando apenas os i 1 primeiros objetos. Seja t a tabela das solu c oes do problema da mochila, onde t(i, k ) e a solu c ao do problema da mochila referente aos i primeiros objetos com capacidade k . Portanto, vale a seguinte recorr encia: se i = 0 ou k = 0 0, t(i 1, k ), se pi > k t(i, k ) = max{t(i 1, k ), t(i 1, k pi ) + vi }, se pi k Como o c alculo de t(i, k ) depende de t(i 1, k ) e t(i 1, k pi ), preenchemos a tabela linha a linha, sem que sejam feitas chamadas repetidas, acessando os valores obtidos em itera c oes anteriores: 0 0 . . . 0 0 . . . 0 k pi 0 k 0 c 0

0 . . . i1 i . . . n

Preenchendo a tabela desta forma, temos o algoritmo abaixo, que realiza (nc) opera c oes aritim eticas, visto que este sempre acessa todas as c elulas da tabela.

Algoritmo 1 Problema da mochila bin aria Entrada: Vetor de valores v = (v1 , . . . , vn ). Vetor de pesos p = (p1 , . . . , pn ). Capacidade da mochila c. Quantidade de objetos n Sa da: Solu c ao otima do problema ria(v, p, c, n) 1: fun c ao Mochila-Bina 2: para k = 0 at e c fa ca 3: t(0, k ) = 0 4: m para 5: para i = 1 at e n fa ca 6: t(i, 0) = 0 7: m para 8: para i = 1 at e n fa ca 9: para k = 1 at e c fa ca 10: se (pi > k ) ent ao 11: t(i, k ) = t(i 1, k ) 12: sen ao 13: t(i, k ) = max{t(i 1, k ), t(i 1, k pi ) + vi } 14: m se 15: m para 16: m para 17: retorne t(i, c) 18: m fun c ao Para determinar o vetor x correspondente ` a solu c ao gerada pelo algoritmo de programa c ao din amica, basta varrermos a u ltima coluna, correspondente a solu c ao do problema original da mochila com capacidade c considerando os i primeiros objetos, at e i = n. O algoritmo atualiza a solu c ao apenas quando encontra uma melhor, produzindo um solu c ao otima. Desta forma, caso haja mudan ca de uma linha para a outra signica que o objeto corrente faz parte da solu c ao otima, ou seja, xi = 0, se t(i, c) = t(i 1, c) . 1, se t(i, c) = t(i 1, c)

A complexidade do Algoritmo 1 e aparentemente polinomial. Entretanto, precisamos analisar com mais cuidado a quest ao do tamanho da entrada. Considerando que c possui uma representa c ao bin aria de = log2 c bits, e portanto c e da ordem de 2 . Neste caso, o tamanho de entrada apropriado a ser considerado e o comprimento de c, isto e . Portanto, devemos considerar o Algoritmo 1 um algoritmo pseudo polinomial, devido ao seu comportamento exponencial, de tempo (n 2 ).

Problema da mochila fracion aria

O problema da mochila fracion ario, conhecido em ingl es como fracional knapstack problem, e um problema de otimiza c ao linear cujo objetivo e colocar fra c oes de n objetos distintos, cada um com um peso e valor associado, numa mochila com capacidade limitada, de forma a maximizar o valor do conte udo da mochila.

Este problema, diferentemente de sua vers ao bin aria, pode ser resolvido de maneira eciente atrav es de um algoritmo guloso.

3.1

Formaliza c ao

Seja p = (p1 , p2 , . . . , pn ) o vetor dos pesos de n objetos, e v = (v1 , v2 , . . . , vn ) seus respectivos valores. Seja x = (x1 , x2 , . . . , xn ) um vetor de racionais onde 0 xi 1, com 1 i n, e a fra c ao o objeto i ser a colocado na mochila. Seja c N a capacidade da mochila. Objetivo: Determinar o vetor x que maximize
n

x v = x 1 v1 + x 2 v2 + + x n vn =
i=1

x i vi

Sujeito a: xpc Chamamos mochila vi avel uma solu c ao que atenda ` a restri c ao acima.

3.2

Algoritmos guloso

O algoritmo guloso abaixo considera que os objetos est ao em ordem decrescente de valor espec co, isto e, pi pi+1 , para todo 1 i < n. vi+1 vi Tal algoritmo produz uma solu c ao otima para o problema da mochila fracion aria. Algoritmo 2 Problema da mochila fracion aria Entrada: Quantidade n de elementos. Vetor p dos pesos. Vetor v dos valores. Capacidade c da mochila Sa da: Vetor x com solu c ao o tima. 1: fun c ao Mochila-Fracionaria(p, v, n, c) 2: para i = 1 at e n fa ca 3: se pi c ent ao 4: xi = 1 5: c = c pi 6: sen ao 7: xi = c/pi 8: c=0 9: m se 10: m para 11: retorne x 12: m fun c ao O algoritmo e guloso pois a cada itera c ao inclui-se na mochila o m aximo suportado do objeto com o maior valor espec co ainda n ao selecionado. Tal 4

algoritmo sempre produz uma solu c ao otima, visto que o problema exibe uma subestrutura otima, isto e, se uma solu c ao (x1 , . . . , xn ) e otima, ent ao a inst ancia de n 1 objetos possui solu c ao otima (x1 , . . . , xn1 ) para a capacidade c xn pn .

Refer encias Bibliogr acas


[1] Cormen, T. H., Leiserson, C. E., Rivest, R. L., Stein, C., Introduction to Algorithms, Third Edition, MIT Press, 2009. [2] Paulo Feofiloff, Notas de Aula de An alise de Algoritmos, Departamento de Ci encia da Computa c ao do Instituto de Matem atica e Estat stica da USP, Dispon vel em: <http://www.ime.usp.br/~pf/analise_de_algoritmos/lectures. html> . Acessado em 29 de agosto de 2013. ndida Nunes da Silva e Orlando [3] Cid Carvalho de Souza, Ca Lee, MO417 Complexidade de Algoritmos I, Unicamp, Dispon vel em: <http://www.ic.unicamp.br/~zanoni/mo417/2011/aulas/handout/ 08-programacao-dinamica.pdf> . Acessado em 2 de setembro de 2013.

Você também pode gostar