winqsb volumen una sirve que problema planteamiento para multiple modelo mochila knapsack eleccion ejemplo con carga caracteristicas algorithm recursion knapsack-problem

algorithm - volumen - problema de la mochila multiple eleccion



Problema de mochila de constricción múltiple (5)

Mochila con múltiples restricciones es un problema de embalaje. Leer. http://en.wikipedia.org/wiki/Packing_problem

Si hay más de una restricción (por ejemplo, un límite de volumen y un límite de peso, donde el volumen y el peso de cada elemento no están relacionados), obtenemos el problema de la mochila con restricciones múltiples, el problema de la mochila multidimensional o m problema de mochila tridimensional.

¿Cómo codigo esto de la manera más optimizada? Bueno, uno puede desarrollar una solución recursiva de fuerza bruta. Puede ser ramificado y encuadernado ... pero básicamente es exponencial la mayor parte del tiempo hasta que realice algún tipo de memorización o use programación dinámica que de nuevo requiere una gran cantidad de memoria si no se hace bien.

El problema que estoy enfrentando es esto

Tengo mi función KnapSack KnapSack (Capacidad, Valor, i) en lugar del KnapSack común (Capacidad, i) ya que tengo límites superiores en ambos. ¿Alguien puede guiarme con esto? o proporcionar recursos adecuados para resolver estos problemas para n razonablemente grande

o es este NP completo?

Gracias


Como un buen ejemplo serviría el siguiente problema:

Dado un gráfico no dirigido G que tiene pesos positivos y N vértices.

Empiezas con una suma de M dinero. Para pasar por un vértice i, debe pagar S [i] dinero. Si no tienes suficiente dinero, no puedes atravesar ese vértice. Encuentre la ruta más corta desde el vértice 1 hasta el vértice N, respetando las condiciones anteriores; o declarar que tal camino no existe. Si existe más de una ruta con la misma longitud, genere la más económica. Restricciones: 1

Pseudocódigo:

Set states(i,j) as unvisited for all (i,j) Set Min[i][j] to Infinity for all (i,j) Min[0][M]=0 While(TRUE) Among all unvisited states(i,j) find the one for which Min[i][j] is the smallest. Let this state found be (k,l). If there wasn''t found any state (k,l) for which Min[k][l] is less than Infinity - exit While loop. Mark state(k,l) as visited For All Neighbors p of Vertex k. If (l-S[p]>=0 AND Min[p][l-S[p]]>Min[k][l]+Dist[k][p]) Then Min[p][l-S[p]]=Min[k][l]+Dist[k][p] i.e. If for state(i,j) there are enough money left for going to vertex p (l-S[p] represents the money that will remain after passing to vertex p), and the shortest path found for state(p,l-S[p]) is bigger than [the shortest path found for state(k,l)] + [distance from vertex k to vertex p)], then set the shortest path for state(i,j) to be equal to this sum. End For End While Find the smallest number among Min[N-1][j] (for all j, 0<=j<=M); if there are more than one such states, then take the one with greater j. If there are no states(N-1,j) with value less than Infinity - then such a path doesn''t exist.


Fusiona las restricciones. Mire http://www.diku.dk/~pisinger/95-1.pdf capítulo 1.3.1 llamado Merging the Restraints.

Un ejemplo es decir que tienes
variable, constraint1, constraint2
1, 43, 66
2, 65, 54
3, 34, 49
4, 99, 32
5, 2, 88

Multiplica la primera restricción por un número grande y luego agrégala a la segunda restricción.

Así que tienes
restricción variable fusionada
1, 430066
2, 650054
3, 340049
4, 990032
5, 20088

A partir de ahí, haga cualquier algoritmo que quiera hacer con una restricción. El principal limitador que le viene a la mente es cuántos dígitos puede contener su variable.


Como dijiste que el volumen y el peso son cantidades positivas, trata de usar ese hecho de que el peso siempre disminuye:

knap[position][vol][t]

Ahora t=0 cuando wt es positivo, t=1 cuando wt es negativo.


Hay métodos heurísticos codiciosos que calculan una "eficiencia" para cada elemento, que se ejecutan rápidamente y proporcionan soluciones aproximadas.

Puede usar un algoritmo de bifurcación y enlace. Puede obtener un límite inferior inicial usando una heurística codiciosa, que se puede utilizar para inicializar la solución titular. Puede calcular los límites superiores para varios subproblemas considerando cada una de las limitaciones m una por vez (relajando las otras restricciones en el problema), luego use el límite más bajo como un límite superior para el problema original. Esta técnica se debe a Shih. Sin embargo, esta técnica probablemente no funcionará bien si ninguna restricción particular tiende a dominar la solución, o si la solución inicial de los codiciosos como la heurística no se acerca al óptimo.

Hay mejores algoritmos más modernos que son más difíciles de implementar. ¡Consulte los documentos de "problemas de mochila multidimensional" de J Puchinger!