Новая бин-упаковка?

Я изучаю проблему с упаковкой в ​​мусорное ведро, но не совсем то же самое. Задача состоит в том, чтобы поместить n предметов в минимальное количество ящиков так, чтобы общий вес не превышал вместимость ящиков. (классическое определение)

Разница в том, что у каждого элемента есть вес и граница, а вместимость корзины динамически определяется минимальной границей< /em> элементов в этой корзине.

Например, у меня есть четыре элемента A[11,12], B[1,10], C[3,4], D[20,22] ([weight,bound]). Теперь, если я положу предмет A в корзину, назову ее b1, тогда вместимость b1 станет равной 12. Теперь я попытаюсь положить предмет B в корзину b1, но потерплю неудачу, потому что общий вес равен 11+1 = 12, а вместимость b1 становится 10, что меньше общего веса. Итак, B помещается в корзину b2, вместимость которой становится равной 10. Теперь поместите предмет C в корзину b2, потому что общий вес равен 1+3 = 4, а емкость b2 становится равной 4.

Не знаю, решен ли этот вопрос в каких-то областях с каким-то названием. Или это вариант bin-packing, который где-то обсуждался. Я не знаю, правильно ли это место для публикации вопроса, любая помощь приветствуется!


person Shuhao Zhang tony    schedule 14.06.2015    source источник
comment
Что ж, это определенно обобщение bin-packing, установив Bound[i] = CONST для всех i, и вы получите классическую bin-packing. (Сокращение от binpacking в значительной степени следует вышеизложенному)   -  person amit    schedule 14.06.2015
comment
Лучше бы я не видел твой вопрос. Теперь я не могу перестать думать об этой проблеме. Интересный!   -  person stakx - no longer contributing    schedule 14.06.2015


Ответы (4)


Обычно при разработке алгоритмов для NP-сложных задач необходимо повторно использовать методы, а не целые алгоритмы. Здесь хорошо переносятся алгоритмы стандартной упаковки контейнеров, использующие метод ветвей и границ с генерацией столбцов.

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

Эта модифицированная задача о рюкзаке состоит в том, чтобы, учитывая предметы с весами, прибылью и границами, найти наиболее выгодный набор предметов, общий вес которых меньше минимальной границы. Динамическая программа для решения задачи о рюкзаке с небольшими целыми весами легко переносится без потери эффективности. Просто отсортируйте элементы по убыванию; затем при формировании наборов, включающих самый последний элемент, ограничение веса ограничивается только этим элементом.

person David Eisenstat    schedule 14.06.2015
comment
Я не совсем понимаю вашу мысль, почему прибыль? (или, почему это рюкзак?) Моя исходная задача не имеет никакого значения. Можете ли вы объяснить это на примере, пожалуйста? - person Shuhao Zhang tony; 17.06.2015
comment
@ShuhaoZhangtony Прибыль поступает от внешней линейной программы. - person David Eisenstat; 17.06.2015
comment
Я думаю, что это самый идеальный ответ на данный момент! - person Anony-mouse; 18.06.2015

Следующее основано на ответе Anony-mouse. Я не эксперт по алгоритмам, поэтому расценивайте нижеследующее как «просто мои два цента», чего они стоят.

Я думаю, что Anony-mouse правильно начинает с самых маленьких предметов (по привязке). Это связано с тем, что емкость корзины имеет тенденцию становиться меньше по мере того, как вы добавляете в нее больше предметов; максимальная вместимость корзины определяется первым помещенным в нее предметом, после этого она никогда не может увеличиваться.

Таким образом, вместо того, чтобы начинать с большой корзины и постепенно уменьшать ее вместимость, а также беспокоиться о выносе слишком больших предметов, которые раньше помещались, давайте просто постараемся сохранить вместимость корзин как можно более постоянной. Если мы сможем поддерживать стабильную емкость бинов, мы сможем использовать «стандартные» алгоритмы, которые ничего не знают о «привязке».

Поэтому я бы предложил следующее:

  1. Сгруппируйте все элементы по границам.

    Это позволит вам использовать стандартный алгоритм упаковки контейнеров на группу, потому что, если все элементы имеют одинаковую границу (т. е. граница постоянна), ее можно игнорировать. Теперь привязка означает, что вы заранее знаете итоговую вместимость контейнеров.

  2. Начните с группы с наименьшей границей и выполните стандартную упаковку для ее элементов.

    Это приведет к тому, что 1 или несколько ячеек будут иметь вместимость, равную границе всех элементов в них.

  3. Перейдите к группе элементов со следующей большей границей. Посмотрите, есть ли какие-либо предметы, которые все еще можно поместить в уже существующую корзину (т. е. корзину, созданную на предыдущих шагах).

    Обратите внимание, что привязку можно снова игнорировать; поскольку все ранее существовавшие ячейки уже имеют меньшую вместимость, чем ограничение этих дополнительных предметов, на вместимость ячеек нельзя повлиять; важен только вес, поэтому вы можете использовать «стандартные» алгоритмы.

    Я подозреваю, что этот шаг является примером проблемы (множественных) рюкзаков, поэтому обратите внимание на алгоритмы рюкзака, чтобы определить, как распределить эти предметы по уже существующим, частично заполненным корзинам.

  4. Возможно, что группа товаров из предыдущей группы была обработана только частично, могут остаться товары. Они попадут в одну или несколько новых корзин: повторите шаг 3.

  5. Повторяйте вышеуказанные шаги (начиная с 3), пока не останется предметов.

