Как сделать запрос из направленного ациклического графа с эксклюзивными подмножествами

Вопрос в абстрактном выражении:

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

Конкретный вопрос:

У меня есть DAG, в котором хранятся мои сборки (вершины) и их зависимости (ребра). Учитывая сборку или набор сборок, мне нужно запросить, чтобы получить набор всех задействованных сборок и их зависимости. Сложность состоит в том, что каждая сборка имеет несколько версий, и только один экземпляр сборки может быть загружен в процесс. Зависимости для данной сборки меняются между различными версиями сборки.

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


Возможные области решения:

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

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


person Bryan Anderson    schedule 22.09.2011    source источник
comment
+1 за грамотно сформулированный вопрос и единорога :)   -  person Felix Kling    schedule 23.09.2011
comment
Я не уверен, что вопрос сформулирован четко. Если вы говорите о DAG, вы должны использовать терминологию графа - что такое вершина, что такое ребро и какой результат вы ожидаете. Все это отсутствует в вашем вопросе.   -  person Tomas    schedule 23.09.2011
comment
Сохраняются ли несколько версий одной и той же зависимости как одна зависимость или несколько зависимостей?   -  person corsiKa    schedule 23.09.2011
comment
@Bryan Я добавил тег dependency-management, чтобы привлечь людей, знакомых с конкретным вопросом, поскольку у них может быть номер альтернатив.   -  person corsiKa    schedule 23.09.2011
comment
Граф настроен с заданной версией сборки как вершиной и зависимостью как ребром. Версии объединяются в наборы (все версии данной сборки) отдельной структурой данных. На выходе должен быть набор версий сборки только с одной версией каждой сборки.   -  person Bryan Anderson    schedule 23.09.2011
comment
@Bryan, хорошо, теперь стало намного понятнее.   -  person Tomas    schedule 23.09.2011
comment
Если я правильно понимаю, ваше решение, скорее всего, не будет уникальным. Рассмотрим зависимости A- ›B, A-› C, A- ›D и исключительные подмножества {B, C} и {C, D}. Тогда, если запрошенный узел - A, то оба {B, D} и {C} будут оба допустимыми решениями. Есть ли у вас какие-либо требования к решениям (например, максимальный / минимальный размер и т. Д.) Или вы хотите перечислить все решения?   -  person mhum    schedule 23.09.2011
comment
Каждая из версий включает номер версии, я бы просто выбрал последнюю версию, когда у меня будет рабочий набор.   -  person Bryan Anderson    schedule 23.09.2011
comment
С одной стороны, кажется, что вы имеете дело с какой-то проблемой окраски из-за исключения, но это не ясно, не зная, какие еще виды ограничений у вас есть. Имея только предоставленную вами информацию, кажется, что удаление всех версий, кроме одной, может быть выполнено как отдельный проход после того, как вы нашли интересующий вас набор вершин, но я подозреваю, что у вас есть другое ограничение, такое как сборка версия может быть включена в вывод, только если зависимая версия сборки также присутствует в выводе.   -  person Vaughn Cato    schedule 23.09.2011
comment
@Bryan: Если это так, не могли бы вы просто пройти DAG, начиная с каждого из ваших исходных узлов (например, с помощью поиска в глубину или в ширину), собирая список всех доступных узлов? Каждый раз, когда вы сталкиваетесь со сборкой, которую вы видели раньше, сохраняйте ту, у которой самый высокий номер версии.   -  person mhum    schedule 23.09.2011
comment
@mhum Проблема в том, что зависимости добавляются или удаляются в новых версиях. Таким образом, версия 1 сборки A [A1] может полагаться на одну из версий 1-3 сборки B [B1-3], но A2 может полагаться только на B4, поэтому, если A1 находится в наборе результатов, B4 не может.   -  person Bryan Anderson    schedule 23.09.2011
comment
@BryanAnderson А. Боюсь, что я неправильно понял вашу постановку проблемы. Когда вы сказали, что нужно выбирать только один элемент из известных подмножеств вершин, я интерпретировал это как означающее (в вашем последнем примере), что не более одного элемента в подмножестве {A1, A2} и не более одного элемента из подмножества {B1 , B2, B3, B4} могут быть в наборе результатов. Но вы говорите, что между этими двумя подмножествами может быть какое-то взаимодействие, которое не позволяет A1 и B4 появляться вместе в наборе результатов. Не могли бы вы прояснить это ограничение?   -  person mhum    schedule 23.09.2011
comment
@mhum Правильно, в зависимости от выбора из группы A некоторые члены группы B могут стать недействительными.   -  person Bryan Anderson    schedule 23.09.2011
comment
@BryanAnderson Не могли бы вы более четко описать, как выбор из группы A влияет на выбор из группы B? Я до сих пор не могу сделать вывод ни из вашей исходной постановки проблемы, ни из ваших последующих комментариев, каковы точные требования к результирующему набору.   -  person mhum    schedule 23.09.2011
comment
@mhum Допустим, сборка A версии 1 [A1] зависит от сборки B версии 1 [B1], A2 зависит от B2 и так далее. Если я выберу определенный A в свой набор результатов, тогда только соответствующий B может быть выбран в наборе результатов. Если я выберу A2, я не смогу выбрать B1. В большинстве случаев сборка A будет зависеть от некоторого диапазона сборок B, и будет другая сборка C, которая также зависит от некоторого набора B, поэтому мне нужно будет сказать, найти набор B, чтобы зависимости A2 и C3 были удовлетворены . Как только у меня будет этот набор B, я просто выберу тот, у которого самый высокий номер версии.   -  person Bryan Anderson    schedule 24.09.2011
comment
@BryanAnderson Хорошо. Это немного яснее. Еще несколько вопросов: в этом случае, если вы выбираете A1, требуется ли, чтобы был выбран B1? Я полагаю, да. Если бы A1 зависел от B1 и B2, и вы выбрали A1, какова идея, что вам нужно было бы выбрать только одно из {B1, B2}?   -  person mhum    schedule 24.09.2011
comment
@BryanAnderson В таком случае, что произойдет, если у вас есть следующая цепочка зависимостей (и никаких других): A1 - ›B1 -› A2 - ›C1. Конечно, в ваших реальных данных может не быть таких ситуаций, но если это так, нам нужно быть точными в том, что именно здесь происходит.   -  person mhum    schedule 24.09.2011
comment
@mhum Тогда будет цикл. Я предполагаю, что условие антицикла немного сильнее, чем с обычным DAG, поскольку также не может быть цикла в наборе, то есть не может существовать путь от одного A к другому (или тому же самому) A в графе.   -  person Bryan Anderson    schedule 24.09.2011
comment
@BryanAnderson Хорошо. Также могут возникать проблемы в таких ситуациях: A1 - ›B2, B1 -› A2 и набор запросов включает {A1, B1}.   -  person mhum    schedule 25.09.2011


