Problema da Mochila com Busca Exaustiva¶
O problema da mochila é um dos problemas clássicos da computação e é amplamente estudado em otimização de algoritmos e computação.
Imagine que você está se preparando para uma viagem e tem uma mochila com capacidade limitada de peso. Você tem vários itens à sua disposição, cada um com um peso específico e um valor associado. Seu objetivo é escolher quais itens colocar na mochila para maximizar o valor total, sem ultrapassar a capacidade máxima de peso que a mochila pode carregar.
Suponha que você tenha os seguintes itens:
Item 1: Peso = 2 kg, Valor = 3
Item 2: Peso = 3 kg, Valor = 4
Item 3: Peso = 4 kg, Valor = 5
Item 4: Peso = 5 kg, Valor = 8
E sua mochila pode carregar até 8 kg. A questão é: quais itens você deve escolher para maximizar o valor total na mochila, sem ultrapassar a capacidade de 8 kg?
Se você tentar todas as combinações possíveis de itens, verá que algumas opções permitem carregar mais valor do que outras. Por exemplo:
Se você escolher os itens 1 e 4, o peso total será 7 kg e o valor total será 11.
Se escolher os itens 2 e 3, o peso total será 7 kg e o valor total será 9.
Neste caso, a melhor combinação seria escolher os itens 1 e 4, que oferecem o maior valor total de 11 sem exceder o peso máximo de 8 kg.
Desafios do Problema:¶
O problema da mochila torna-se cada vez mais complexo à medida que o número de itens aumenta. Com mais itens, o número de combinações possíveis cresce exponencialmente, tornando a busca pela solução ótima um desafio computacional significativo. Por isso, algoritmos eficientes são necessários para resolver o problema em casos de grande escala.
A atividade desta aula consiste em implementar heurísticas para a solução do problema da Mochila binária.
Abaixo você encontrará as listas contendo peso e valor dos itens para organizar na mochila.
Entrada 1, Entrada 2, Entrada 3, Entrada 4
Neste exercício, você implementará uma solução para o problema da mochila usando a técnica de busca exaustiva em C++. O objetivo é maximizar o valor dos objetos dentro da mochila sem exceder sua capacidade.
Descrição do Problema:
Dado um conjunto de N objetos, cada um com um peso w_i e um valor v_i , selecione uma combinação de objetos que maximize o valor total sem ultrapassar a capacidade W da mochila.
- Entrada:
N W w1 v1 w2 v2 ... wN vN
Onde: N: Número de objetos
W: Capacidade da mochila
Wi: Peso do objeto
Vi: Valor do objeto.
Para resolver o problema da mochila usando busca exaustiva, precisamos avaliar todas as combinações possíveis de itens. Uma abordagem comum é usar recursão para explorar todas as possibilidades.
O que é Recursão?¶
Recursão é uma técnica fundamental na programação, onde uma função chama a si mesma para resolver subproblemas menores de uma tarefa maior. A ideia central é dividir um problema complexo em partes menores, que podem ser resolvidas de forma mais simples. Em um algoritmo recursivo, o problema é resolvido ao fazer chamadas sucessivas para a mesma função, mas com parâmetros ajustados que aproximam a solução a cada passo.
Exemplificando...
Considere a tarefa de calcular o fatorial de um número n . O fatorial de n , representado como n! , é o produto de todos os números inteiros de 1 até n . Podemos definir isso de forma recursiva: - 0! = 1 (caso base) - n! = n \times (n-1)! (caso recursivo)
Usando recursão, a função que calcula o fatorial chama a si mesma com o valor n-1 , até que atinge o caso base.
Recursão no Problema da Mochila¶
No contexto do problema da mochila, a recursão é utilizada para explorar todas as combinações possíveis de itens que podem ser colocados na mochila. A ideia é considerar, para cada item, duas possibilidades: incluí-lo na mochila ou não incluí-lo. Para cada uma dessas escolhas, o problema é reduzido ao mesmo problema, mas com um item a menos e, no caso de inclusão, com uma capacidade reduzida na mochila.
A estrutura recursiva para resolver o problema da mochila pode ser descrita da seguinte forma:
-
Caso Base: Se não há mais itens a serem considerados ou se a capacidade restante da mochila é zero, o valor total é zero.
-
Caso Recursivo: Para cada item i :
Se incluir o item i : resolva o problema para os itens restantes com a capacidade reduzida.
Se não incluir o item i : resolva o problema para os itens restantes sem alterar a capacidade.
Retorne a melhor das duas soluções.
Atividade 05: Problema da Mochila com Busca Exaustiva¶
Objetivo: Implemente uma solução para o problema da mochila usando a técnica de busca exaustiva através de recursão em C++. O objetivo é maximizar o valor dos objetos dentro da mochila sem exceder sua capacidade.
Utilize os arquivos de entrada Entrada 1, Entrada 2, Entrada 3 e Entrada 4 para validar sua implementação. Verifique se o programa consegue determinar a combinação correta para maximizar o valor na mochila para cada arquivo de entrada.
Compare o tempo de execução para os diferentes arquivos de entrada. Considerando que o algoritmo explora todas as combinações possíveis, discuta suas limitações em termos de tempo de execução e uso de memória.
Será que você consegue um resultado melhor?
Entrada 1 -> Peso ocupado: 10 Kg, Valor alcançado: 266 dinheiros
Entrada 2 -> Peso ocupado: 2 Kg, Valor alcançado: 156 dinheiros
Entrada 3 -> Peso ocupado: 95 Kg, Valor alcançado: 236 dinheiros
Entrada 4 -> Peso ocupado: 10 Kg, Valor alcançado: 55 dinheiros
Disponibilize no seu repositório o código e as análises até as 23h59 de 07/03.