Ищите предложения по пониманию конкретной проблемы комбинаторной оптимизации - PullRequest
1 голос
/ 21 февраля 2011

При наличии набора элементов (размером от 1 до 100) и количества ячеек (от 1 до 15). Каждому предмету, имеющему подмножество ячеек, может быть назначен предмет, а также порядок предпочтений, какой из них является лучшим, второй лучший и т. д., только для этого. Предметы также имеют естественный порядок, представленный ниже именованием, например, item1 перед item2. Каждый бункер имеет емкость от 1 до 5 (каждый предмет имеет одинаковый вес, то есть 1).

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

      | bin1  bin2  bin3                        |  bin1  bin2  bin3   
------------------------               ----------------------------
item1 |    1     2     -               capacity |     4     4     5
item2 |    -     1     2               
item3 |    2     1     3
item4 |    1     2     3
item5 |    1     -     2
item6 |    1     2     3

Цели (для того чтобы каждая цель полностью перекрывала любую нижнюю цель в случае конфликта, например, упаковка пяти предметов всегда лучше, чем четырех, независимо от того, какое количество ячеек используется или предпочтения игнорируются):

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

Таким образом, входные данные будут упакованы как:

      | bin1  bin2  bin3
------------------------
item1 |    x            
item2 |          x     
item3 |          x     
item4 |    x          
item5 |    x      
item6 |    x   

Тогда возникает вопрос: что читать / просматривать, чтобы помочь мне придумать идеи алгоритмов для решения этой проблемы с размерами входных данных из первого абзаца и временным ограничением в несколько секунд, т. Е. Без грубой силы (или при хотя бы грубую силу, о которой я только что задумал.) Я использую Ruby и C, но язык не слишком актуален на этом этапе спотыкания леса.

Буду благодарен за любые предложения по чтению, идеи по комбинациям алгоритмов или просто мысли по уточнению формулировки проблемы ...

Обновление 1

Чтобы быть менее неясным, хотя есть много алгоритмов, которые охватывают различные части этой проблемы, моя трудность заключается в том, чтобы найти (или, возможно, распознать) информацию, которая обрабатывает все критерии вместе, особенно минимизируя количество используемых корзин, когда есть избыточная емкость и конфликтующие наборы элементов в корзину и предпочтения элементов, которые, как мы надеемся, более четко показаны в следующем примере:


      | bin1  bin2  bin3                        |  bin1  bin2  bin3   
------------------------               ----------------------------
item1 |    1     2     3               capacity |     3     2     3
item2 |    1     2     3          
item3 |    -     1     2

Хотя bin1 является наиболее предпочтительным, item3 не может быть помещен в него вообще, и хотя bin2 является следующим наиболее предпочтительным для всех элементов, он может содержать только два из трех элементов. Таким образом, правильный набор назначений (x) на самом деле является наименее предпочтительным bin:

      | bin1  bin2  bin3
------------------------
item1 |               x  
item2 |               x  
item3 |               x  

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

Ответы [ 3 ]

1 голос
/ 21 февраля 2011

Это проблема двустороннего сопоставления, и ее можно решить за полиномиальное время.

http://en.wikipedia.org/wiki/Matching_(graph_theory)#Maximum_matchings_in_bipartite_graphs

1 голос
/ 23 февраля 2011

Предположим, что есть n элементов и бункеров, и каждый лоток имеет размер s.Упорядочение добавленных вами ограничений на самом деле значительно упрощает проблему.

Они конкретно означают, что мы всегда должны выбирать элементы 1, 2, ..., m для наибольшего m <= n, которое будет соответствоватьвыделенное количество ячеек (поскольку выбор меньшего числа обязательно приведет к худшему решению по правилу 1).Элементы будут упакованы в контейнеры в этом порядке, возможно, с некоторыми контейнерами, оставленными не полностью заполненными (поскольку перестановка элементов внутри корзины или между контейнерами может привести к худшему решению по правилу 2).Есть 2 случая: </p>

  1. m
  2. m = n, и в этом случае мы можем разместить все элементы.Теперь рассмотрим подслучаи этого случая.

В этом случае может оказаться возможным, что плотно упакованные контейнеры оставят окончательный блок 0

Теперь мы точно знаем, какие элементы и какие корзины мы будем использовать.Мы также знаем порядок, в котором товары должны быть упакованы.Из-за ограничения порядка мы можем рассматривать решения о том, какие ячейки следует оставить не полностью заполненными, как проблему о том, как вводить инструкции «start-next-bin» в упорядоченный список 1, 2, ... nиз предметов .Мы можем ввести до r-1 этих инструкций.

Эта проблема может быть решена за O (nrs) время с помощью динамического программирования.По сути, мы вычисляем функцию:

f (i, j, k) = оценка наилучшего решения, в котором первые элементы i занимают первые j блоков, причем ровно k элементов в j-м блоке.

Повторение:

f(i, j, 0)     = max(f(i, j-1, k)) over all 0 <= k <= s
f(i, j, k > 0) = f(i-1, j, k-1) + q(i, j)

Где q (i, j) - показатель качества присвоения элемента i блоку j.(Как я уже упоминал в комментариях к вашему сообщению, вам нужно решить, каким образом можно назначить оценки для размещения любого элемента i в любом блоке j, предположительно, исходя из того, насколько хорошо выполнены мои предпочтения. Если с ним легче работать »значения «плохое», чем значения качества, просто измените max() на min() и -infinity граничные значения ниже на infinity.)

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

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

Граничные условия:

f(0, 0, 0) = 0
f(i, 0, k) = -infinity for all other i and k

Послевычисление значений f (i, j, k) для каждого 0 <= i <= n, 0 <= j <= r и 0 <= k <= s и сохранение их в таблице f (n, r,s) даст оптимальную оценку окончательного решения.Хотя это дает только оценку максимума, фактическое оптимальное решение (я) можно найти, проследив обратно через матрицу f (i, j, k) с конца, на каждом шаге k = 0 в поиске состояния предшественника (то есть альтернатива под <code>max()), которая должна была привести к текущему состоянию.(Может случиться, что несколько альтернатив под max() дают равные оценки, и в этом случае существует несколько оптимальных решений, и любой из этих путей может быть найден, чтобы найти только один из них.)

1 голос
/ 21 февраля 2011

Это напоминает мне о алгоритме "соответствия" , используемом для помещения выпускников медицинских вузов в программы резидентуры. Что, если вы относитесь к предметам, как к студентам, их предпочтениям, таким как списки рангов, а к корзинам - как больницы?

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

Разница между вашей проблемой и местом жительства заключается в том, что вы не сможете сразу исправить предпочтения корзины. Вместо этого вы бы использовали правило, которое предпочитает элементы, которые максимально приближают корзину к 100%.

Меня беспокоит только то, что эта модификация может сделать алгоритм нестабильным. Но это такой простой алгоритм, что, вероятно, стоит попробовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...