在极其密集的无向简单图中计算Hamilton路径数的最快方法(算法)是什么(大约99.99%的边连接)?
我正在考虑以下方式:
首先,计算完整图表中Hamilton路径的数量。
一次删除一条边,但我无法弄清楚在删除边时会减少多少条路径。还有如何在去除边缘时防止重复计算?
我在Math.SE上遇到了一个类似的问题,但那是关于汉密尔顿循环而不是路径,我希望这会大大改变这个问题。答案也不太清楚,因此这篇文章。
答案 0 :(得分:0)
我不认为你可以计算没有汉密尔顿路径的数量 实际上生成路径或单独考虑每个路径 在数数。对于特殊图形 - 如完整图形 - 这个 肯定是可能的,但不是一般的。
您可以在完整图表中生成所有汉密尔顿路径并进行检查 对于每一个,如果它使用图表中边缘的子集。当然 你可以通过修剪某些分支来加快速度 在完整的图中生成Hamilton路径。
由于您的图表非常大,因此这种方法肯定不是 可行。但是,您可以计算所有路径的数量 包含缺失边之一的完整图,然后减去 这个号码。
我不认为这是微不足道的。关于它的一些想法:让我们考虑一下
最简单的情况是只缺少一条边。我们可以描述一条路径
具有一系列边或节点。我们假设您的图表有n
节点。 a中缺少边缘有n-1
个可能的位置
哈密尔顿路径通过完整的图表。可以遍历边缘
可以遍历两个方向和不与边缘相邻的节点
在(n-2)!
个不同的订单中。因此我们可以减去
2 * (n-1) * (n-2)! = 2 * (n-1)!
从汉密尔顿路径的总数到完整的图表 获得所需的结果。
如果缺少两条边,我们不能只减去两次
数字,因为我们计算两次路径,即路径
包含两个边。所以我们必须计算这个数字并加上它
再次。但现在变得复杂了:重要的是如何边缘
有关系。如果它们相邻,则数量小于它
否则。所以一般来说,你不能只计算数量
汉密尔顿路径包含k
个缺失的边缘,但它是
重要的是你考虑哪些边缘以及它们是否是
相邻与否。
但是,让我们说你可以计算通过某个路径的路径数量
选择边缘(所有排列,遍历和方向)
在路径中的位置)。让我们进一步假设k
个边缘
失踪。您可以计算包含至少一个的路径数
像这样的边缘:
分别计算通过任何k
边的路径数
总结一下。
对于每对边缘,您已计算穿过该对的路径 两次,所以再次减去这些路径(考虑每一对 个别地)。
现在考虑包含三条边的路径。他们已 计数六次并减去三次(三对不同),所以 你必须减去它们两次。
包含四条边的路径必须减去3次(因为 它们在包含3个边的路径中表示4次)。所以 上。
但是又一次:你必须考虑边缘的每个组合 个别。甚至可能是某一组边缘 不兼容,因为某个节点出现三次。也考虑进去 考虑遍历边缘的方向。
所以没有简单的公式,但是如果缺少边数是 非常小,你可以计算路径。