logo

0/1 Problema de mochila

Aqui a mochila é como um recipiente ou uma bolsa. Suponha que fornecemos alguns itens que têm algum peso ou lucro. Temos que colocar alguns itens na mochila de forma que o valor total produza o lucro máximo.

Por exemplo, o peso do contentor é de 20 kg. Temos que selecionar os itens de forma que a soma do peso dos itens seja menor ou igual ao peso do container, e o lucro seja máximo.

Existem dois tipos de problemas de mochila:

  • 0/1 problema da mochila
  • Problema da mochila fracionária

Discutiremos ambos os problemas um por um. Primeiro, aprenderemos sobre o problema da mochila 0/1.

Qual é o problema da mochila 0/1?

O problema da mochila 0/1 significa que os itens estão completamente ou nenhum item está preenchido em uma mochila. Por exemplo, temos dois itens com pesos de 2kg e 3kg, respectivamente. Se escolhermos o item de 2kg, não poderemos escolher o item de 1kg do item de 2kg (o item não é divisível); temos que escolher o item de 2kg completamente. Este é um problema de mochila 0/1 em que ou escolhemos o item completamente ou escolhemos esse item. O problema da mochila 0/1 é resolvido pela programação dinâmica.

Qual é o problema da mochila fracionária?

O problema da mochila fracionária significa que podemos dividir o item. Por exemplo, temos um item de 3kg então podemos pegar o item de 2kg e deixar o item de 1kg. O problema da mochila fracionária é resolvido pela abordagem Greedy.

Exemplo de problema da mochila 0/1.

Considere o problema em que os pesos e os lucros são:

Pesos: {3, 4, 6, 5}

Lucros: {2, 3, 1, 4}

O peso da mochila é de 8 kg

O número de itens é 4

O problema acima pode ser resolvido usando o seguinte método:

xeu= {1, 0, 0, 1}

= {0, 0, 0, 1}

quais meses estão no terceiro trimestre

= {0, 1, 0, 1}

Acima estão as combinações possíveis. 1 indica que o item foi completamente separado e 0 significa que nenhum item foi separado. Como existem 4 itens, as combinações possíveis serão:

24= 16; Então. Existem 16 combinações possíveis que podem ser feitas usando o problema acima. Uma vez feitas todas as combinações, temos que selecionar a combinação que proporciona o lucro máximo.

Outra abordagem para resolver o problema é a abordagem de programação dinâmica. Na abordagem de programação dinâmica, o problema complicado é dividido em subproblemas, então encontramos a solução de um subproblema e a solução do subproblema será usada para encontrar a solução de um problema complexo.

Como esse problema pode ser resolvido usando a abordagem de programação dinâmica?

Primeiro,

criamos uma matriz mostrada abaixo:

0 1 2 3 4 5 6 7 8
0
1
2
3
4

Na matriz acima, as colunas representam o peso, ou seja, 8. As linhas representam os lucros e os pesos dos itens. Aqui não pegamos o peso 8 diretamente, o problema é dividido em subproblemas, ou seja, 0, 1, 2, 3, 4, 5, 6, 7, 8. A solução dos subproblemas seria salva no células e a resposta ao problema seriam armazenadas na célula final. Primeiro, escrevemos os pesos em ordem crescente e os lucros de acordo com seus pesos mostrados abaixo:

Emeu= {3, 4, 5, 6}

peu= {2, 3, 4, 1}

A primeira linha e a primeira coluna seriam 0, pois não há item para w = 0

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0
2 0
3 0
4 0

Quando i=1, W=1

Em1= 3; Como temos apenas um item no conjunto com peso 3, mas a capacidade da mochila é 1. Não podemos encher o item de 3kg na mochila com capacidade de 1 kg então adicione 0 em M[1][1] mostrado abaixo :

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0
2 0
3 0
4 0

Quando eu = 1, W = 2

Em1= 3; Como temos apenas um item no conjunto com peso 3, mas a capacidade da mochila é 2. Não podemos encher o item de 3kg na mochila com capacidade de 2 kg então adicione 0 em M[1][2] mostrado abaixo :

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0
2 0
3 0
4 0

Quando i=1, W=3

Em1= 3; Como temos apenas um item no conjunto com peso igual a 3, e o peso da mochila também é 3; portanto, podemos encher a mochila com um item de peso igual a 3. Colocamos o lucro correspondente ao peso 3, ou seja, 2 em M[1][3] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2
2 0
3 0
4 0

Quando i = 1, W = 4

W1= 3; Como temos apenas um item no conjunto com peso igual a 3, e o peso da mochila é 4; portanto, podemos encher a mochila com um item de peso igual a 3. Colocamos o lucro correspondente ao peso 3, ou seja, 2 em M[1][4] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2
2 0
3 0
4 0

