Алгоритм поиска несвязного объединения на графе зависимостей

Прежде всего, некоторый контекст проблемы:

Я работаю в системе с несколькими типами ресурсов (A, B, C...). У меня есть некоторые требования к ресурсам, и мне нужно определить, могу ли я их себе позволить.

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

Например, если мне нужно заплатить 1A, 2B и 0C (представленные как (1,2,0)) и у меня есть эти источники:

  1. (1,1,0) //Означает, что я должен выбрать продукт A или B
  2. (0,1,1) //Означает, что я должен выбрать продукт B или C
  3. (1,1,0)

Очевидно, что я должен использовать источник 2 для ресурса B, и я могу выбрать для 1 и 3, какой из них производит A и B.

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

введите здесь описание изображения

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

В предыдущем примере я сначала пытаюсь использовать источник 1 для ресурса A. B все еще имеет 2 ссылки, поэтому я могу это сделать. Для оплаты остаются только ресурсы типа B, поэтому я использую оставшиеся источники для оплаты B.

Хорошо здесь, но теперь мне нужно работать в новом сценарии, где есть два типа источников, каждый из которых производит один тип ресурса по стоимости 1 или по цене 2, и мне нужно минимизировать общую стоимость.

Небольшое изменение примера может быть таким: введите здесь описание изображения

Решение, основанное на здравом смысле, должно заключаться в том, чтобы использовать 1 и 2 для оплаты B и использовать 3 для оплаты A при общей стоимости 1, но в моей реализации, как описано выше, источник 1 используется для оплаты A, потому что B все еще имеет 2 ссылки на это, поэтому в конце я должен использовать источник 3 со стоимостью 2.

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

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


person Evans    schedule 24.01.2013    source источник
comment
Вы должны попытаться задать его в разделе StackExchange, посвященном математике: http://math.stackexchange.com/   -  person Cédric Bignon    schedule 24.01.2013


Ответы (1)


Эта задача сводится к поиску максимального потока в сети потоков.

Вот идея:

  1. Для каждого типа ресурса (A, B, ...) узел с входящим ребром из узла source (узел-источник не имеет ничего общего с источниками из задачи, это общая метка используется в теории сетевых потоков, обычно обозначается s) с пропускной способностью, равной требуемому количеству данного ресурса. Например, если вам нужно 2 Б, емкость будет равна 2.

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

  3. Из каждого узла из шага 1. добавьте исходящее ребро к каждому из узлов из шага 2. которые обеспечивают, которые могут предоставить требуемый тип ресурса.

Например, график для вашей ситуации будет выглядеть так:

график потока

Теперь максимальный поток ST в этой сети даст вам ответ. В основном насыщенные границы между узлами type (A, B, C) и узлами source (src1, src2, src3) сообщат вам, какой источник должен указать, какой тип ресурса.

Максимальный поток можно найти с помощью любого из классических алгоритмов, таких как расширяющий путь (Форда-Фалкерсона, Диника и т. д.) или одного методов push-relabel (Goldberg-Tarjan, Relabel-to-Front и т. д.).

Это конкретное применение максимального потока также можно рассматривать как своего рода обобщенное двудольное сопоставление, где вы сопоставляете каждый тип ресурса с возможными несколькими источниками, но каждый источник может обрабатывать только один ресурс. Идею легко распространить на случай, когда источник может обрабатывать более одного типа (просто изменив пропускную способность ребер src - T с 1 на желаемые).

person gus    schedule 24.01.2013
comment
Спасибо, проверю это более подробно - person Evans; 25.01.2013