我正在尝试做c ++程序。我正在尝试做一些有点数的问题。现在我需要找到贯穿所有要点的路径。这实际上不是TSP,因为根据我在TSP中的知识,可以从所有点到达每个其他点。但在我的情况下,点之间的路径网络是固定的,我只需要找到通过所有点的合适路径,前提是所有点都可能没有连接到其他每个点。那么我应该遵循什么算法。
答案 0 :(得分:1)
您似乎正在寻找一种遍历图表的方法?如果是这样,您尝试使用广度优先搜索http://en.wikipedia.org/wiki/Breadth-first_search或深度优先搜索http://en.wikipedia.org/wiki/Depth-first_search来遍历您的图表。
答案 1 :(得分:1)
您想为图表找到Hamiltonian path。
在图论的数学领域,哈密顿路径(或 可跟踪路径)是无向图中的路径,可以访问每个路径 顶点恰好一次。哈密顿循环(或哈密顿循环)是一个 哈密顿路径是一个循环。确定是否有这样的路径和 图中存在的周期是哈密顿路径问题,即 NP完全问题。
存在一些techniques:
有n!不同的顶点序列可能是哈密顿量 在给定的n-顶点图中的路径(并且在完整的图中),所以a 蛮力搜索算法,测试所有可能的序列 很慢。有几种更快的方法。搜索程序 弗兰克鲁宾将图的边缘分为三类: 那些必须在路上的人,那些不能在路上的人,和 犹豫不决。随着搜索的进行,一组决策规则被分类 未定的边缘,并决定是否停止或继续 搜索。该算法将图形划分为可以的组件 单独解决。另外,Bellman的动态编程算法, Held和Karp可用于及时解决问题O(n2 2n)。在 对于每组顶点和每个顶点,确定该方法 在S中的顶点v,是否有一个完全覆盖的路径 S中的顶点和v的结尾。对于S和v的每个选择,存在一个路径 for(S,v)当且仅当v具有邻居w使得存在路径时 for(S - v,w),可以从已经计算过的中查找 动态程序中的信息。
AndreasBjörklund提供了另一种方法 包含 - 排除原则,以减少计数问题 汉密尔顿循环次数到一个更简单的计数问题 计算周期覆盖,可以通过计算某些矩阵来解决 决定因素。使用这种方法,他展示了如何解决 蒙特利尔任意n-顶点图中的Hamiltonian循环问题 时间O中的Carlo算法(1.657n);对于二分图这个算法 可以进一步改进到时间O(1.414n)。
对于最大度为3的图表,可以进行仔细的回溯搜索 在时间O(1.251n)中找到哈密顿循环(如果存在)。