Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2. Marco Teorico
Figura 2: Problema de Knapsack.
2.1. Definición formal Fuente: (Pisinger)
El Algoritmo de Knapsack o comunmente conocido como
el Problema de la Mochila define el proceso para la opti- Tanto la capacidad como los valores y los pesos serán siem-
mizacion, por un lado se tiene la mochila en la que se van pre enteros positivos, el objetivo entonces consiste selec-
a introducir los objetos, y por otro lado se tiene la lista de cionar un subconjunto de N tal que la ganancia total de
N objetos, teniendo los siguientes datos:[1] esos objetos dada por los valores que suman sean maxi-
mizados, y el total de los pesos de objetos seleccionados
W : capacidad maxima de la mochila no exceda el valor lımite de la capacidad de la mochila,
1
Algoritmos Paralelos y Distribuidos - Carlos Fernando Montoya Cubas Julio del 2023
matemáticamente podemos expresar este problema de la la capacidad de la mochila ni los límites establecidos para
siguiente manera: cada elemento.
La formulación matemática de esta versión del problema
Pn es la siguiente:[2]
M axf (x) = i=1 vi × wi
Pn
Max i=1 wi x i
Sugeto a:
Pn
i=1 wi × xi ≤ wmax sugeto a :
xi ∈ {0, 1} Pn
i=1 wi × xi ≤ wmax
i = 1, 2, . . . , n
Donde : 0 ≤ xi ≤ bi , i = 1, ..., n
2
Algoritmos Paralelos y Distribuidos - Carlos Fernando Montoya Cubas Julio del 2023
3
Algoritmos Paralelos y Distribuidos - Carlos Fernando Montoya Cubas Julio del 2023
1 int main()
2 {int sequential_knapsack(std::vector<Item>& A, std::vector
3 <Item>& B, int W) { 3.3.4. Parte 4, Ejecución
4 int n = A.size();
5 std::vector<int> MaxB(n + 1);
6 MaxB[n] = B[n].v; El algoritmo realiza una ejecución secuencial para seleccio-
7 for (int i = n - 1; i > 0; i--) {
8 if (B[i].v > MaxB[i + 1]) {
nar los elementos de forma óptima y maximizar el valor
9 MaxB[i] = B[i].v; total dentro de la capacidad de la mochila. Recorre los ele-
10 }
11 else {
mentos de los vectores A y B de manera secuencial, calcula
12 MaxB[i] = MaxB[i + 1]; los valores necesarios para la optimización y determina la
13 }
14 }
mejor combinación de elementos.
15 int Best = 0;
16 int i = 0;
17 int j = 0; 1 Mejor valor de la mochila es: 27
18 while (i < n && j < n) {
19 if (A[i].w + B[j].w > W) {
20 j++;
21 continue;
22 }
23 if (A[i].v + MaxB[j] > Best) {
24 Best = A[i].v + MaxB[j];
25
26
}
i++;
4. Conclusiones
27 }
28 return Best;
29 }
De acuerdo a lo investigado, se puede concluir que el pro-
30 blema de Knapsack, el cual tiene muchas aplicaciones y
31
es imprescindible en diversos campos, incluyendo la in-
formática. Es un desafío de optimización donde se busca
3.3.3. Parte 3, int main() seleccionar un conjunto de elementos de manera que se
En la función main, se crean dos vectores A y B que maximice el valor total, respetando una capacidad de pe-
contienen objetos de la clase Item, representando los ele- so determinada. Es un problema NP-Completo y existen
mentos disponibles para la mochila.Se define la capaci- algoritmos eficientes, como la programación dinámica, pa-
dad máxima de la mochila (W). Se llama a la función ra encontrar soluciones aproximadas o exactas.
(sequentialk napsack) pasando los vectores A y B, y la
capacidad máxima W.El resultado obtenido se almacena
en la variable (bestv alue). Se muestra el resultado en la Referencias
salida.
[1] S. L. M. J, “Optimización de rutas de mantenimiento,
1 int main()
2 { aplicando una red neuronal tipo Hopfield y el algorit-
3 std::vector<Item> A = { Item(2, 10), Item(3, 5), Item(4, 15), mo Knapsack,” espe, n.o 97, págs. 28-31, 2019.
4 Item(1, 7) };
5 std::vector<Item> B = { Item(3, 20), Item(1, 4), Item(2, 3),
6 Item(2, 12) }; [2] D. V. López, “Solución en paralelo del problema de la
7 int W = 6; mochila,” ingenieria informatica, n.o 42, págs. 13-16,
8
9 int best_value = sequential_knapsack(A, B, W); 2017.
10 std::cout << "Mejor valor de la mochila es: "<< best_value
11 << std::endl; [3] D. Pisinger, “Knapsack Problems,” Computer And
12 return 0;
13 } Operations Research, vol. 32, n.o 10, págs. 2271-2284,
2005.