El problema de la mochila (también problema de la mochila ) es un problema de optimización combinatoria NP-completo . Obtuvo su nombre del objetivo final: poner tantas cosas valiosas como sea posible en una mochila, siempre que la capacidad de la mochila sea limitada. Se pueden encontrar diversas variaciones del problema de la mochila en economía , matemáticas aplicadas , criptografía y logística .
En general, el problema se puede formular de la siguiente manera: de un conjunto dado de artículos con las propiedades "costo" y "peso", se requiere seleccionar un subconjunto con el costo total máximo, observando la restricción sobre el peso total.
Deje que haya un conjunto de objetos, cada uno de los cuales tiene dos parámetros: masa y valor. También hay una mochila con cierta capacidad de carga. La tarea es construir una mochila con el valor máximo de los artículos dentro, respetando el límite de la mochila en la masa total.
Matemáticamente, el problema se formula de la siguiente manera: hay carga. Para cada carga, se determina su masa y valor . El límite del peso total de los artículos en una mochila lo establece la capacidad de carga . Necesario
maximizar con restricciones y [1] .El planteamiento del problema permite un gran número de generalizaciones, según las condiciones impuestas a la mochila, los objetos o su elección. Las variedades más populares son las siguientes:
Una de las variantes más generales del problema de la mochila es la no lineal . Se puede formular de la siguiente manera:
Deje que el vector determine el número de instancias de cada artículo en la mochila. Entonces el problema es encontrar el mínimo de la función
,
con una restricción dada:
.
Se supone que las funciones son continuas y derivables en . es una constante entera , el conjunto no está vacío [7] .
En el caso de funciones lineales , el problema se reduce a una de las formulaciones clásicas, dependiendo del conjunto :
La libertad en la elección de funciones permite resolver una clase más amplia de tareas, incluida la organización de las instalaciones de producción., la distribución óptima de muestras en una muestra regionalizada , o la solución del problema cuadrático de la mochila [7] .
Como se mencionó anteriormente, el problema de la mochila pertenece a la clase de NP-completo , y hasta el momento no se ha encontrado ningún algoritmo polinomial que lo resuelva en un tiempo razonable. Por tanto, a la hora de resolver el problema de la mochila, es necesario elegir entre algoritmos exactos, que no son aplicables a mochilas "grandes", y aproximados, que funcionan rápidamente, pero no garantizan la solución óptima del problema.
Al igual que con otros problemas discretos, el problema de la mochila se puede resolver enumerando exhaustivamente todas las soluciones posibles.
De acuerdo con la condición del problema, hay artículos que se pueden poner en una mochila y debe determinar el costo máximo de la carga, cuyo peso no exceda .
Para cada artículo, hay 2 opciones: el artículo se coloca en la mochila o el artículo no se coloca en la mochila. Luego, la enumeración de todas las opciones posibles tiene complejidad temporal , lo que permite que se use solo para una pequeña cantidad de elementos [8] . Con un aumento en el número de objetos, el problema se vuelve irresoluble por este método en un tiempo aceptable.
La figura muestra un árbol de iteraciones para tres elementos. Cada hoja corresponde a algún subconjunto de elementos. Después de compilar el árbol, es necesario encontrar una hoja con el valor máximo entre aquellas cuyo peso no exceda [9] .
El método de ramificación y límite es una variación del método de fuerza bruta con la diferencia de que, a sabiendas, se excluyen las ramas no óptimas del árbol de fuerza bruta. Al igual que el método de fuerza bruta, te permite encontrar la solución óptima y, por lo tanto, pertenece a los algoritmos exactos.
El algoritmo original, propuesto por Peter Kolesar en 1967, propone ordenar los artículos por su costo unitario (la relación entre el valor y el peso) y construir un árbol de fuerza bruta . Su mejora radica en que en el proceso de construcción de un árbol para cada nodo se estima una cota superior sobre el valor de la solución, y la construcción del árbol continúa sólo para el nodo con la estimación máxima [10] . Cuando el límite superior máximo está en una hoja del árbol, el algoritmo termina su trabajo.
La capacidad de ramificar y enlazar para reducir el número de iteraciones depende en gran medida de los datos de entrada. Es recomendable usarlo solo si los valores específicos de los artículos difieren significativamente [11] .
Con una restricción adicional sobre los pesos de los artículos, el problema de la mochila se puede resolver en tiempo pseudopolinomio utilizando métodos de programación dinámica .
Sea el peso de cada artículo un número entero positivo. Entonces, para resolver el problema, es necesario calcular las soluciones óptimas para todos , donde es la capacidad de carga dada. Definamos como el valor máximo de artículos que se pueden colocar en una mochila con una capacidad de carga de .
Porque puedes escribir fórmulas recursivas :
donde son el valor y el peso del elemento -th, respectivamente, y el máximo del conjunto vacío debe considerarse igual a cero.
De hecho, la última ecuación es la ecuación funcional de R. Bellman o la ecuación funcional de programación dinámica. En este caso, para resolverlo basta con calcular todos los valores de , desde y hasta [12] . Si además almacenamos en cada paso un conjunto de elementos que alcanza el valor máximo, entonces el algoritmo también proporcionará el conjunto óptimo de elementos.
Dado que en cada paso es necesario encontrar el máximo de elementos, el algoritmo tiene una complejidad computacional de . Debido a que puede depender exponencialmente del tamaño de la entrada, el algoritmo es pseudopolinomio . Por lo tanto, la eficiencia de este algoritmo está determinada por el valor de . El algoritmo da excelentes resultados para , pero no muy buenos para [13] .
Problema de mochila 0-1La solución del problema de la mochila 0-1 se acerca a la solución del problema anterior, pero hay que tener en cuenta que cada artículo está en una sola copia. Sea el valor máximo de artículos obtenidos de los primeros disponibles, con un peso total no superior a .
Calculando , puedes encontrar la solución exacta. Si la matriz cabe en la memoria de la máquina, entonces este algoritmo es probablemente uno de los más eficientes [12] .
// Aporte: // Valores de los elementos (cargados en la matriz v) // Pesos de los elementos (cargados en la matriz w) // Número de elementos (n) // Capacidad de carga (W) para j de 0 a W hacer : metro [ 0 , j ] := 0 para i de 1 a n hacer : para j de 0 a W hacer : si w [ i ] > j entonces : metro [ yo , j ] := metro [ yo -1 , j ] más : metro [ yo , j ] := max ( metro [ yo -1 , j ], metro [ yo -1 , j - w [ yo ]] + v [ yo ])La solución se puede ilustrar mediante programación dinámica de la siguiente manera: en un plano bidimensional, el número de objetos se representa a lo largo del eje y su peso se representa a lo largo del eje. En el primer paso, se construyen dos líneas a partir del origen de coordenadas: una horizontal, correspondiente al hecho de que no se tomó el primer objeto, y una inclinada, correspondiente al primer objeto tomado. Sus proyecciones sobre el eje son iguales al peso del objeto. En el segundo paso, se vuelven a construir 2 líneas, horizontales (no se tomó el segundo objeto) u oblicuas (se tomó el segundo objeto). Pongamos la longitud de los arcos horizontales a cero, y la longitud de los arcos oblicuos al valor del objeto [14] . Así, cualquier solución al problema corresponde a algún camino en el árbol construido . El problema se reduce a encontrar un camino de máxima longitud [14] . Vamos a la capacidad de la mochila .
Número de artículo | Valor | El peso |
---|---|---|
una | 3 | 5 |
2 | 5 | diez |
3 | cuatro | 6 |
cuatro | 2 | 5 |
Se puede ver en la figura que el valor total para la solución óptima es 7, ya que este es el valor máximo en el árbol construido.
Programación dinámica sobre valores de artículosLas relaciones de recurrencia se pueden escribir no solo con respecto al peso de los objetos, sino también con respecto al valor. Para ello, denotamos el peso mínimo de los artículos por el valor total , que se puede obtener de los primeros artículos. Si no se puede obtener el peso requerido, márquelo como .
Después de eso, resolvemos la ecuación de programación dinámica funcional :
,
con condiciones iniciales :
Como ocurre con la mayoría de los problemas NP-completos, no siempre es necesario obtener una solución exacta, ya que en los problemas aplicados se pueden aplicar soluciones cercanas al óptimo.
Para resolver el problema con un algoritmo codicioso , es necesario ordenar las cosas por su valor específico (es decir, la relación entre el valor de un artículo y su peso) y colocar los artículos con el valor específico más alto en la mochila [10] .
El tiempo de ejecución de este algoritmo es la suma del tiempo de clasificación y el tiempo de apilamiento. La complejidad de clasificar elementos es . A continuación, calcula cuántos artículos caben en la mochila en el tiempo total [10] . La complejidad resultante cuando se necesita ordenar y cuando los datos ya están ordenados [10] .
ejemplo _ Vamos a la capacidad de la mochila . Los artículos ya están ordenados por valor unitario. Usemos el algoritmo codicioso.
i | el peso | precio | precio/peso |
---|---|---|---|
una | quince | 60 | cuatro |
2 | treinta | 90 | 3 |
3 | cincuenta | 100 | 2 |
Ponemos el primer artículo en la mochila, y después el segundo. El tercer artículo no cabe en la mochila. El valor total de los artículos en la mochila es 150. Si se tomaran el segundo y el tercer artículo, el valor total sería 190. Por lo tanto, hemos obtenido una solución no óptima.
Debe entenderse que un algoritmo codicioso puede conducir a una respuesta arbitrariamente alejada de la óptima. Por ejemplo, si un artículo tiene un peso de 1 y un costo de 2, y el otro tiene un peso de W y un costo de W, entonces el algoritmo codicioso obtendrá un costo total de 2 con una respuesta óptima de W. En al mismo tiempo, el mismo algoritmo para el problema de la mochila sin límites conducirá a una respuesta de al menos el 50% del valor del óptimo [10] .
El algoritmo voraz fue propuesto por primera vez por George Danzig [16] para resolver el problema de la mochila ilimitada.
Dado que no se encontró el algoritmo exacto para resolver el problema en tiempo polinomial , se planteó el problema de obtener una solución polinomial con precisión garantizada . Para ello, existen una serie de esquemas aproximados de tiempo totalmente polinomial , es decir, con complejidad que es un polinomio en y .
La idea detrás del esquema clásico es reducir la precisión con la que se dan los valores de los elementos. Al combinar elementos de valor similar en un grupo, puede reducir la cantidad de elementos diferentes. El algoritmo se escribe de la siguiente manera [15] :
Hay muchos esquemas de aproximación diferentes. Sin embargo, dependen fuertemente de la formulación del problema de la mochila. Por ejemplo, si en la condición aparece una segunda restricción del tipo desigualdad (mochila bidimensional), entonces el problema ya no tiene un esquema de tiempo polinomial conocido [17] .
Al igual que con otros problemas de optimización NP-hard, se utilizan algoritmos genéticos para resolver el problema de la mochila . No garantizan encontrar la solución óptima en tiempo polinomial y no dan una estimación de la proximidad de la solución a la óptima, pero tienen buenos indicadores de tiempo, lo que le permite encontrar una solución bastante buena más rápido que otros deterministas o heurísticos conocidos. métodos. [Dieciocho]
Cada individuo ( genotipo ) es un subconjunto de los artículos que queremos empacar en la mochila (su peso total puede exceder la capacidad de carga permitida). Para mayor comodidad, la información se almacena como cadenas binarias, en las que cada bit determina si este artículo cabe en una cartera [19] .
La función de aptitud determina la proximidad de la solución a la óptima. Por ejemplo, el valor total de los artículos puede servir como tal, siempre que el peso total no exceda la capacidad de carga.
Tras una serie de cambios generacionales en los que se cruzan los individuos más aptos y se ignora al resto, se supone que el algoritmo mejora las soluciones originales [19] .
Resolviendo el problema de la suma de subconjuntosUn caso especial del problema de la mochila 0-1 es el problema de la suma de subconjuntos . Sea la capacidad de carga de la mochila, el peso del -ésimo artículo y su costo . Por lo tanto, la tarea es cargar la mochila lo más apretada posible o agotar completamente los recursos:
Para solucionarlo, puedes utilizar el citado algoritmo genético . Un individuo es un vector . Como función de fitness, se debe usar la proximidad del peso total de los objetos a , con la única característica de que los conjuntos que caben en una mochila son más preferibles (el peso total de los objetos es menor que ) [19] .
Definamos formalmente la función de aptitud . Sea la suma de los pesos de todos los elementos. Entonces , la desviación máxima posible del peso de los artículos en la mochila de .
Sea el peso total de elementos para el vector dado. Luego ponemos:
[19]
Usando el algoritmo general, podemos encontrar una solución aproximada:
La ejecución se interrumpe cuando se encuentra una solución o después de un número determinado de iteraciones [19] .
No se sabe con certeza quién fue el primero en dar la formulación matemática del problema de la mochila. Una de las primeras referencias a ella se encuentra en un artículo de George Ballard Matthews[20] [21] con fecha de 1897. El estudio intensivo de este problema comenzó después de la publicación por D. B. Dantzig en 1957 del libro “ English. Problema extremo de variable discreta » [22] , especialmente en los años 70-90 del siglo XX, tanto por teóricos como por practicantes [2] . En muchos sentidos, el interés fue causado por una formulación bastante simple del problema, una gran cantidad de sus variedades y propiedades y, al mismo tiempo, la complejidad de su solución. En 1972, este problema se incluyó en la lista de problemas NP-completos de M. Karp ( artículo en inglés "Reducibility Among Combinatorial Problems" ) [23] .
Una interpretación visual del problema de la mochila ha llevado a que haya encontrado aplicación en varios campos del conocimiento: en las matemáticas, la informática y, en la intersección de estas ciencias, en la criptografía . En uno de los trabajos sobre lingüística computacional [24] , se propone la formulación del problema del resumen automático de textos , un caso especial del cual corresponde a la formulación del problema de la mochila.
Basado en el problema de la mochila, se creó el primer algoritmo de cifrado asimétrico . La idea de la criptografía de clave pública fue presentada por primera vez por Whitfield Diffie y Martin Hellman en la Conferencia Nacional de Computación de 1976 [25] [26] .
Además, el problema de la mochila puede servir como modelo para una gran cantidad de problemas industriales [2] [27] :
En 1978, Ralph Merkle y Martin Hellman desarrollaron el primer algoritmo para el cifrado de clave pública generalizada , el criptosistema Merkle-Hellman , basado en el problema de la mochila. Publicaron versiones de una sola etapa ( inglés con una sola iteración ) y de varias etapas ( inglés con varias iteraciones ), y el algoritmo solo podía usarse para el cifrado. Pero Adi Shamir lo adaptó para su uso en firmas digitales [28] .
Posteriormente se propusieron otros criptosistemas basados en el problema de la mochila, algunos de los cuales son una modificación del criptosistema Merkle-Hellman. Criptosistemas conocidos [29] :
Debido a que el problema general de la mochila no se puede resolver exactamente en un tiempo razonable, se puede utilizar en problemas criptográficos . Para ello, con un conjunto de elementos de conocimiento público, representaremos el mensaje como un conjunto de elementos transmitidos y enviaremos su peso total [28] .
Definición. Un vector mochila es un conjunto ordenado de n elementos, donde es el peso del -ésimo elemento [30] .
El vector mochila es una clave pública . Para cifrar el texto sin formato, se divide en bloques de bits, y cada bit determina la presencia de un elemento en la mochila (por ejemplo, el texto sin formato corresponde a la presencia de los primeros cuatro de los seis elementos posibles en la mochila). Se cree que uno indica la presencia de un artículo en la mochila y cero indica su ausencia [28] .
Después de eso, el peso total de los artículos en la mochila para el texto sin formato dado se calcula y se transmite como texto cifrado [28] .
Un ejemplo de cifrado con este algoritmo:
Sea dado un vector mochila de longitud .
Texto sin formato | 1 1 1 1 1 0 | 0 0 1 1 0 0 | 0 0 0 0 0 0 | 0 0 0 0 0 1 |
---|---|---|---|---|
cosas en la mochila | 3 4 6 7 10 | 6 7 | once | |
Texto cifrado | 3 + 4 + 6 + 7 + 10 = 30 | 6 + 7 = 13 | 0 | once |
El problema de la mochila | |
---|---|
Aplicaciones | |
Criptosistemas basados en el problema de la mochila |
|
Además |
Problemas NP-completos | |
---|---|
Problema de maximización del apilamiento (packing) |
|
teoría de grafos teoría de conjuntos | |
Problemas algorítmicos | |
Juegos de lógica y rompecabezas. | |