【发布时间】:2015-05-25 00:30:03
【问题描述】:
我正在研究一种算法,其目标是找到安装包“X”的最小包集。
我会用一个例子更好地解释:
X depends on A and (E or C)
A depends on E and (H or Y)
E depends on B and (Z or Y)
C depends on (A or K)
H depends on nothing
Y depends on nothing
Z depends on nothing
K depends on nothing
解决办法是安装:A E B Y。
这是描述示例的图像:
有没有一种算法可以在不使用蛮力方法的情况下解决问题?
我已经阅读了很多有关 DFS、BFS、Dijkstra 等算法的知识...... 问题是这些算法无法处理“OR”条件。
更新
我不想使用外部库。
算法不必处理循环依赖。
更新
一种可能的解决方案是计算每个顶点的所有可能路径,并且对于可能路径中的每个顶点,执行相同的操作。 因此,X 的可能路径是 (A E),(A C)。现在,对于这两个可能路径中的每个元素,我们可以执行相同的操作:A = (E H),(E Y) / E = (B Z),(B Y) 等等...... 最后,我们可以将每个顶点的可能路径组合在一个 SET 中,并选择具有最小长度的路径。
你怎么看?
【问题讨论】:
-
是否需要蓝色依赖项和一个红色依赖项?
-
要获得一个包所需的所有少量依赖项,您需要所有 AND 依赖项和尽可能多的 or 依赖项。我再举一个例子。 A = B,C, D|F|G,H|L 因此,要获得 A 的最少依赖数,需要 B,C,[ D F G ] 和 [ H L ] 之间只有 1 个或之间的选择方式是得到最短路径。
-
我假设这形成了一个 DAG?
-
注意,你的颜色代码不够,它不会告诉你括号放在哪里。
-
@KLi,我建议将您的解决方案作为答案发布,而不是将其放在问题中。所以可以直接评论。我也认为,这张图片根本无助于理解你的例子;最好删除它。
标签: java python algorithm mathematical-optimization minimization