person stakx - no longer contributing    schedule 14.06.2015
comment
Мне очень нравится твоя идея, как от тебя, так и от мыши. На самом деле, я сейчас пытаюсь найти предел производительности. Напомним, что убывающая по первому подгонке (FFD) имеет абсолютное приблизительное отношение 3/2 по сравнению с оптимальным. Но кажется, что для моей проблемы подобная идея может быть сколь угодно плохой (т. е. без гарантии приблизительного соотношения). - person Shuhao Zhang tony; 17.06.2015
comment
@ShuhaoZhangtony У вас есть лучшее решение? - person Anony-mouse; 19.06.2015
comment
Способ сравнения эвристического метода - это его сложность во время выполнения и приблизительная оценка. Как я уже сказал, поскольку предложенное вами решение не дает никаких ограничений, его невозможно сравнить с каким-либо другим решением. Но вот мое первоначальное решение. Вместо того, чтобы сортировать элементы по привязке, сортируйте их по (привязка — вес), то есть сортируйте их по тому, сколько места осталось. --› это по существу соответствует первоначальной идее FFD. Однако, опять же, мне не удалось доказать приблизительную оценку для него. Так что я не могу много говорить об этом. - person Shuhao Zhang tony; 20.06.2015

Его по-прежнему можно записать как экземпляр ILP, например:

Создайте двоичную переменную x_{i,j}, указывающую, попадает ли предмет j в корзину i, вспомогательные переменные y_i, которые указывают, используется ли ячейка i, вспомогательные переменные c_i, определяющие вместимость ячейки i, и константы s_j (размер предмета j) b_j (привязанный элемента j) и M (достаточно большая константа), теперь

minimize sum[j] y_j

subject to:
1:   for all j:
         (sum[i] x_{i,j}) = 1
2:   for all i,j:
         y_i ≥ x_{i,j}
3:   for all i:
         (sum[j] s_j * x_{i,j}) ≤ c_i
4:   for all i,j:
         c_i ≤ b_j + (M - M * x_{i,j})
5:   x_{i,j} ϵ {0,1}
6:   y_i ϵ {0,1}

Ограничения означают

  1. любой предмет находится ровно в одной корзине
  2. если элемент находится в корзине, то эта корзина используется
  3. предметы в корзине не превышают вместимость этой корзины
  4. вместимость корзины не больше, чем нижняя граница предметов, которые в ней находятся (предмет с большой буквой M предотвращает изменение вместимости предметов, которых нет в корзине, при условии, что вы выберете M не меньше, чем верхняя граница)
  5. и 6., переменные являются бинарными.

Но разрыв целостности может быть чудовищным.

person harold    schedule 14.06.2015
comment
Конечно, это можно решить с помощью решателей линейного программирования. На самом деле эти решатели реализованы на основе некоторой стратегии, то есть ветвей и границ. Но даже с лучшим решателем NP-сложная задача с достаточно большим размером экземпляра не может быть решена. На самом деле меня больше интересует, изучался ли ранее предложенный вопрос кем-то другим или нет. - person Shuhao Zhang tony; 17.06.2015
comment
@ShuhaoZhangtony Я не слышал об этом раньше, на самом деле это мало что значит, я полагаю. приведенная выше модель в худшем случае линейна по количеству предметов, почти наверняка будет перенесена, по крайней мере, я не вижу причин, почему бы этого не произошло). - person harold; 17.06.2015

Во-первых, я могу ошибаться, и может существовать алгоритм, который даже лучше моего.

Упаковка контейнеров является сложной по NP и эффективно решается с помощью классических алгоритмов, таких как First Fit и т. д. Здесь также есть некоторые улучшения.алгоритм Корфа

Я стремлюсь сократить это до обычной упаковки в ящики, сортируя предметы по их границам. Шаги

  1. Сортировка элементов по границам: сортировка элементов по границам поможет нам упорядочить корзины, поскольку ограничивающим условием является минимум границы.

  2. Вставить наименьший элемент (по границе) в корзину

  3. Проверить, может ли следующий элемент (отсортированный по границам) сосуществовать в этой корзине. Если он может, то этот элемент также может храниться в корзине. Если нет, попробуйте поместить его в другую корзину или создать для него другую корзину .
  4. Повторяйте процедуру, пока все элементы не будут расположены. Процедура повторяется в порядке возрастания границ.

Я думаю, что это в значительной степени решает проблему. Пожалуйста, сообщите мне, если это не так. Я пытаюсь реализовать то же самое. И если есть какие-либо предложения или улучшения, сообщите мне об этом. :) Спасибо

person Anony-mouse    schedule 14.06.2015
comment
Bin packing is NP-hard and is efficiently solved using classic algorithms like First Fit etc что? - person amit; 14.06.2015
comment
Я просто разрабатывал традиционные алгоритмы, с помощью которых мы можем решить проблему упаковки в мусорные ведра. - person Anony-mouse; 14.06.2015
comment
Спасибо. Те же комментарии к stakx здесь. Дать приближенное решение легко, доказать приближенную оценку сложно. Я знаю, что мой первоначальный вопрос не требует этого, но, поскольку вы, ребята, кажется, действительно заинтересованы в этом, вы, возможно, захотите поработать над этим глубже. - person Shuhao Zhang tony; 17.06.2015