📜  证明哈密顿路径是 NP 完全的

📅  最后修改于: 2022-05-13 01:54:10.593000             🧑  作者: Mango

证明哈密顿路径是 NP 完全的

先决条件:NP-完备性
可以快速确定成员资格的语言属于P类,可以快速验证成员资格的语言属于NP类(代表在多项式时间内用非确定性图灵机解决的问题) .
简而言之,每个 NP 问题都有自己的多项式时间验证器。语言 A 的验证者是算法 V,其中

A = {w | V accepts (w, c) for some string c}
where c is certificate or proof that w is a member of A.

我们对 NP 完全问题感兴趣。 NP-Complete 问题定义如下:

(1)问题本身属于NP类。 (2) NP 类中的所有其他问题都可以通过多项式时间简化为。 (B 是多项式时间可简化为 C 表示为B$\leqslant_P$C )

如果仅满足第二个条件,则该问题称为 NP-Hard。
但是不可能将每个 NP 问题都归结为另一个 NP 问题以始终显示其 NP-Completeness。这就是为什么如果我们想证明一个问题是 NP 完全的,我们只是证明问题在 NP 中,并且任何 NP 完全问题都可以简化为,那么我们就完成了,即如果 B 是 NP 完全的并且B$\leqslant_P$C对于 NP 中的 C,则 C 是 NP 完全的。
我们必须证明哈密顿路径是 NP 完全的。有向图 G 中的哈密顿路径HAMPATH是一条通过每个节点恰好一次的有向路径。我们考虑测试一个有向图是否包含连接两个指定节点的哈密顿路径的问题,即

HAMPATH = {(G, s, t) | G is directed graph with a Hamiltonian path from s to t}

为了证明 HAMPATH 是 NP 完全的,我们必须证明 HAMPATH 在 NP 中。为了证明 HAMPATH 在 NP 中,我们必须有一个多项式时间验证器。即使我们没有快速多项式时间算法来确定图是否包含 HAMPATH,但如果以某种方式发现了这样的路径(可能使用指数时间蛮力搜索),我们可以轻松地计算出路径是否HAMPATH 与否,在多项式时间内。如果存在,这里的证书将是 G 中从 s 到 t 本身的哈密顿路径。所以 HAMPATH 是在 NP 中证明的。
因此,现在我们必须证明 NP 类的每个问题都是多项式时间可简化为 HAMPATH 以显示其 NP 完备性。相反,我们将证明 3SAT(先前从 SAT(电路可满足性问题)证明的 NP 完全问题)是多项式时间可简化为 HAMPATH。我们将给定的cnf (连接范式)形式转换为图形,其中小工具(模拟变量和子句的结构)将模拟变量和子句(几个字面量或变量与\vee )。我们现在必须证明3SAT$\leqslant_P$HAMPATH
对于每个 3-cnf 公式$$\Phi我们将展示如何用 s 和 t 构建图 G,其中 s 和 t 之间存在一条哈密顿路径$\Phi$是可以满足的。
我们从一个 3-cnf 公式开始$\Phi$包含 k 个子句,

$\Phi = (a_1\vee b_1\vee c_1)\bigwedge(a_2\vee b_2\vee c_2)\bigwedge....\bigwedge(a_k\vee b_k\vee c_k)$

其中每个a_i, b_i, c_i是字面量x_i要么\bar{x_i} .让x_1, x_2, ...x_l成为的l个变量\phi .现在我们展示如何转换\phi到图 G。我们构建的图 G 有不同的部分来表示出现在\phi .
我们代表每个变量x_i具有菱形结构,其中包含水平行的节点,如下图所示。我们指定稍后出现在水平行中的节点数。

下图描述了 G 的全局结构。它显示了 G 的所有元素及其关系,除了表示变量与包含它们的子句的关系的边。

每个菱形结构都包含一排水平节点,这些节点由沿两个方向运行的边连接。水平行包含 2k 个节点(作为每个子句的 2 个节点)加上,每两个节点之间的 k-1 个额外节点用于一个子句加上,两端的 2 个节点属于菱形;总共 3k+1 个节点。下图给出了清晰的画面。

如果变量x_i出现在子句中c_j ,我们将以下两条边从第 i 个钻石中的第 j 对添加到第 j 个子句节点。

如果\bar{x_i}出现在子句 c_j 中,我们将第 i 个菱形中第 j 对的两条边添加到第 j 个子句节点,如下图所示。

在我们添加与每个出现对应的所有边之后x_i要么\bar{x_i}在每个子句中,G 的构造都是完整的。为了证明它的正确性,我们将证明如果\phi是可满足的,存在从 s 到 t 的哈密顿路径,反之,如果存在这样的路径\phi是可以满足的。
假设\phi是可以满足的。为了演示从 s 到 t 的哈密顿路径,我们首先忽略子句节点。路径从 s 开始,依次通过每个菱形并在 t 结束。击中菱形中的水平节点。路径要么从左到右曲折,要么从右到左曲折;令人满意的任务\phi确定是否x_i分别被赋值为 TRUE 或 FALSE。我们在下图中显示了这两种情况。

到目前为止,这条路径涵盖了 G 中除子句节点之外的所有节点。我们可以通过在水平节点处添加弯路来轻松地包含它们。在每个子句中,我们通过满足赋值来选择一个赋值为 TRUE 的字面量。
如果我们选择x_i在子句中c_j ,我们可以在第 i 颗钻石中的第 j 对绕行。这样做是可能的,因为x_i必须为 TRUE,因此路径从左到右曲折穿过相应的菱形。因此边缘c_j节点顺序正确,允许绕道返回。
同样,如果我们选择\bar{x_i}在子句中c_j ,我们可以在第 i 颗钻石中的第 j 对绕道,因为x_i必须为 FALSE,因此路径从右到左曲折穿过相应的菱形。因此他的边缘c_j节点再次以正确的顺序允许绕行并返回。如果子句中的每个字面量都提供了一个绕道选项,则每次绕道一次。因此每个节点只被访问一次,从而构造了哈密顿路径。
对于相反的方向,如果 G 有一条从 s 到 t 的哈密顿路径,我们证明了一个令人满意的分配\phi .如果哈密顿路径是正常的,即除了闭包节点绕道外,它从上到下依次通过菱形节点;我们可以很容易地得到满意的分配。如果菱形中的路径曲折,我们将变量分配为 TRUE,如果它是曲折的,则将其分配为 FALSE。因为每个节点都出现在路径上,通过观察绕道的方式,我们可以确定相应的 TRUE 变量。
所有有待证明的哈密顿路径必须是正常的意味着路径从一个菱形进入一个子句,但返回到另一个菱形,如下图所示。

路径从节点开始a_1到 c;但不是回到a_2在同一颗钻石中,它返回到b_2在不同的钻石。如果发生这种情况,那么要么a_2要么a_3必须是分隔节点。如果a_2是一个分隔节点,唯一的边进入a_2将来自a_1要么a_3 .如果a_3当时是一个分隔节点a_1a_2将在同一个子句中,然后是进入的边a_2a_1 , a_3和 c。在任何一种情况下路径都无法进入a_2a_3因为a_3是唯一可用的节点a_2指向,所以路径必须退出a_2通过a_3 .因此哈密顿路径必须是正常的。这种减少显然是在多项式时间内进行的,因此证明 HAMPATH 是 NP 完全的。

图片参考:https://tr.m.wikipedia.org/wiki/Hamilton_yolu