问题描述
我最近在考虑一种可能的解决方案,在多项式时间内找到无向图是否具有哈密顿路径。
用作此实现一部分的主要概念基于我注意到的一个观察结果 试图找到(即在纸上)几个无向图的哈密顿路径。
步骤可以定义如下:
-
读取图的邻接矩阵。
-
在读取邻接矩阵时,将为所有节点创建一个映射(即基于字典的结构)。此外,路径的起始节点将被选择,而邻接矩阵 正在阅读。这些操作可以描述如下:
2.1.映射将存储图中的所有节点,作为键值结构。
映射中的每一个条目将表示为:(键:节点索引,值:节点类)
节点类将包含有关节点的以下详细信息:节点索引、事件数量 到它的边,以及指示当前节点是否已经被访问过的标志。
考虑到地图中的每个条目将只包含值 对应于该节点,可以说对给定节点从映射中进行的任何读取访问 索引将是常数(即 O(1))。
2.2.作为在步骤 2.1. 中读取邻接矩阵和构建地图的一部分,起始 节点也将被保留。路径的起始节点将由以下节点表示 具有最少的边数。
如果图中存在多个具有该属性的节点,则索引最低的节点 号码将被选中。在这种情况下,我们可以假设每个节点都有一个索引 与其关联,从零开始:0、1、2 等。
-
在步骤 2.2 中确定的起始节点。将被标记为已访问。
-
接下来的操作将针对其余节点进行。循环将在以下任一时间结束 访问节点的数量等于图中的节点数量,或者当没有 为当前节点找到了一个未访问的相邻节点。
因此,接下来的步骤将作为此循环的一部分进行:
要访问的下一个节点必须遵守以下约束:
- 对当前节点有一条边
- 到目前为止还没有访问过
- 与其他相邻节点相比,具有最少数量的边缘
到当前节点。
4.2.如果没有找到下一个节点,那么算法将结束并指示没有 找到了哈密顿路径。
实现/测试可在 GitHub 上获得:https://github.com/george-cionca/hamiltonian-path
我的主要问题是:
解决方法
算法不能保证找到正确答案
据我所知,您的算法是一种启发式贪婪算法。即,路径从度数最低的顶点开始,继续向度数最低的未访问顶点(或到达未访问节点的边最少的顶点)继续。
如果度数最低的顶点不是正确的顶点,则会失败。
例如,考虑一个具有单个顶点 v1 的图,该顶点通过两条边连接两个大的完整图。然后我们有连接到 v2 和 v7 的顶点 v1,我们有顶点 {v2,v3,v4,v5,v6} 和 {v7,v8,v9,v10,v11},两个集合完全连接。
哈密顿路径当然存在,因为我们可以覆盖一个集群,移动到另一个并清除那个集群。但是,您的算法将从 v1 开始,无法找到路径。
解决著名问题的笔记
您不会注意到哈密顿路径问题是NP-完全的。当您提出一个多项式时间算法来解决问题时,正确性意味着您已经证明了 P=NP。这是极不可能的。当您似乎已经证明了一些著名的未解决且普遍认为是错误的事情时,我建议您稍微降低您的期望,并寻找您可能犯的错误,而不是寻找算法是否有效的验证。在这种情况下,您可能已经查看了算法的隐含假设(例如最低度顶点是有效的起点)并试图为这种直觉想出一个反例。