Есть ли эффективный алгоритм для упаковки нескольких наборов чисел в несколько корзин?

Например, у вас есть несколько списков double, которые вам нужно распределить по нескольким «корзинам» фиксированного размера (размер корзины также равен double). Есть два дополнительных ограничения:

  • Значения из определенных списков могут поступать только в определенные (предварительно заданные) сегменты:

    bucket1 <-\
               |--- list1
              /
             /
    bucket2 <--\
    bucket3 <---- list2
    bucket4 <--/
    
    bucket5 <--- list3
    
  • Результирующее распределение должно быть как можно более равномерным (чтобы все ковши имели коэффициент загрузки, например, 0.5).

Конкретный пример такой проблемы: представьте, что у вас есть несколько блоков питания («ведер») и несколько плат ламп. Каждый блок питания подключается к одной или нескольким платам, каждый блок питания имеет разную мощность, лампы потребляют разное количество энергии. Если какая-то плата подключена к нескольким блокам питания, то можно «назначить» часть ламп на первый источник питания, часть - на второй и т. Д.

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

Есть действенный подход?

РЕДАКТИРОВАТЬ: Я разработал следующий подход, который, кажется, довольно быстро приводит к нужному результату. Идея такая:

  • Сначала для каждого списка я распределяю элементы по разрешенным сегментам, используя эвристику наименее загруженных сегментов.
  • Then, I do the following:
    • for each list:
      • remove the items corresponding to the list from the buckets
      • распределить их снова, используя ту же самую наименее загруженную эвристику
      • рассчитать отношение размера максимально загруженного ковша к минимально загруженному (для разрешенных ковшей)
    • завершите цикл, если коэффициент меньше некоторой константы (я взял 1.02) или если прошло слишком много шагов.

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

Это хороший алгоритм?


person Rogach    schedule 04.11.2012    source источник


Ответы (2)


Для меня это звучит как проблема с упаковкой мусорного ведра или проблема с рюкзаком с дополнительными ограничениями (некоторые списки могут идти только в определенные ковши), для которого требуется решение, заполняющее все ковши, по крайней мере, до определенного коэффициента загрузки. Говоря об «эффективном», я бы сказал, что то, что вы описываете, должно быть NP-сложным («должно», потому что у меня еще не было времени подумать о сокращении от NP-проблемы до вашей конкретной проблемы, но я почти уверен существует один).

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

person muehlbau    schedule 04.11.2012
comment
Я думаю, что что-то сделал с жадным наполнением ведер, но с некоторыми изменениями - см. Мою правку. Что вы думаете? - person Rogach; 04.11.2012
comment
Я думаю, это звучит как хороший начальный подход. Я бы сделал следующее: 1. классифицирую списки и определяю, в какие сегменты они могут попасть; 2. заполните корзины наименее полной эвристикой и заполните ее наибольшим применимым списком; 3. Когда все списки распределены, для каждой корзины, которая не заполнена до указанного коэффициента загрузки, добавьте список из самой большой корзины. - person muehlbau; 04.11.2012
comment
К сожалению, нет указанного коэффициента загрузки - мне нужно минимизировать самый большой коэффициент загрузки по ковшам. - person Rogach; 04.11.2012
comment
Ах я вижу; тогда ты сможешь расплющивать вещи среди ведер за 3 секунды .. удачи! - person muehlbau; 05.11.2012

Короткий ответ: нет. Это NP-Complete. Для получения дополнительной информации прочтите эти википедии:

http://en.wikipedia.org/wiki/Bin_packing_problem

http://en.wikipedia.org/wiki/Knapsack_problem

person durron597    schedule 04.11.2012