假设我们有一个加权无向图,边的个数|E|大约是节点数|V|的k倍,即|E|~=k*|V|。
现在,选择一个节点,比如v,我们想要找到包含v的循环,其平均成本最小。(即,平均成本是指一个周期内的平均边缘重量。)
有没有高效的算法?
很抱歉,我错过了一点,循环不需要包含此图中的所有节点。这使得它不同于哈密顿循环问题。
德沃夏克的回答是正确的。原始问题要求循环通过指定的顶点v。具有平均成本(V2)/v的循环将是“找到必须通过顶点v的具有最小平均成本的简单循环”问题的最佳答案。
在Karp的论文中,“在图中找到最小平均成本周期”的问题用O(| V | | E |)来解决。循环不需要通过任何特定顶点。
实际上存在一种基于动态规划的O(| V | | E |)算法,由Karp在1978年首次描述(http://www.sciencedirect.com/science/article/pii/0012365X78900110或Ahuja、Magnanti和Orlin的“网络流量”中的第5.7节)。
不幸的是,Jan给出的降低是不正确的,因为成本周期(v 2)/v通常不是最小平均成本周期。特别是,任何不包含起点的周期都将具有平均成本1
这相当于哈密顿圈问题,它是NP完全的。除非P=NP,否则没有最坏情况下的多项式算法能够解决这个问题。
我们可以将哈密顿循环问题简化为这个问题:
一个n周期的平均成本是(n2)/n
——正n
的递减顺序。对于v-顶点图,如果图是哈密顿图,则存在(v2)/v
的平均代价的循环。由于哈密顿图是否是NP完全的判定,这个问题是NP难的。
与这个问题相关的决策问题(“是否有一个简单的x通过顶点V的平均边成本循环”)是在NP中:如果存在一个平均长度的路径,那么验证一个循环是一个有效的循环,并且足够低平均花费O(v)
时间(使用邻接矩阵表示)。
因此,您不能指望使用最坏情况下的多项式时间算法。但是,根据边缘成本的分布,分支定界算法或动态规划分支定界算法可能非常有效:
q
:
c_best
,则终止循环。其他,c_best
,则拒绝此路径。其他,c_best_path
设置为该路径,并将c_path
设置为其代价。 q
。:如果图是一个多重图,你需要取两个最便宜的平行边,而不是同一个边两次。这可能最好在单独的步骤中处理。
动态规划检查可能非常便宜(只是用一个顶点散列一个顶点集),但如果预期的保存很少(算法很可能提前结束),则可以忽略它-删除“完成”集并忽略队列中的任何重复项(具有相同签名的不同路径)。
该算法适用于任何路径成本度量,只要可以计算下限。对于平均边缘成本问题,我可以想到几种启发式方法:
在任何情况下,如果路径是一个循环,则计算并返回其确切成本。
一个简单的启发式方法是假设您可以访问所有剩余的顶点,其边不比整个图或2连通组件中最便宜的路径便宜。然后,相应的预期成本为(成本(v-边缘长度)*c\u min)/edge\u长度
。有利的一面是计算速度很快。缺点是,如果图很大,而且几乎没有边像最便宜的边那么便宜,那么该算法可以扩展很多路径,以到达它认为存在的“绿洲”。
如果没有几条边像最便宜的边那样便宜,那么您可以准备一份图表中所有边中成本最低的v
列表。然后,要估计一个图的代价,请考虑:仅使用最便宜边完成的路径,使用最便宜的两条边完成的路径,使用最便宜的三条边完成的路径<代码>同时(经验成本降低)
始终必须使用路径起点顶点和终点顶点的公共边(如果存在)或与每个顶点邻接的一条边(min\u cost\u adjanced(V)min\u cost\u adjanced(end)
)。如果发现一条公共边,则可能在此处处理循环。
在哈密顿循环缩减的情况下,前两种启发式算法的性能都同样差。启发式算法(13)和(23)的性能相同。最佳情况是时间上的线性。最坏的情况是使用动态编程的O(v*k*2^v)
,或者不使用动态编程的O(v*k*log(k)*k^v)
(假设优先级队列使用O(log n)
推送、弹出最小值和减少键)
请注意,测试一般图中是否存在哈密顿圈的最著名算法是O(1.657^v)
(根据维基百科,截至2013年8月)
给定一个加权无向图和一组节点。 给定两个节点和。 我想找到从到的两条单独的(不重叠的)路径,使两条路径的权重之和最小。我将这个问题解释为标题所描述的,即包含和的最小加权循环。 显然,从到找到第一条最小加权路径然后从图中去掉p1中的边,然后找到第二条最小加权路径是不正确的。 我怎么才能找到这样的循环呢?
给定一些无向边加权图,什么算法可以用来找到从某个顶点v到另一个顶点w的最短路径? 对于有向边加权图,可以使用Dijkstra的最短路径算法,但我使用的是无向图,所以它不起作用。 对于非边加权的图,可以使用广度优先搜索(BFS),但我使用的是边加权图,所以它不起作用。 既然它是无向和边加权的,一般最短路径法是什么?
我正试图从一个加权无向图中找到跨越三的次优最小值。我知道如何使用Kruskal算法计算MST,我想用这种方法找到第二好的最小算法: 步骤: > 对所有图形边进行排序。 使用Kruskal计算MST 从不在第一个MST中的图中获取最小权重边,并将其添加到MST中(现在MST有一个循环) 在新形成的循环中移除最大重量边 这应该是第二好的MST吧? 顺便说一句,我知道这里有一个主题,指出了一个算法,它在
下图是我整个图的子图。我有三种不同类型的节点,绿色、蓝色和紫色。 绿色和紫色通过蓝色节点间接连接。 蓝色节点通过加权的有向边彼此连接。蓝色边缘被加权,但绿色或紫色边缘不被加权。 我想解决的问题是:我想找到最适合绿色节点的紫色节点。,e、 g.我想说,对于绿色节点GA,三个最合适的紫色节点是V1、V4和V42。 什么使一个节点合适? 完美的匹配应该是当绿色节点连接到紫色节点所连接的所有蓝色节点时。然
我正在考虑以下问题(非常粗略的描述): 假设我们有一个图,其中边被分配了一些非负成本,一个起始节点和一些成本常数。找出: 一组节点,可从到达,其中从起始节点到中任何节点的最短路径成本不大于 对于集合中的每个,上面是最短路径的成本 基本上是有成本限制的Dijkstra。 我的主要问题是:图论中关于这个问题的正确术语是什么? 我一直在看“可访问性”或“可达性”,但这些似乎是错误的关键词。 最终,我正在
设T=(V,E)是一棵顶点和边的树,代价已知。我们想构造一个最小权完备图G=(V,E'),它的唯一最小生成树是T。 示例:考虑下面的树T,红色边具有给定的代价。将添加虚线边以从这棵树构造一个完整的图。 作为其唯一MST而跨越T的最小权完备图G如下所示: 2)对MST的所有其他边,权重,按权重递减的顺序重复。进行只包括而不包括其他MST边的切割。此切割的任何未知非MST边的权重应为。 问题: 1)上