Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 允许共享起始/结束顶点的有向最大加权二部匹配_Algorithm_Graph_Complexity Theory_Matching - Fatal编程技术网

Algorithm 允许共享起始/结束顶点的有向最大加权二部匹配

Algorithm 允许共享起始/结束顶点的有向最大加权二部匹配,algorithm,graph,complexity-theory,matching,Algorithm,Graph,Complexity Theory,Matching,设G(U-V,E)是加权有向二部图(即U和V是二部图的两组节点,E包含从U到V或从V到U的有向加权边)。以下是一个例子: 在这种情况下: U = {A,B,C} V = {D,E,F} E = {(A->E,7), (B->D,1), (C->E,3), (F->A,9)} 定义:方向匹配(我编造这个术语只是为了让事情更清楚):一组可能共享起点或终点的定向边。也就是说,如果U->V和U'->V'都属于方向匹配,那么V/=U'和V'/=U,但可能是U=U'或V=V

设G(U-V,E)是加权有向二部图(即U和V是二部图的两组节点,E包含从U到V或从V到U的有向加权边)。以下是一个例子:

在这种情况下:

U = {A,B,C} 
V = {D,E,F} 
E = {(A->E,7), (B->D,1), (C->E,3), (F->A,9)} 
定义:方向匹配(我编造这个术语只是为了让事情更清楚):一组可能共享起点或终点的定向边。也就是说,如果U->V和U'->V'都属于方向匹配,那么V/=U'和V'/=U,但可能是U=U'或V=V'

我的问题:如何有效地找到一个方向匹配,如上所述,对于一个使其边的权重之和最大化的二分方向加权图

所谓高效,我指的是多项式复杂度或更快,我已经知道如何实现一种朴素的蛮力方法

在上面的示例中,最大加权方向匹配是:{F->A,C->E,B->D},值为13

正式证明这个问题与图论中任何其他众所周知的问题的等价性也是很有价值的

谢谢

注1:此问题基于但有额外的放宽,即允许匹配中的边共享原点或目标。因为放松会带来很大的不同,所以我提出了一个独立的问题

注2:这是最大重量匹配。基数(存在多少条边)和匹配覆盖的顶点数与正确的结果无关。只有最大重量才重要

注2:在我研究解决这篇论文中发现的问题的过程中,我认为这将有助于其他试图找到解决方案的人:

注3:如果有帮助,您也可以将该图视为其等价的2边着色无向二部多重图。然后,问题公式将变成:找到一组没有颜色交替路径或循环的边,这些边具有最大权重和

注4:我怀疑这个问题可能是NP难问题,但我对约简没有太多经验,所以我还没有设法证明它

又是一个例子:

想象一下你有

4个顶点:
{u1,u2}
{v1,v2}

4条边:
{u1->v1,u1->v2,u2->v1,v2->u2}


然后,无论它们的权重如何,
u1->v2
v2->u2
都不能处于相同的方向匹配,也不能
v2->u2
u2->v1
。然而,
u1->v1
u1->v2
可以,而且
u1->v1
u2->v1
也可以,这个问题可以使用。上面Vor的“证明”是错误的

上述示例中构造问题的方法如下所示:

   D E F
A  # 7 9  
B  1 # #
C  # 3 #

其中“#”表示负无穷大。然后使用匈牙利算法解析矩阵以确定最大匹配。如果要找到最小匹配,可以将数字乘以-1。

G
定义一个新的无向图
G'
,如下所示

  • G'
    有一个节点
    (a,B)
    ,每个定向边
    (a,B)
    都有一个权重
    w
    的节点
    G
  • G'
    具有无向边
    ((A,B)、(B,C))
    如果(A,B)和(B,C)都是G中的有向边
  • 现在在
    G'
    中找到一个最大(加权)独立顶点集

    编辑:仅当所有边权重相同时,此点之后的填充才有效-当边权重具有不同的值时,这是一个更困难的问题(谷歌“最大权重独立顶点集”可用于可能的算法) 这通常是一个NP难问题。然而,
    G'
    是一个二部图——它只包含偶数个圈。在二部图中寻找最大(加权)独立顶点集不是NP困难的

    您将在
    G'
    上运行的算法如下所示

  • 查找
    G'
    的连接组件,例如
    H_1,H_2,…,H_k
  • 对每个
    H_i
    节点进行两次着色(比如红色和蓝色)。这里的食谱方法是对交替颜色进行深度优先搜索。一种简单的方法是根据
    G
    中对应的边是从
    U
    V
    (红色)还是从
    V
    U
    (蓝色)来给
    H\U i
    中的每个顶点上色
  • 要从
    H_i
    中选择哪些节点的两个选项是所有红色节点或所有蓝色节点。选择权重较高的彩色节点集。例如,红色节点集的权重等于
    H_i.nodes.where(node=>node.color==red).sum(node=>node.w)
    。调用更高权重的节点集
    N\u i
  • 您的最大加权独立顶点集现在是
    并集(N_1,N_2,…,N_k)

  • 由于
    G'
    中的每个顶点对应于
    G
    中的一条有向边,因此您拥有最大的方向匹配。

    只是我,或者这个定义允许我们将左侧的每个节点连接到右侧的每个节点,并且它仍然是“方向匹配”,那将是一场定向比赛那有什么问题?因此,让我们从左到右和从右到左取所有边8)我们不能再取了(没有),因此它将使总和最大化。@K.Bulatov不,这不是一个解决方案,请仔细阅读方向匹配的定义。例如,A->E不能与F->A出现在相同的匹配中,最大值不是在{F->A,C->E,B->D}处,它是13吗?您如何使匈牙利算法适应这种情况,包括:1)有向边,2)有向边的可能性