UNIVERSIDADE PRESBITERIANA MACKENZIE
CAMILLA FINCATTI
PROBLEMA DA MOCHILA
São Paulo 2010
CAMILLA FINCATTI
PROBLEMA DA MOCHILA
Trabalho Acadêmico apresentado no Curso de MatemáticaFísica, do Centro de Ciências e Humanidades de Universidade Presbiteriana Mackenzie, como requisito parcial da disciplina de Tópicos de Programação Matemática ministrada pela Profa. Angela Hum.
São Paulo 2010
SUMÁRIO
1
INTRODUÇÃO ............................................................................................... 4
2
ENUNCIADO E TIPOS DO PROBLEMA ....................................................... 6
3
DEFINIÇÃO MATEMÁTICA ........................................................................... 7
4
ALGORITMOS ............................................................................................... 8
4.1
SOLUÇÃO USANDO BACKTRACKING......................................................... 8
4.2
SOLUÇÃO USANDO O MÉTODO GULOSO ................................................. 8
4.3
SOLUÇÃO USANDO PROGRAMAÇÃO DINÂMICA ...................................... 9
5
EXEMPLO MATEMÁTICO ........................................................................... 10
6
EXEMPLO PRÁTICO C++ ........................................................................... 12
7
CONSIDERAÇÕES FINAIS ......................................................................... 13
4
1 INTRODUÇÃO O problema da mochila (Knapsack problem , em inglês) constitui uma classe de problemas dos mais estudados em otimização combinatória e em subproblemas de outros problemas práticos. É um dos 21 problemas NP-completos 1 de Richard Karp2, descritas no seu artigo de 1972. O nome surgiu devido o modelo de uma situação em que é necessário carregar uma mochila com capacidade limitada, com um conjunto objetos de pesos e valores diferentes. O objetivo é ocupar a mochila com o maior valor possível, não ultrapassando o seu peso máximo. Definir o subconjunto de objetos cujo peso não ultrapasse o limite da mochila e ao mesmo tempo maximizando o seu valor total, corresponde a resolver o problema da mochila. Muitos problemas reais podem ser formulados com o problema da mochila ou uma variação deste. As aplicações mais conhecidas são os problemas de investimento de capital, corte e empacotamento, carregamento de veículos, controle orçamental e de subproblemas como por exemplo, planejamento de produção, desenvolvimento de circuitos eletrônicos, entre outros. Por ser um problema combinatório, pode ser resolvido por enumeração exaustiva, ou seja, tentando todas as soluções possíveis, e posteriormente comparando-as para obter a melhor solução. Porém, a determinação exaustiva destas soluções é completamente inviável, mesmo em pequenas dimensões. Por exemplo, um problema com apenas 20 itens pode possuir aproximadamente 1.048.576 soluções. A Programação Dinâmica (ou função recursiva) de Bellman foi a primeira técnica mas eficiente para resolução do problema, na década de 50. Logo, foram propostos inúmeros melhoramentos: definição do limite superior para o valor 1
Na teoria da complexidade computacional, a classe de complexidade NP-completo é o subconjunto dos problemas de decisão em NP de tal modo que todo problema em NP se pode reduzir, com uma redução de tempo polinomial, a um dos problemas NP-completo. 2
Richard Manning Karp, é um informático estadunidense que publicou diversos trabalhos fundamentais sobre a complexidade computacional.
5
ótimo da função objetivo, por Dantzig em 1957; a resolução do problema pela técnica de partição e refinamento sucessivos, por Kolesar em 1967; a resolução de problemas de grandes dimensões, pela técnica de partição e refinamento, por Harowit e Sahni na década de 70; através da fixação do valor de algumas variáveis para redução da dimensão do problema, por Martello e Toth em 1977; o algoritmo baseado na ordenação de apenas um subconjunto de itens, por Balas e Zemel em 1980; um novo algoritmo que resolve instâncias complexas, iniciado por Pissinger em 1995 e concluído por Martello e Toth em 1998. O problema foi base para o primeiro algoritmo de criptografia assimétrica (chave pública). Todos esses estudos foram dedicados apenas a resolução do problema mono-restrição, porém, os problemas reais exigem várias restrições. Um exemplo de aplicação do problema da mochila multi-restrições (ou multi-objetivo) seria uma seleção de pessoal, ou seja, a escolha de candidatos que possam melhor atender os objetivos estratégicos de uma empresa. Nesses problemas multirestrições não há uma solução que otimize simultaneamente todos as restrições. Existem algumas soluções admissíveis em que a melhoria do valor de uma das restrições prejudica o valor de outras, ou seja, as restrições entram em conflito. Uma das características destes problemas é o aumento do número de soluções existentes o que dificulta sua resolução. Existem diversos métodos para análise desse tipo de problema que serão detalhados a seguir. Estes métodos podem ser classificados como exatos ou aproximados.
6
2 ENUNCIADO E TIPOS DO PROBLEMA O problema da mochila pode ser enunciado conforme os exemplos:
Um viajante deve levar consigo, apenas uma mochila. Essa mochila possui uma capacidade limitada e deve ser carregada apenas com objetos que serão úteis durante a viagem. Cada objeto é único e possui um peso e um determinado valor. Que objetos dever ser levados pelo viajante de forma a maximizar o valor da mochila? Um contêiner com capacidade limitada deve ser carregado com diversos produtos de pesos e tamanhos diferentes. Como devese proceder para carregar o máximo possível de produtos, desperdiçando o mínimo possível de espaço. Um computador está sobrecarregado de arquivos e os mesmos devem ser transferidos para mídias em CD, e sabe-se que será necessário mais de um CD. Como deve-se proceder para carregar o máximo possível de arquivos em cada CD, desperdiçando o mínimo possível de espaço em cada mídia.
Existem diferentes tipos de problemas da mochila que ocorrem dependendo da distribuição de itens e mochilas. Problema da mochila 0/1: cada item pode ser escolhido no máximo 1 vez; Problema da mochila limitado: há uma quantidade limitada para cada tipo de item; Problema da mochila com múltipla escolha: os itens devem ser escolhidos de classes disjuntas; Problema da mochila múltiplo: várias mochilas são preenchidas simultaneamente Problema da mochila com multi-restrições: problema de programação inteira geral com coeficientes positivos.
7
3 DEFINIÇÃO MATEMÁTICA Os dados do problema da mochila, podem ser expressos em termos matemáticos. Os objetos são contados pelo índice variando de . Cada item
1�
tem um peso e um valor . A capacidade da mochila é denotada por . A formulação mais comum do problema é o problema simples da mochila (problema da mochila 0/1), que restringe o número (objeto) como zero ou um.
=1
Seja o peso do -ésimo objeto e seu valor, se o objeto aparece na mochila, então caso contrário .
=0
Assim, o problema da mochila pode ser formulado algebricamente da seguinte maneira:
: =
Onde
é chamada de função objetivo.
: ≤ , ∈ �0,1�
Isso quer dizer que a soma dos pesos dos objetos selecionados não exceda a capacidade da mochila.
8
4 ALGORITMOS O problema da mochila pode ser solucionado através dos seguintes algoritmos:
4.1
SOLUÇÃO USANDO BACKTRACKING
Backtracking é um algoritmo refinado da busca por enumeração exaustiva (força bruta), onde boa parte das soluções são eliminadas sem serem explicitamente analisadas. Se aplica em problemas cuja solução pode ser definida através de uma sequência de decisões, que pode ser modelada por uma árvore que representa todas as possíveis sequências de decisão.
F����� 1 � ������ �� �������� �������
Caso exista mais de uma disponível para cada uma das decisões, a busca exaustiva da árvore é exponencial. A eficiência dessa solução depende da possibilidade de limitar a busca eliminando os ramos que não levam a solução desejada.
4.2
SOLUÇÃO USANDO O MÉTODO GULOSO
O método guloso é um algoritmo de menor complexidade e que pode ser aplicado a uma grande variedade de problemas, que na maioria possuem
entradas e é necessário obter um subconjunto que satisfaça alguma restrição. Qualquer subconjunto que satisfaça esta restrição é chamado de solução viável. A solução viável deve maximizar ou minimizar uma dada função objetivo (chamada de solução ótima). O método guloso trabalha em estágios, considerando uma entrada por vez. Em cada estágio é tomada uma decisão considerando se uma entrada
9
particular é uma solução ótima. Isso ocorre considerando as entradas em uma ordem determinada por um processo de seleção, que é baseada numa medida de otimização que pode ou não ser a função objetivo. Frequentemente essas medidas de otimização resultarão em algoritmos que gerarão soluções sub-ótimas.
4.3
SOLUÇÃO USANDO PROGRAMAÇÃO DINÂMICA
É um método aprimorado de utilizar recursividade que ao invés de executar uma função diversas vezes, na primeira chamada da função o resultado é armazenado e nas demais chamadas, o retorno será o resultado e não uma requisição à ser resolvida, ou seja, armazenando os resultados anteriores, eliminase a repetição de contas, tornando assim o método mais eficiente. Nesse método, uma solução ótima é definida por uma sequência de decisões ótimas locais. Na programação dinâmica é possível avaliar todas as soluções, garantindo um resultado exato.
10
5 EXEMPLO MATEMÁTICO Orçamento de capital com variáveis inteiras: VVC, empresa de capital empreendedor está avaliando oportunidades de investimento para os próximos três anos. A empresa tem um orçamento de $200 milhões para este ano, $250 milhões para o ano que vem e mais $150 milhões para o outro ano, e está interessada e definir onde os investimentos devem ser realizados. Vamos considerar que a VVC esteja interessada em adquirir ou não participações que são definidas pela tabela abaixo. A empresa está interessada em maximizar o valor presente líquido (VPL) de seus investimentos.
������������� �� ������������ ���� � ��� ������������ ������������
��� �
��� �
����
��� ������������
�
��
��
��
��
�
��
��
��
��
�
��
��
��
��
�
��
�
�
��
�
��
��
��
��
�
��
��
��
��
�
��
��
��
��
�����
���
���
���
���
Em essência, o que a VVC quer saber é se ela deve investir em uma determinada oportunidade de investimento ou não. Chamaremos de realização do investimento . Mais especificamente,
= ,,,,,, = 10 = ,,,,,, . = 1
= 1
Por exemplo, se , o investimento é realizado, ao passo que, se , o investimento não é realizado.
As restrições devem garantir que para cada ano o investimento total não exceda o orçamento do ano. Exemplo: Para o ano 0:
12 + 54 + 65 + 38 + 52 + 98 + 15 ≤ 200
11
Para os outros anos:
34 + 94 + 28 + 0 + 21 + 73 + 48 ≤ 250 12 + 67 + 49 + 8 + 42 + 25 + 53 ≤ 150 A função-objetivo estabelece que VPL dos investimentos deve ser máximo.
: = 20 + 15 + 34 + 17 + 56 + 76 + 29 A formulação completa pode ser definida como:
: = 20 + 15 + 34 + 17 + 56 + 76 + 29 ��: 12 + 54 + 65 + 38 + 52 + 98 + 15 ≤ 200 34 + 94 + 28 + 0 + 21 + 73 + 48 ≤ 250 12 + 67 + 49 + 8 + 42 + 25 + 53 ≤ 150 ∈ � 0,1� = , ,, , ,, .
12
6 EXEMPLO PRÁTICO C++ // Recebe como parametros o numero de objetos n, // o array de objetos com seus respectivos pesos e valores, // e a capacidade W da mochila double mochilaFracNlogN(int n, Object * obj, int W){ double weight = 0.0; // Peso armazenado na mochila double total = 0.0; // Valor total armazenado na mochila int i; // Ordena os objetos com relacao a razao entre valor/peso // Complexidade O(n*log(n)) qsort(obj, n, sizeof(Object), ratioCmp); // Coloca o maior numero de objetos de forma completa na mochila, // em ordem de razao valor/peso => Complexidade O(n) for(i=0; i W) break; obj[i].frac = 1.0; // Coloca todo o objeto i na mochila total += obj[i].value; // Atualiza o valor total na mochila weight += obj[i].weight; // Atualiza o peso total na mochila } // Se nem todos os objetos couberam na mochila, // coloca apenas uma fracao do melhor objeto, em termos de valor/peso, //ainda nao considerado if(i < n){ // Coloca apenas a fracao possivel do objeto i na mochila obj[i].frac = (W - weight)/(double)obj[i].weight; // Atualiza o valor total da mochila total += ((double) obj[i].value) * obj[i].frac; } // retorna o valor total armazenado na mochila return total; }
13
7 CONSIDERAÇÕES FINAIS Alguns métodos podem ser construídos visando à resolução de problemas exponenciais, entretanto podem não obter uma solução exata, mas sim uma solução aproximada. Este trabalho apresentou três algoritmos para resolução do problema da mochila. O primeiro algoritmo através de força bruta (enumeração exaustiva), o segundo através do método guloso, que é um algoritmo de aproximação, e o terceiro através do método de programação dinâmica. Existem muitos problemas derivados do problema da mochila, o que faz com que o seu conhecimento se torne uma poderosa ferramenta na busca de soluções destes. Concluí-se que existe uma variedade de aplicações do problema em diversas áreas do conhecimento, demonstrando que pode-se adaptar o problema da mochila conforme as diferentes necessidades.
14
REFERÊNCIAS BIBLIOGRÁFICAS
COLIN, Emerson C. Pesquisa Operacional . 1. ed. Rio de Janeiro: LTC, 2007.
Problème du sac à dos. Disponível em: < http://fr.wikipedia.org/wiki/_ Problème_du_sac_à_dos >. Acesso em: 16 maio 2010. PAA 2007.1 - Projeto 1 - Mochila Fracionária. Disponível em: . Acesso em: 16 maio 2010. UNIVERSIDADE DE SÃO PAULO. Instituto de Matemática e Estatística . São Paulo. Disponível em: < http://www.ime.usp.br/~regis/Publications/wscad2002.pdf >. Acesso em: 17 maio 2010. Knapsack problems - Por Hans Kellerer,Ulrich Pferschy,David Pisinger. Disponível em: . Acesso em: 17 maio 2010.