Quando i = 1, W = 5

W1= 3; Como temos apenas um item no conjunto com peso igual a 3, e o peso da mochila é 5; portanto, podemos encher a mochila com um item de peso igual a 3. Colocamos o lucro correspondente ao peso 3, ou seja, 2 em M[1][5] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2
2 0
3 0
4 0

Quando eu =1, W=6

W1= 3; Como temos apenas um item no conjunto com peso igual a 3, e o peso da mochila é 6; portanto, podemos encher a mochila com um item de peso igual a 3. Colocamos o lucro correspondente ao peso 3, ou seja, 2 em M[1][6] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2
2 0
3 0
4 0

Quando i = 1, W = 7

W1= 3; Como temos apenas um item no conjunto com peso igual a 3, e o peso da mochila é 7; portanto, podemos encher a mochila com um item de peso igual a 3. Colocamos o lucro correspondente ao peso 3, ou seja, 2 em M[1][7] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2
2 0
3 0
4 0

Quando eu =1, W =8

W1= 3; Como temos apenas um item no conjunto com peso igual a 3, e o peso da mochila é 8; portanto, podemos encher a mochila com um item de peso igual a 3. Colocamos o lucro correspondente ao peso 3, ou seja, 2 em M[1][8] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0
3 0
4 0

Agora o valor de 'i' é incrementado e se torna 2.

Quando eu = 2, W = 1

O peso correspondente ao valor 2 é 4, ou seja, w2= 4. Como temos apenas um item no conjunto com peso igual a 4, e o peso da mochila é 1. Não podemos colocar o item de peso 4 em uma mochila, então somamos 0 em M[2][1 ] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0
3 0
4 0

Quando eu = 2, W = 2

O peso correspondente ao valor 2 é 4, ou seja, w2= 4. Como temos apenas um item no conjunto com peso igual a 4, e o peso da mochila é 2. Não podemos colocar o item de peso 4 em uma mochila, então somamos 0 em M[2][2 ] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0
3 0
4 0

Quando eu = 2, W = 3

O peso correspondente ao valor 2 é 4, ou seja, w2= 4. Como temos dois itens no conjunto com pesos 3 e 4, e o peso da mochila é 3. Podemos colocar o item de peso 3 em uma mochila, então somamos 2 em M[2][3] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2
3 0
4 0

Quando eu = 2, W = 4

O peso correspondente ao valor 2 é 4, ou seja, w2= 4. Como temos dois itens no conjunto com pesos 3 e 4, e o peso da mochila é 4. Podemos colocar o item de peso 4 em uma mochila, pois o lucro correspondente ao peso 4 é maior que o item com peso 3, então adicionamos 3 em M[2][4] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3
3 0
4 0

Quando eu = 2, W = 5

O peso correspondente ao valor 2 é 4, ou seja, w2= 4. Como temos dois itens no conjunto com pesos 3 e 4, e o peso da mochila é 5. Podemos colocar um item de peso 4 em uma mochila e o lucro correspondente ao peso é 3, então somamos 3 em M[2][5] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3
3 0
4 0

Quando eu = 2, W = 6

O peso correspondente ao valor 2 é 4, ou seja, w2= 4. Como temos dois itens no conjunto com pesos 3 e 4, e o peso da mochila é 6. Podemos colocar um item de peso 4 em uma mochila e o lucro correspondente ao peso é 3, então somamos 3 em M[2][6] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3 3
3 0
4 0

Quando eu = 2, W = 7

O peso correspondente ao valor 2 é 4, ou seja, w2= 4. Como temos dois itens no conjunto com pesos 3 e 4, e o peso da mochila é 7. Podemos colocar itens de peso 4 e 3 em uma mochila e os lucros correspondentes aos pesos são 2 e 3; portanto, o lucro total é 5, então adicionamos 5 em M[2][7] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 0 3 3 3 5
3 0
4 0

Quando eu = 2, W = 8

O peso correspondente ao valor 2 é 4, ou seja, w2= 4. Como temos dois itens no conjunto com pesos 3 e 4, e o peso da mochila é 7. Podemos colocar itens de peso 4 e 3 em uma mochila e os lucros correspondentes aos pesos são 2 e 3; portanto, o lucro total é 5, então adicionamos 5 em M[2][7] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3 3 5 5
3 0
4 0

Agora o valor de 'i' é incrementado e se torna 3.

Quando eu = 3, W = 1

finalizar a compra com git

O peso correspondente ao valor 3 é 5, ou seja, w3= 5. Como temos três itens no conjunto com pesos 3, 4 e 5, e o peso da mochila é 1. Não podemos colocar nenhum dos itens em uma mochila, então adicionamos 0 em M[3][ 1] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3 3 5 5
3 0 0
4 0

Quando eu = 3, W = 2

