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