Ответы (1)


Я думаю, что набор вершин, которые вытекают из данного выбора, выглядит сбивающим с толку, потому что на самом деле существует основная проблема оптимизации или удовлетворения: учитывая сборку A, вы можете удовлетворить ее зависимости через B1, B2 или B3, и каждый из этих вариантов тогда имеет его собственные последствия.

Если мы рассматриваем это как проблему логического удовлетворения, то мы могли бы рассмотреть проблему, при которой сборки бывают только двух версий, например A1 или A2. Тогда предложение, такое как (a или b или не c), будет преобразовано в сборку верхнего уровня, которая требует A1 или B1 или C2 - возможно, косвенно через X1, X2 и X3 - и соединение предложений будет преобразовано в верхний верхний сборка уровня, которая требовала всех сборок верхнего уровня. Поэтому я думаю, что если бы вы могли эффективно решить общую проблему, вы могли бы эффективно решить 3-SAT, и тогда P = NP.

Любопытно, что если у вас нет ограничения, что вам разрешена только одна сборка каждого типа (A1, A2 или A3, но более одной за раз), тогда проблема очень легко переводится в предложения Horn (Knuth Vol 4, раздел 7.1. 1 P 57), для которого проблема выполнимости может быть решена эффективно. Для этого вы работаете с инверсией естественных переменных, так что X1 означает, что A1 не включен. Затем, если вы рассматриваете версию предложения Horn как способ ослабить вашу проблему, игнорируя ограничение, согласно которому может поддерживаться не более одной версии каждой сборки, вы получаете механизм, сообщающий вам, что некоторая версия сборки A1 не может быть в решении, потому что X1 = not A1 истинно в основе решения Хорна и, следовательно, истинно в каждом удовлетворительном задании.

person mcdowella    schedule 23.09.2011
comment
Спасибо, зная, что это проблема P = NP. Я воспользуюсь графиком для проверки наборов сборок, которые я развертываю, чтобы убедиться, что они действительны, и просто сохраню рабочий набор сборок для запроса, вместо того, чтобы делать это динамически. - person Bryan Anderson; 26.09.2011