В этом варианте проблемы множественных ранцев учитывается только вес предметов, поэтому я думаю, что это больше похоже на проблему множественных сумм, но это легче объяснить с помощью ранцев.
Есть n
рюкзака, каждый из которых заполнен предметами до его индивидуальной максимальной грузоподъемности C[j]
, где 0 <= j < n
.
Рюкзаки опорожняются на стопку, всего m
предметов, каждый с весомW[i]
, где 0 <= i < m
.Элементы в стопке перемешиваются, и k
элементы удаляются из стопки, где 0 <= k <= m
.
n
, m
, C[j]
и W[i]
- целые числа, большие нуля;i
, j
и k
являются неотрицательными целыми числами.
Это состояние является начальным входом для алгоритма упаковки.
Как переупаковать все остальные m - k
предметов, чтобы не превышать индивидуальную вместимость каждого рюкзака C[j]
?
- Упаковщик не знает, как ранее были упакованы рюкзаки
- Рюкзаки былиранее упаковано, поэтому существует правильное решение
- Количество используемых ранцев не нуждается в оптимизации, также могут быть пустые и / или недостаточно упакованные ранцы
- Предметы не могут быть разбиты на более легкие части, даже если полученные веса также целые числа
- При необходимости предметы и рюкзаки можно сортировать
- Моя самая большая проблема - правильность, а время -более важно, что использование памяти
- Из предоставленных мной примеров входных данных, как правило,
m <= 10
и k ~= 7
, но бывают случаи, когда m = 20
или k = 0
или k = m
Iне знаю, гарантируется ли first-fit или упаковка в полный бин алгоритмы гарантированно дадут правильный результат, когда k
приближается к нулю, например: если алгоритм упаковывает столько маленькихПредметы, как можно больше, в большом рюкзаке, но затем нужно упаковать большой предмет, и единственный большой рюкзак уже заполнен.
Вот простой пример в Javascript того, чего я хочу достичь:
let knapsacks = [
{ capacity: 13 },
{ capacity: 9 },
{ capacity: 60 },
{ capacity: 81 }
];
let items = [ 52, 81, 13 ];
// all items packed
let aSolution = [
{
capacity: 13,
items: [ 13 ]
},
{ capacity: 9 },
{
capacity: 65,
items: [ 52 ]
},
{
capacity: 81,
items: [ 81 ]
}
];
// item 81 not packed
let notASolution = [
{ capacity: 13 },
{ capacity: 9 },
{ capacity: 65 },
{
capacity: 81,
items: [ 52, 13 ]
}
];