Está en la página 1de 4

Algoritmos Paralelos y Distribuidos - Carlos Fernando Montoya Cubas Julio del 2023

Implementación del Problema de la Mochila con


OpenMP, CUDA y MPI : Knapsack
Conde Padin, George Adolfo 141664 – Choquenaira Quispe, Noe Franklin 133962 – Llasa Yucra, Ruth
Margot 191892 – Lope Tores, Marisol171938 – Muñoz Quispe, Ruth Mery 182924

Resumen — El problema de la mochila (Knapsack) es un ejemplo de un problema NP-completo. Específicamente,


se clasifica como un problema de optimización combinatoria NP-completo. Se basa en un problema de optimización
combinatoria muy referenciado en la literatura de Investigación Operativa, tanto por sus aplicaciones como por su
estructura, lo que lo hace apto para la evaluación del rendimiento de métodos de búsqueda inteligente útiles para la
resolución de problemas de optimización combinatoria.
En el presente trabajo se desarrollará el Algoritmo del problema de la Mochila para determinar la combinación de
objetos que maximice el valor total que se puede llevar en la mochila sin exceder su capacidad. Considerando diferentes
tamaños o valores como entrada, enfoques y técnicas para encontrar soluciones aproximadas o subóptimas.
palabras clave — Knapsack, Problema de la mochila, problema de la mochila acotado, CUDA, Algoritmo Knapsack,
Algoritmos Paralelos y Distribuidos.
J

1. Introduccion vi : Valor del i-esimo objeto


wi : peso del i-esimo objeto
n este trabajo de investigación, exploraremos el Pro-
E blema de Knapsack y su importancia en diversas apli-
caciones. El problema se formula matemáticamente como
la maximización de la suma de los valores de los objetos
seleccionados, sujeta a la restricción de que la suma de los
pesos no exceda la capacidad máxima de la mochila.
Las aplicaciones del Problema de Knapsack abarcan
diversas áreas. Por ejemplo, se ha utilizado en la elabo-
ración y corrección de exámenes, donde los estudiantes Figura 1: Formulación matematica del problema de la mo-
pueden elegir qué preguntas responder para maximizar su chila
puntuación total. También se aplica en la gestión de conte-
nedores en aduanas, donde se deben considerar diferentes La solución al problema viene dada por el vector de va-
pesos, tamaños y valores de los objetos a enviar. Además, riables binarias X(x1, x2, ..., xn). Estas variables binarias
el problema de Knapsack encuentra aplicaciones en cripto- tienen el siguiente significado:
grafía, logística, distribución de carga, gestión de recursos
y muchas otras áreas.
En este trabajo, se presentará un algoritmo secuencial
para resolver el Problema de Knapsack utilizando progra-
mación dinámica. La programación dinámica es una téc-
nica matemática que descompone el problema en etapas
y combina las decisiones para encontrar la solución ópti-
ma. Se explicará el proceso de programación dinámica y se
proporcionará el pseudocódigo del algoritmo secuencial.

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

1. vi : Es el beneficio del objeto i. 2.4. Formulación


2. xi : Es un valor entre 0 y 1, donde 1 significa que va
en la mochila y 0 que no va en la mochila. Dado un conjunto de objetos v = [1, 2, 3, ...., n], con utili-
3. wi : Es el peso del objeto i. dades unitarias p1, p2, ..., p3,y con pesos w1, w2, .., wn res-
4. wmax : Es el peso máximo de la mochila. pectivamente, y dado que se tiene un recipiente (la “mochi-
la”), de capacidad , el problema KP consiste en determinar
2.2. El problema de la mochila binaria qué objetos debo seleccionar para incluir en la mochila, de
tal manera que la utilidad total de los objetos que se car-
La definición formal del problema de la mochila presentada gan sea la máxima posible. Esta formulación establece que
en la sección anterior no solo representa las características la solución óptima del problema de la mochila implica en-
genéricas de los problemas que entran dentro de la cate- contrar la combinación de variables xi que maximice el
goría del problema de la mochila, sino que también define valor total, sujeto a la restricción de capacidad. Es impor-
el problema de la mochila más básico y extendido. Está tante tener en cuenta que el problema de la mochila es un
versión del problema de la mochila es conocida como el problema de optimización combinatoria NP-completo, lo
problema de la mochila binaria, también llamada mochi- que implica que encontrar la solución óptima para conjun-
la 0/1. Este nombre viene dado por el hecho de que para tos de objetos grandes puede requerir una cantidad signifi-
cada ítem disponible solo hay dos opciones, elegir si coger- cativa de tiempo y recursos computacionales. Por lo tanto,
lo o no, siendo esta una decisión binaria. De entre todas se suelen utilizar algoritmos aproximados o heurísticas pa-
las definiciones e instancias del problema de la mochila, ra resolver el problema de manera eficiente en la práctica.
la más importante entre ellas el problema de la mochila
binaria. 1. Puede ser vista como el problema de programación
El problema de la mochila binaria implica seleccionar ele- lineal más simple.
mentos para llenar una mochila de capacidad limitada, 2. Aparece como subproblema en muchos problemas
donde cada elemento puede ser elegido o no. El objetivo más complejos.
es maximizar el valor total de los elementos seleccionados 3. Es ampliamente usada en situaciones prácticas
sin exceder la capacidad de la mochila.
2.3. El problema de la mochila acotado 3. Algoritmo Secuencial
El problema de la mochila se puede generalizar eliminan-
do la restricción de que solo hay una unidad de cada ítem, 3.1. Historia
por lo que el mismo ítem se puede escoger varias veces.
Para ello se tiene que conocer otra característica de cada El problema de la mochila ha estado muy relacionado con
ítem. bi para i1..n, es la cota superior para el ítem i, el la programación dinámica como forma de resolución. Es
número máximo de copias de ese ítem que se pueden me- decir , suele ser uno de los primeros problemas a estudiar
ter en la mochila. En está instancia del problema el vector cuando se imparten enseñanzas sobre programación diná-
X(x1, x2, ..., xn)ya no es un vector de variables binarias, mica.
sino un vector de variables enteras, donde xi representa Esto es debido no solo a que el problema tiene una defini-
el número de copias del i-ésimo objeto introducidas en la ción clara y simple, sino que el algoritmo de programación
mochila. dinámica usado para resolver el problema también es bas-
El problema de la mochila acotado es un desafío de opti- tante intuitivo y fácil de implementar.
mización en el que se busca seleccionar elementos de un
conjunto dado para llenar una mochila de capacidad li-
mitada. A diferencia del problema de la mochila binaria,
3.2. Algoritmo secuencial con programa-
en este caso se permite seleccionar múltiples copias de un ción dinámica
mismo elemento, siempre y cuando se respete un límite
preestablecido para cada elemento. El objetivo es maximi- Utiliza una técnica de programación dinámica y recursión
zar el valor total de los elementos seleccionados sin exceder para encontrar la combinación óptima de elementos que

