在依赖图上搜索不相交并集的算法

时间:2013-01-24 00:13:06

标签: algorithm disjoint-union dependency-graph

首先,关于这个问题的一些背景:

我在一个拥有多种资源(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)
  4. 我必须使用源2作为资源B,我可以选择1和3来生成A和B

    我实现这一点的方法是将其视为依赖图,其中上面的情况如下所示:

    enter image description here

    所以我循环遍历资源,并为每个资源循环到达它的链接。如果删除当前资源的当前节点意味着其他资源已经剩余到达链接以支付剩余的支付成本,我会使用它。

    对于前面的示例,我首先尝试使用源1作为资源A. B仍然有2个链接,所以我可以这样做。只有B类资源需要付费,所以我使用剩余资源来支付B。

    一切都在这里,但现在我需要在一个新的场景中工作,其中有两种类型的源,每种源以成本1或成本2生成一种类型的资源,我需要最小化总成本。 / p>

    对此示例稍作修改可能是: enter image description here

    常识解决方案应该使用1和2来支付B,并使用3来支付A以获得总成本1,但是如上所述,在我的实现中,源1用于支付A,因为B仍然2链接到它,所以最后我必须使用源3,成本为2.

    如果可能的话,应该避免尝试所有选择组合的解决方案。

    您是否知道可以应用于此案例的已知解决方案的任何一般算法问题?或者如何改进我的实际解决方案以适应这种新方案?或者我应该采取另一种不同的方法?

1 个答案:

答案 0 :(得分:1)

此问题减少为在流网络中找到maximum flow

以下是这个想法:

  1. 对于每种类型的资源(A,B,...),具有来自节点的传入边缘的节点(源节点与来自该节点的源无关)问题,它是网络流理论中常用的标签,通常标记为 s ,其容量等于给定资源的所需数量。例如,如果您需要 2B ,则容量为2。

  2. 对于每个(我指的是问题描述中定义的源),您创建一个具有到接收器的传出边缘的节点(通常标记为 t < / strong>)容量为1。

  3. 从步骤1的每个节点添加一个传出边缘到步骤2中的每个节点,提供可以提供所需类型资源的节点。

  4. 例如,您的情况图表如下所示:

    flow graph

    现在,此网络中的最大S-T流量将为您提供答案。 类型节点(A,B,C)和节点(src1,src2,src3)之间基本上饱和的边缘将告诉您哪个应该提供资源的类型

    可以使用任何经典算法找到最大流量,例如增强路径 Ford-Fulkerson Dinic&#39; 等)或其中一种 push-relabel 方法( Goldberg-Tarjan Relabel-to-Front 等。)。

    最大流量的这种特定应用也可以被视为一种通用bipartite matching,您可以将每种类型的资源与可能的多个源匹配,但每个源只能处理一个资源。这个想法很容易扩展到一个源可以处理多种类型的情况(通过简单地将 src - T 边缘容量从1改为所需的那些)。