O peso correspondente ao valor 3 é 5, ou seja, w3= 5. Como temos três itens no conjunto com peso 3, 4 e 5, e o peso da mochila é 1. Não podemos colocar nenhum dos itens em uma mochila, então adicionamos 0 em M[3][ 2] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3 3 5 5
3 0 0 0
4 0

Quando eu = 3, W = 3

O peso correspondente ao valor 3 é 5, ou seja, w3= 5. Como temos três itens no conjunto com peso 3, 4 e 5 respectivamente e o peso da mochila é 3. O item com peso 3 pode ser colocado na mochila e o lucro correspondente ao item é 2, então adicionamos 2 em M[3][3] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3 3 5 5
3 0 0 0 2
4 0

Quando eu = 3, W = 4

O peso correspondente ao valor 3 é 5, ou seja, w3= 5. Como temos três itens no conjunto com peso 3, 4 e 5 respectivamente, e o peso da mochila é 4. Podemos ficar com o item com peso 3 ou 4; o lucro (3) correspondente ao peso 4 é maior que o lucro correspondente ao peso 3, então adicionamos 3 em M[3][4] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3 3 5 5
3 0 0 0 1 3
4 0

Quando eu = 3, W = 5

O peso correspondente ao valor 3 é 5, ou seja, w3= 5. Como temos três itens no conjunto com peso 3, 4 e 5 respectivamente, e o peso da mochila é 5. Podemos manter o item com peso 3, 4 ou 5; o lucro (3) correspondente ao peso 4 é maior que os lucros correspondentes ao peso 3 e 5, então adicionamos 3 em M[3][5] mostrado abaixo:

numerando o alfabeto
0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3 3 5 5
3 0 0 0 1 3 3
4 0

Quando eu =3, W = 6

O peso correspondente ao valor 3 é 5, ou seja, w3= 5. Como temos três itens no conjunto com peso 3, 4 e 5 respectivamente, e o peso da mochila é 6. Podemos manter o item com peso 3, 4 ou 5; o lucro (3) correspondente ao peso 4 é maior que os lucros correspondentes ao peso 3 e 5, então adicionamos 3 em M[3][6] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3 3 5 5
3 0 0 0 1 3 3 3
4 0

Quando eu =3, W = 7

O peso correspondente ao valor 3 é 5, ou seja, w3= 5. Como temos três itens no conjunto de peso 3, 4 e 5 respectivamente, e o peso da mochila é 7. Nesse caso, podemos manter ambos os itens de peso 3 e 4, a soma do lucro seria igual a (2 + 3), ou seja, 5, então adicionamos 5 em M[3][7] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3 3 5 5
3 0 0 0 1 3 3 3 5
4 0

Quando eu = 3, W = 8

O peso correspondente ao valor 3 é 5, ou seja, w3= 5. Como temos três itens no conjunto de peso 3, 4 e 5 respectivamente, e o peso da mochila é 8. Nesse caso, podemos manter ambos os itens de peso 3 e 4, a soma dos o lucro seria igual a (2 + 3), ou seja, 5, então adicionamos 5 em M[3][8] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3 3 5 5
3 0 0 0 1 3 3 3 5 5
4 0

Agora o valor de 'i' é incrementado e se torna 4.

Quando eu = 4, W = 1

O peso correspondente ao valor 4 é 6, ou seja, w4= 6. Como temos quatro itens no conjunto de pesos 3, 4, 5 e 6 respectivamente, e o peso da mochila é 1. O peso de todos os itens é maior que o peso da mochila, então não podemos adicione qualquer item na mochila; Portanto, adicionamos 0 em M[4][1] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3 3 5 5
3 0 0 0 1 3 3 3 5 5
4 0 0

Quando eu = 4, W = 2

O peso correspondente ao valor 4 é 6, ou seja, w4= 6. Como temos quatro itens no conjunto de pesos 3, 4, 5 e 6 respectivamente, e o peso da mochila é 2. O peso de todos os itens é maior que o peso da mochila, então não podemos adicione qualquer item na mochila; Portanto, adicionamos 0 em M[4][2] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3 3 5 5
3 0 0 0 1 3 3 3 5 5
4 0 0 0

Quando eu = 4, W = 3

O peso correspondente ao valor 4 é 6, ou seja, w4= 6. Como temos quatro itens no conjunto de pesos 3, 4, 5 e 6 respectivamente, e o peso da mochila é 3. O item com peso 3 pode ser colocado na mochila e o lucro correspondente ao o peso 4 é 2, então adicionaremos 2 em M[4][3] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3 3 5 5
3 0 0 0 1 3 3 3 5 5
4 0 0 0 2

Quando eu = 4, W = 4

