2014-11-01 6 views
1

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

Устранена посторонняя деталь, проблема заключается в следующем: вам предоставляется набор ресурсов {R_1, R_2, ... R_n} и набор задач {T_1, T_2, ... T_m}. Каждая задача может быть выполнена с использованием любого из альтернативных наборов ресурсов TR_m = {{R_1m1, R_1m2, ...}, {R2m1, R_2m2, ...}, ...}. Каждый ресурс может использоваться только одной задачей за раз. Проблема состоит в том, чтобы увидеть, могут ли выполняться одновременно все задачи или, если это невозможно, то, какое наибольшее количество задач (начиная с T_1) может выполняться одновременно.

Наивный алгоритм, который просто присваивает каждой задаче первый набор доступных ресурсов, может иногда сбрасываться излишне: подумайте о TR_1 = {{R_1, R_2}, {R_1}} и TR_2 = {{R_1}, {R_2 }}. T_1 будет захватывать R_1 и R_2, а T_2 потерпит неудачу, тогда как TR_1 мог бы только что взять R_1, а TR_2 мог взять R_2.

Я ищу алгоритм, предпочтительно элегантный и простой, который бы лучше работал.

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

Кроме того, обычно существует менее десятка задач и ресурсов, и проблема (закодированная в настоящее время на Python 3) не в режиме реального времени, поэтому грубая сила обычно является приемлемым решением, но я ищу что-то лучше ,

Любые предложения или ссылки?

ответ

1

Использование может использовать Branch and Bound.

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

Вы также можете перейти на s[q,t] из следующей модели, которая ближе всего к 0.5 (в некотором роде, выбор, который является «наименее уверенным»).

Связанное может быть основано на линейной релаксации этой ILP модели:

maximize sum of x[t] over all t 

variables: 
0 <= x[t] <= 1 ; x[t] decides whether task t is scheduled or not 
0 <= r[i,t] <= 1 ; r[i,t] decides whether task t uses resource i 
0 <= s[q,t] <= 1 ; s[q,t] decides whether set q of task t is used 

constraints: 
1. for all tasks t: (sum s[q,t] over all valid q) - x[t] = 0 
2. for all sets s[q,t]: (sum r[i,t] over all i in the set) - size_of_set * s[q,t] >= 0 
3. for all resources i: sum r[i,t] over all t <= 1 
  1. силы ровно 1 набор ресурсов, которые будут связаны с любой задачей, которая выбрана.
  2. заставляет ресурсы, используемые путем выбора набора q для задачи t, используемой задачей t (> = 0, потому что наборы могут перекрываться)
  3. заставляет все ресурсы использоваться не более одного раза.

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

Это даст вам оценку, которая позволит вам обрезать часть пространства поиска. Насколько это на самом деле чернослив зависит от того, насколько близко он доходит до фактического решения. Я предсказываю, что он будет стремиться выбирать несколько наборов, принадлежащих задаче, с некоторым коэффициентом от 0 до 1, потому что выбор набора «только бит» позволяет ему использовать один и тот же ресурс для нескольких задач. Он должен выбрать несколько наборов, потому что он должен использовать в общей сложности 1 набор для каждой задачи, но это также означает, что у него больше выбора ресурса, чтобы он мог это сделать. Линейное программирование настолько скрытно, что всегда пытается дать вам, в некотором смысле, самый неприятный ответ :)

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

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

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

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

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

+0

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

1

Предположим, что все задачи идентичны.

Тогда ваша проблема эквивалентна известной NP-полной maximum set packing problem.

Итак, ваша проблема, безусловно, NP-hard, и вы вряд ли найдете для этого идеальный алгоритм.

+0

Это очень полезно, потому что теперь я могу, по крайней мере, прекратить разрушать свой мозг за совершенный алгоритм и опасаться смущения за то, что вы использовали по существу исчерпывающий поиск (если я сообразителен в том, как искать способ, который предлагает гарвол). – CarlEdman