Graph 在加权无向图中,如何从一个特定的节点v开始寻找最小平均成本周期?

Graph 在加权无向图中,如何从一个特定的节点v开始寻找最小平均成本周期?,graph,cycle,Graph,Cycle,假设我们有一个加权无向图,边| E |的数目约为节点数| V |的k倍,即| E | ~=k*| V | 现在,选择一个节点,比如v,我们想要找到包含v的循环,其平均成本最小。(即,平均成本是指一个周期内的平均边缘重量。) 有没有有效的算法 很抱歉,我错过了一点,循环不需要包含此图中的所有节点。这使得它不同于哈密顿循环问题。这相当于,它是NP完全的。没有最坏情况下的多项式算法能够解决这个问题,除非 我们可以将哈密顿循环问题简化为这个问题: 选择任意顶点作为起点 将代价2指定给与此顶点关联的每条

假设我们有一个加权无向图,边| E |的数目约为节点数| V |的k倍,即| E | ~=k*| V |

现在,选择一个节点,比如v,我们想要找到包含v的循环,其平均成本最小。(即,平均成本是指一个周期内的平均边缘重量。)

有没有有效的算法


很抱歉,我错过了一点,循环不需要包含此图中的所有节点。这使得它不同于哈密顿循环问题。

这相当于,它是NP完全的。没有最坏情况下的多项式算法能够解决这个问题,除非

我们可以将哈密顿循环问题简化为这个问题:

  • 选择任意顶点作为起点
  • 将代价2指定给与此顶点关联的每条边
  • 将成本1指定给所有其他边
一个n周期的平均成本是
(n+2)/n
——正
n
的递减顺序。对于v-顶点图,如果图是哈密顿图,则存在
(v+2)/v
的平均代价的循环。由于哈密顿图是否是NP完全的判定,这个问题是NP难的

与该问题相关的决策问题(“是否存在x通过顶点V的平均边成本的简单循环”)是NP:如果存在该平均长度的路径,则验证循环是否是具有足够低平均成本的有效循环需要
O(V)
时间(使用邻接矩阵表示)


因此,您不能指望使用最坏情况下的多项式时间算法。但是,根据边缘成本的分布,分支定界算法或动态规划分支定界算法可能非常有效:

  • (可选)删除不属于V所在的2顶点连接组件的所有顶点(V可以位于多个2顶点连接组件中)
  • 枚举来自V的所有路径。将关联的优先级队列设为
    q
    • 从空路径开始
    • 选择成本估算最低的路径(下限)。如果是平局,请选择最新添加的路径
    • 将此paht添加到“完成”集合
    • 如果成本估算不低于c_best,则终止循环。否则,
    • 尝试每个输出边缘:
      • 如果新顶点已在路径中且(不是V或新路径将是两个循环+),则拒绝该边。否则,
      • 使用此边扩展路径,并计算此新路径的成本估算
      • 如果估计值不低于c_best,则拒绝此路径。否则,
      • 如果最后一个顶点是V,则将
        c_最佳路径
        设置为此路径,并将
        c_路径
        设置为其代价
      • 否则,如果具有相同访问顶点集和相同最后一个顶点(=签名)的路径尚未出现在“完成”集中,请将新路径添加到
        q
      • 如果要添加的路径与队列中的另一个路径具有相同的签名,请从队列中删除更昂贵的路径
  • 返回
    c\u最佳路径
+:如果图是多重图,则需要获取两条最便宜的平行边,而不是两次获取同一条边。这可能最好在单独的步骤中处理

动态规划检查可能非常便宜(只是用一个顶点散列一个顶点集),但如果预期的保存很少(算法很可能提前结束),则可以忽略它-删除“完成”集并忽略队列中的任何重复项(具有相同签名的不同路径)

该算法适用于任何路径成本度量,只要可以计算下限。对于平均边缘成本问题,我可以想到几种启发式方法:

在任何情况下,如果路径是一个循环,则计算并返回其确切成本

一个简单的启发式方法是假设您可以访问所有剩余的顶点,其边不比整个图或2连通组件中最便宜的路径便宜。然后,相应的预期成本为
(成本+(v-边缘长度)*c\u min)/edge\u长度
。有利的一面是计算速度很快。缺点是,如果图很大,而且几乎没有边像最便宜的边那么便宜,那么该算法可以扩展很多路径,以到达它认为存在的“绿洲”

如果没有几条边像最便宜的边那样便宜,那么您可以准备一份图表中所有边中成本最低的
v
列表。然后,要估计一个图的代价,请考虑:仅使用最便宜边完成的路径,使用最便宜的两条边完成的路径,使用最便宜的三条边完成的路径<代码>而(exp\u成本减少且长度。有利的一面是,它可以做出更好的猜测。缺点是,如果存在大量降低估计值的边,则计算时间较长

始终必须使用路径起点顶点和终点顶点的公共边(如果存在)或与每个顶点邻接的一条边(
min\u cost\u adjanced(V)+min\u cost\u adjanced(end)
)。如果发现一条公共边,则可能在此处处理循环

在哈密顿循环缩减的情况下,前两种启发式算法的性能都同样差。启发式(1+3)和(2+3)的性能相同。最佳情况是时间上的线性。最坏的情况是使用动态编程的
O(v*k*2^v)
,或者不使用动态编程的
O(v*k*log(k)*k^v)
(假设优先级队列使用
O(log n)
推送、弹出最小值和减少键)

请注意,测试一般图中是否存在哈密顿圈的最著名算法是
O(1.657^v)
()

实际上存在一个基于动力学的O(| v | | E |)算法