Muy buena pregunta!
Tienes razón dos veces:
- Propagar el número de artículos en la mochila no conduce a soluciones óptimas.
- 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,j−1,Ti−wj,j−1+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
- 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,j−1<(Ti−wj,j−1+vj)Ti,j=(Ti−wj,j−1+vj)jpp
- 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,j−1>(Ti−wj,j−1+vj)Ti,j=Ti,j−1Ti,j−1p(j−1)j(p−1)(j−1)
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,kj≤kkTi,j,k=max{Ti,j−1,k,Ti−wj,j−1,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,j−1,k,Ti−wj,j−1,k−1+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.(k−1)T(k−1)(j−1)
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(k−1)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, ...(k−1)(j−1)Ti,j−1,k−1maxp=0,j−1{Ti,p}k(j−1)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,