Проблема с несколькими ограничениями на рюкзак

Если существует более одного ограничения (например, как ограничение объема, так и ограничение веса, когда объем и вес каждого элемента не связаны), мы получаем проблему с множественным ограничением рюкзака, проблему многомерного рюкзака, или m-мерной проблемой ранца.

Как я могу кодировать это наиболее оптимизированным образом? Ну, можно разработать рекурсивное решение грубой силы. Может быть веткой и связанными.. но по существу своей экспонентой большую часть времени, пока вы не сделаете какую-то память или не используете динамическое программирование, которое снова занимает огромное количество памяти, если не сделано хорошо.

Проблема, с которой я столкнулся, - это

У меня есть функция ранца KnapSack (Capacity, Value, i) вместо обычных KnapSack (Capacity, i), поскольку у меня есть верхний предел для обоих из них. может ли кто-нибудь вести меня с этим? или предоставить подходящие ресурсы для решения этих задач для достаточно больших n

или этот NP завершен?

Спасибо

Ответы

Ответ 1

В качестве хорошего примера будет рассмотрена следующая проблема:

Для неориентированного графа G, имеющего положительные веса и N вершин.

Вы начинаете с суммы денег M. Для прохождения через вершину я вы должны заплатить S [i] деньги. Если у вас недостаточно денег, вы не можете пройти через эту вершину. Найдите кратчайший путь от вершины 1 до вершины N, соблюдая приведенные выше условия; или указать, что такой путь не существует. Если существует более одного пути с одинаковой длиной, выведите самый дешевый. Ограничения: 1

псевдокод:

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.

Ответ 2

Объединить ограничения. Посмотрите http://www.diku.dk/~pisinger/95-1.pdf глава 1.3.1 называется "Слияние ограничений".

Пример, скажем, у вас есть variable, constraint1, constraint2
1, 43, 66
2, 65, 54
3, 34, 49
4, 99, 32
5, 2, 88

Умножьте первое ограничение на некоторое большое число, затем добавьте его ко второму ограничению.

Итак, у вас есть переменное, объединенное ограничение
1, 430066
2, 650054
3, 340049
4, 990032
5, 20088

Оттуда выполняйте любой алгоритм, который вы хотели бы сделать с одним ограничением. Главный ограничитель, который приходит на ум с этим количеством цифр, которые может удерживать ваша переменная.

Ответ 4

Есть жадные, как эвристики, которые вычисляют "эффективность" для каждого элемента, которые быстро запускаются и дают приблизительные решения.

Вы можете использовать алгоритм ветвления и привязки. Вы можете получить начальную нижнюю границу, используя жадные, подобные эвристике, которые можно использовать для инициализации действующего решения. Вы можете рассчитать верхние границы для разных подзадач, рассмотрев каждую из m ограничений по одному (ослабляя другие ограничения в задаче), затем используйте нижнюю из этих границ как верхнюю границу исходной задачи. Эта техника объясняется Ши. Однако этот метод, вероятно, не будет работать, если никакое конкретное ограничение не будет доминировать над решением, или если начальное решение от жадного, как эвристика, не близко к оптимальному.

Есть более современные алгоритмы, которые сложнее реализовать, см. статьи "Многомерные проблемы с рюкзаком" Дж. Пучингера!

Ответ 5

Как вы сказали, объем и вес оба являются положительными величинами, попробуйте использовать тот факт, что вес всегда уменьшается:

knap[position][vol][t]

Теперь t=0, когда wt положительно, t=1, когда wt отрицательно.