Multiple Constraint Knapsack Problem

后端 未结 5 1786
花落未央
花落未央 2020-12-08 05:29

If there is more than one constraint (for example, both a volume limit and a weight limit, where the volume and weight of each item are not related), we get the multiply-con

相关标签:
5条回答
  • 2020-12-08 05:50

    There are greedy like heuristics that calculate an "efficiency" for each item, that run quickly and yield approximate solutions.

    You can use a branch and bound algorithm. You can get an initial lower bound using a greedy like heuristic, which can be used to initialize the incumbent solution. You can calculate upper bounds for various sub-problems by considering each of the m constraints one at time (relaxing the other constraints in the problem), then use the lowest of these bounds as an upper bound for the original problem. This technique is due to Shih. However this technique probably won't work well if no particular constraint tends to dominate the solution, or if the initial solution from the greedy like heuristic is not close to the optimum.

    There are better more modern algorithms which are harder to implement, see "multidimensional knapsack problem" papers by J Puchinger!

    0 讨论(0)
  • 2020-12-08 06:00

    Merge the constraints. Look at http://www.diku.dk/~pisinger/95-1.pdf chapter 1.3.1 called Merging the Constraints.

    An example is say you have
    variable , constraint1 , constraint2
    1 , 43 , 66
    2 , 65 , 54
    3 , 34 , 49
    4 , 99 , 32
    5 , 2 , 88

    Multiply the first constraint by some big number then add it to the second constraint.

    So you have
    variable , merged constraint
    1 , 430066
    2 , 650054
    3 , 340049
    4 , 990032
    5 , 20088

    From there do whatever algorithm you wanted to do with one constraint. The main limiter that comes to mind with this how many digits your variable can hold.

    0 讨论(0)
  • 2020-12-08 06:00

    As a good example would serve the following problem:

    Given an undirected graph G having positive weights and N vertices.

    You start with having a sum of M money. For passing through a vertex i, you must pay S[i] money. If you don't have enough money - you can't pass through that vertex. Find the shortest path from vertex 1 to vertex N, respecting the above conditions; or state that such path doesn't exist. If there exist more than one path having the same length, then output the cheapest one. Restrictions: 1

    Pseudocode:

    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.
    
    0 讨论(0)
  • 2020-12-08 06:08

    Knapsack with multiple constraints is a packing problem. Read up. http://en.wikipedia.org/wiki/Packing_problem

    0 讨论(0)
  • 2020-12-08 06:10

    As you said vol and weight both are positive quantities, try to use that fact that weight always decreases:

    knap[position][vol][t]
    

    Now t=0 when wt is positive, t=1 when wt is negative.

    0 讨论(0)
提交回复
热议问题