Variante del problema de la mochila

11

¿Cómo abordaría el problema de la mochila en una situación de programación dinámica si ahora tiene que limitar el número de elementos en la mochila por una constante ? Este es el mismo problema (peso máximo de , cada artículo tiene un valor peso ) pero solo puede agregar artículo (s) a la mochila y obviamente necesita optimizar el valor de la mochila.W v w ppWvwp

¿Necesitamos una tercera dimensión o podríamos encontrar otro enfoque sin ella? Intenté simplemente agregar la cantidad de elementos en la mochila en la celda y tomar el valor máximo al final con la cantidad de elementos <= pero no es la MEJOR solución.p

usuario11536
fuente
Este es un buen ejercicio de tarea. Que has intentado ¿Te sientes cómodo haciendo programación dinámica? (Si no, tal vez intente algunos ejercicios para practicar con él). ¿Ha estudiado el algoritmo de programación dinámica estándar para el problema de la mochila? Busque una forma de modificar ese enfoque estándar. Su tarea principal es diseñar cuál debería ser el conjunto de subproblemas. En el enfoque estándar, un subproblema se caracteriza por un parámetro (un límite en el peso de los elementos). Puede considerar usar dos parámetros (por lo tanto, un conjunto más grande de subproblemas). Pruebe varias posibilidades: ¿qué obtiene?
DW

Respuestas:

9

Muy buena pregunta!

Tienes razón dos veces:

  1. Propagar el número de artículos en la mochila no conduce a soluciones óptimas.
  2. Una solución consiste en agregar una tercera dimensión. Esto es bastante simple, pero es necesario tener en cuenta algunos hechos al hacerlo. Sin embargo, tenga en cuenta que no es la única alternativa

A continuación, supongo que está familiarizado con la solución basada en programación dinámica. En particular, no discutiré cómo recorrer la tabla hacia atrás para determinar la solución .

Centrémonos primero en el caso típico: la cantidad de artículos no está restringida . En este caso, simplemente construye una tabla donde contiene el valor óptimo cuando la capacidad total de la mochila es igual a y solo se consideran los primeros elementos. De aquí:T i , j i jTTi,jij

Ti,j=max{Ti,j1,Tiwj,j1+vj}

donde y representan el peso y el valor del elemento -th respectivamente. Si es la capacidad total de su mochila y hay un total de elementos, proporciona la solución óptima . Se sabe que este algoritmo se ejecuta en tiempo pseudopolinomial y una de sus bellezas es que solo considera aquellas combinaciones que se ajustan a la capacidad máxima.wjvjjCNTC,N

Sin embargo, esto no es suficiente al agregar su restricción: un número máximo de elementos . La razón es que la fórmula de recurrencia anterior no tiene en cuenta las diferentes combinaciones de elementos:p

  1. Primero, si entonces para que el elemento se agrega a la mochila a pesar de la cantidad máxima de elementos considerados, --- para que pueda estar violando su restricción. Bueno, es posible que sienta la tentación de aplicar la fórmula anterior para realizar un seguimiento del número de elementos insertados en cada paso y no agregar otros si el número de elementos actualmente en la mochila excede pero,Ti,j1<(Tiwj,j1+vj)Ti,j=(Tiwj,j1+vj)jpp
  2. Segundo, si entonces para que este elemento no se agregue pero eso podría ser un gran error en caso de que la solución óptima ya consista en el número máximo de elementos para insertar en la mochila. La razón es que no estamos comparando adecuadamente: por un lado, preservar la solución óptima que consiste en elementos seleccionados entre los anteriores ; por otro lado, para insertar el elemento -ésimo y, además, considerar el mejor subconjunto con elementos entre los anteriores .Ti,j1>(Tiwj,j1+vj)Ti,j=Ti,j1Ti,j1p(j1)j(p1)(j1)

De modo que una primera solución consiste en agregar una tercera dimensión. Para su caso, deje que sea ​​la solución óptima cuando la capacidad de la mochila es , solo se consideran los primeros elementos y no se permite colocar más de elementos en la mochila. Ahora,Ti,j,kijk

  • Si está calculando para una cantidad de elementos estrictamente menor o igual que la cantidad de elementos que se pueden insertar ( ), entonces proceda como de costumbre pero con el mismo valor de :Ti,j,kjkkTi,j,k=max{Ti,j1,k,Tiwj,j1,k+vj}
  • Ahora, si tiene que calcular para una cantidad de elementos estrictamente mayores que la cantidad de elementos que se pueden insertar ( ), entonces:Ti,j,kj>kTi,j,k=max{Ti,j1,k,Tiwj,j1,k1+vj}

La primera expresión debe ser clara. El segundo funciona ya que la capa de la tabla realiza un seguimiento de la mejor combinación de elementos entre los primeros como se requiere anteriormente.(k1)T(k1)(j1)

Una implementación eficiente de este algoritmo no necesita calcular para todos los . Tenga en cuenta que las relaciones de recurrencia anteriores relacionan la capa con y, por lo tanto, es posible alternar entre dos capas sucesivas (por ejemplo, si está interesado en la solución óptima con , solo use dos capas consecutivas: 0 y 1, 1 y 2, 2 y 3, 3 y 4 y ya está). En otras palabras, este algoritmo toma el doble de memoria requerida por el enfoque tradicional basado en la programación dinámica y, por lo tanto, todavía puede ejecutarse en tiempo pseudo-polinomial.Ti,j,kkk(k1)k=4

¡Tenga en cuenta, sin embargo, que esta no es la única solución! Y hay otro que puede encontrar más elegante. En las fórmulas anteriores, recuperamos la solución óptima que consistía en no más de elementos entre los primeros como . ¡Sin embargo, debe quedar claro que esto es exactamente igual a simplemente usando la tabla original! es decir, la solución óptima con no más de ítems también puede recuperarse considerando las soluciones óptimas con 1 ítem, 2 ítems, 3 ítems, ...(k1)(j1)Ti,j1,k1maxp=0,j1{Ti,p}k(j1)elementos ... Para que esta formulación funcione, también debe realizar un seguimiento del número de elementos considerados en cada solución parcial para que necesite dos enteros por celda. Esta ocupación de memoria da como resultado exactamente los mismos requisitos de memoria del algoritmo mostrado anteriormente (usando una tercera dimensión en forma de capas )k .

Espero que esto ayude,

Carlos Linares López
fuente
Muy buena respuesta, gracias. He podido superarlo antes de tu publicación implementando también una tercera dimensión.
user11536
Ouch, muchas gracias por cerrar la pregunta y me alegra saber que te gustó la respuesta. Para aclarar mis ideas, también probé una implementación de este algoritmo en Python. Si está interesado en echarle un vistazo, avíseme y con gusto lo publicaré (o se lo enviaré). Saludos,
Carlos Linares López
Explicación asombrosa del problema de la mochila multidimensional. Sin embargo, me preguntaba si teníamos un caso similar pero con exactamente k elementos, solo veremos los valores devueltos por la columna k de la tercera dimensión. Si no hay valores allí, entonces devuelve 0.I No estoy seguro si tengo razón porque todavía soy nuevo en la programación dinámica.
SteveIrwin
@ CarlosLinaresLópez gran respuesta. ¿Podrías compartir también el script de Python? ¿Quizás publicarlo en gist.github.com?
Saad Malik el
1
¡Hola Carlos! Publiqué una pregunta de seguimiento para usar su fórmula alternativa aquí: Encontrar los n mejores artículos en una mochila 0/1 . De todos modos, ¡espero que estés disfrutando de tus vacaciones!
Saad Malik el