2
Algoritmos Paralelos y Distribuidos - Carlos Fernando Montoya Cubas Julio del 2023

maximiza el valor total dentro de la capacidad de la mo- 3.2.3. Parte 3, Ejecución


chila. Este enfoque divide el problema en subproblemas
más pequeños y utiliza la recursión para combinar las so- El algoritmo realiza una ejecución recursiva para explo-
luciones de los subproblemas y obtener la solución global. rar todas las combinaciones posibles de elementos que se
pueden seleccionar para maximizar el valor total en la mo-
3.2.1. Parte 1, int knapsack(int v[], int w[], int n, chila. A medida que se realizan las llamadas recursivas y se
int W) evalúan los resultados, se determina la mejor combinación
y se devuelve el máximo valor obtenido.
La función knapsack implementa el algoritmo de la mo-
chila 0-1 utilizando programación dinámica y recursión. 1 El valor de la mochila es 60
Toma como entrada los valores (v) y pesos (w) de los ele-
mentos, el número total de elementos (n), y la capacidad
máxima de la mochila (W). 3.3. Algoritmo secuencial para la selec-
En el caso base, se verifica si la capacidad de la mochila ción de elementos en dos listas
es negativa o si no quedan elementos o si la capacidad es
0. En estos casos, se devuelve un valor específico. Usa un enfoque secuencial que recorre los elementos de dos
Por ejemplo: listas de forma secuencial para encontrar la combinación
óptima que maximiza el valor total dentro de la capacidad
INT_MIN o 0
de la mochila. Este enfoque no utiliza programación diná-
para indicar que no se pueden seleccionar más elemen- mica ni recursión, sino que utiliza bucles y condicionales
tos o que la solución no es válida. En el caso recursi- para seleccionar los elementos de manera secuencial.
vo, se exploran dos opciones: incluir el elemento actual
en la mochila o excluirlo. Se realiza una llamada recur-
siva para el subproblema con una capacidad reducida 3.3.1. Parte 1, Class Item
y una cantidad menor de elementos. Luego, se retor-
na el máximo valor obtenido entre estas dos opciones. La clase Item se utiliza para representar los elementos de
la mochila. Tiene dos atributos: w para el peso y v para
el valor del elemento. Se define un constructor para ini-
Algortimo 1: Versión Secuencial, Solución al Proble- cializar los atributos w y v al crear objetos de la clase Item.
ma de la Mochila Mediante Programación Dinámica
Algortimo 2: Versión Secuencial, Solución al Problema
de la Mochila Mediante selección de elementos en dos listas
1 int knapsack(int v[], int w[], int n, int W) {
2 if (W < 0) {
3 return INT_MIN;
4 } 1
5 // caso base: 2 class Item {
6 if (n < 0 || W == 0) { 3 public:
7 return 0; 4 int w;
8 } 5 int v;
9 // Caso 1. 6 Item(int weight, int value) : w(weight), v(value) {}
10 int include = v[n] + knapsack(v, w, n - 1, W - w[n]); 7 };
11 // Caso 2.
12 int exclude = knapsack(v, w, n - 1, W);
13 return max(include, exclude);
14 }
3.3.2. Parte 2, int sequential_knapsack ()

La función (sequential_knapsack) toma tres parámetros:


3.2.2. Parte 2, int main() dos vectores A y B que contienen objetos de la clase Item,
y un entero W que representa la capacidad máxima de la
La función main define los valores y arreglos de entrada, mochila, Se obtiene el tamaño n del vector A, Se calcu-
llama a la función knapsack y muestra el resultado obte- lan los valores MaxB utilizando un bucle, que representa
nido en la salida estándar. los valores máximos de los elementos en el vector B para
cada posición i, Se inicializan variables para almacenar el
1 int main() mejor valor (Best), los índices (i y j), y se inicia un bucle
2 { while. Dentro del bucle, se verifican las condiciones para
3 int v[] = { 20, 5, 10, 40, 15, 25 };
4 int w[] = { 1, 2, 3, 8, 7, 4 }; seleccionar los elementos de los vectores A y B de forma
5 int W = 10; secuencial. Si la suma de los pesos es menor o igual a la
6 int n = sizeof(v) / sizeof(v[0]);
7 std::cout << "El valor de la mochila es " << knapsack(v, w, capacidad máxima de la mochila, se verifica si el valor to-
8 n - 1, W); tal obtenido supera el mejor valor actual. Finalmente, se
9 return 0;
10 } retorna el mejor valor obtenido.

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.

También podría gustarte