O peso correspondente ao valor 4 é 6, ou seja, w4= 6. Como temos quatro itens no conjunto de pesos 3, 4, 5 e 6 respectivamente, e o peso da mochila é 4. O item com peso 4 pode ser colocado na mochila e o lucro correspondente ao o peso 4 é 3, então adicionaremos 3 em M[4][4] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3 3 5 5
3 0 0 0 1 3 3 3 5 5
4 0 0 0 2 3

Quando eu = 4, W = 5

O peso correspondente ao valor 4 é 6, ou seja, w4= 6. Como temos quatro itens no conjunto de pesos 3, 4, 5 e 6 respectivamente, e o peso da mochila é 5. O item com peso 4 pode ser colocado na mochila e o lucro correspondente ao o peso 4 é 3, então adicionaremos 3 em M[4][5] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3 3 5 5
3 0 0 0 1 3 3 3 5 5
4 0 0 0 2 3 3

Quando eu = 4, W = 6

O peso correspondente ao valor 4 é 6, ou seja, w4= 6. Como temos quatro itens no conjunto com pesos 3, 4, 5 e 6 respectivamente, e o peso da mochila é 6. Nesse caso, podemos colocar os itens na mochila com peso 3, 4 , 5 ou 6 mas o lucro, ou seja, 4 correspondente ao peso 6 é o maior entre todos os itens; portanto, adicionamos 4 em M[4][6] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3 3 5 5
3 0 0 0 1 3 3 3 5 5
4 0 0 0 2 3 3 4

Quando eu = 4, W = 7

O peso correspondente ao valor 4 é 6, ou seja, w4= 6. Como temos quatro itens no conjunto de pesos 3, 4, 5 e 6 respectivamente, e o peso da mochila é 7. Aqui, se somarmos dois itens de pesos 3 e 4 então produzirá o máximo lucro, ou seja, (2 + 3) é igual a 5, então adicionamos 5 em M[4][7] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3 3 5 5
3 0 0 0 2 3 3 3 5 5
4 0 0 0 2 3 3 4 5

Quando eu = 4, W = 8

O peso correspondente ao valor 4 é 6, ou seja, w4= 6. Como temos quatro itens no conjunto de pesos 3, 4, 5 e 6 respectivamente, e o peso da mochila é 8. Aqui, se somarmos dois itens de pesos 3 e 4 então produzirá o máximo lucro, ou seja, (2 + 3) é igual a 5, então adicionamos 5 em M[4][8] mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3 3 5 5
3 0 0 0 2 3 3 3 5 5
4 0 0 0 2 3 3 4 5 5

Como podemos observar na tabela acima que 5 é o lucro máximo entre todas as entradas. O ponteiro aponta para a última linha e a última coluna com valor 5. Agora vamos comparar o valor 5 com a linha anterior; se a linha anterior, ou seja, i = 3 contiver o mesmo valor 5, o ponteiro se deslocará para cima. Como a linha anterior contém o valor 5, o ponteiro será deslocado para cima, conforme mostrado na tabela abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3 3 5 5
3 0 0 0 2 3 3 3 5 5
4 0 0 0 2 3 3 4 5 5

Novamente, compararemos o valor 5 da linha acima, ou seja, i = 2. Como a linha acima contém o valor 5, o ponteiro será novamente deslocado para cima, conforme mostrado na tabela abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3 3 5 5
3 0 0 0 2 3 3 3 5 5
4 0 0 0 2 3 3 4 5 5

Novamente, compararemos o valor 5 da linha acima, ou seja, i = 1. Como a linha acima não contém o mesmo valor, consideraremos a linha i=1, e o peso correspondente à linha é 4. Portanto , selecionamos o peso 4 e rejeitamos os pesos 5 e 6 mostrados abaixo:

x = {1, 0, 0}

O lucro correspondente ao peso é 3. Portanto, o lucro restante é (5 - 3) igual a 2. Agora vamos comparar este valor 2 com a linha i = 2. Como a linha (i = 1) contém o valor 2 ; portanto, o ponteiro deslocou-se para cima mostrado abaixo:

0 1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0 0 0
1 0 0 0 2 2 2 2 2 2
2 0 0 0 2 3 3 3 5 5
3 0 0 0 2 3 3 3 5 5
4 0 0 0 2 3 3 4 5 5

Novamente comparamos o valor 2 com uma linha acima, ou seja, i = 1. Como a linha i = 0 não contém o valor 2, então a linha i = 1 será selecionada e o peso correspondente a i = 1 é 3 mostrado abaixo:

X = {1, 1, 0, 0}

O lucro correspondente ao peso é 2. Portanto, o lucro restante é 0. Comparamos o valor 0 com a linha acima. Como a linha acima contém um valor 0, mas o lucro correspondente a esta linha é 0. Neste problema, dois pesos são selecionados, ou seja, 3 e 4 para maximizar o lucro.