我一直在努力解决以下问题:NP-Complete或NP-Hard。
问题如下:
给出图G(V,E)并要求生成从起始节点S到节点T的两条路线。边E被分成K个不相交集。让我们将两条路线称为R1和R2。在同一组中不存在边缘E1和E2,使得E1在路径R1中并且E2在R2中(更简单地说,每个集合必须由不多于一个路由使用)。此外,R1和R2之间不能共享节点。我们正在寻找R1和R2的最短组合路径长度(最小化(len(R1)+ len(R2)))。
我尝试将Subset Sum和Independent Set减少到此但没有成功。
答案 0 :(得分:0)
首先,感谢发布一个非常有趣的问题。通过这项工作非常有趣!
我提出的减少是从3SAT到你的问题。直觉上,减少的工作原理如下:我们构建一个由两个并行的级联节点组成的图形(让我们称它们为左右分支)。左分支边对应于公式中的变量,右分支对应于公式中的子句。我们将构建图形,使得两个路径对应于为满足所有子句的公式选择变量赋值。
强制变量取值的左分支构建如下。对于每个变量x,构建一个如下所示的小工具:
*
true --> / \ <-- false
* *
\ /
*
从顶部节点开始,我们将“左”表示“x为真”而“右”表示“x为假”。我们将为每个变量构建此小工具的一个副本,并从上到下链接它们。因此,从链顶部到底部的路径对应于为命题公式选择变量赋值。
右侧分支的构建方式相似。假设我们有一个条款x&amp; lor; y&amp; lor; ž。然后我们构建这个小工具:
*
/|\
* * *
\|/
*
这里,左分支对应于“x为真”,中间分支对应于“y为真”,右分支对应于“z为真”。我们的想法是,我们需要至少有一个真正的文字每个子句,我们将通过选择哪条路径来选择哪个文字。
现在,我们构建约束集。对于每个变量x,我们要确保如果在左侧分支中我们说x为真,则我们不遵循右侧分支中的边缘,其中x应该是假的。因此,我们将创建一个约束集,其中包含来自左分支的边缘“x is true”以及来自右分支的“x is false”的所有副本。我们将类似地创建第二个约束集,其中包含来自左分支的边缘“x is false”以及来自右分支的标记为“x为真”的所有边。这些约束集共同确保如果我们通过左分支和右分支获取路径,我们为每个变量选择一个值(通过左分支的路径)并且每个子句选择至少一个真正的文字(通过右分支)。
要完成所有操作,我们将创建一个新的起始节点S和一个新的终端节点T,将S链接到左分支中的第一个节点和右分支中的第一个节点,并链接左边的最后一个节点和右边的分支到T.现在,当且仅当存在两个从S到T的节点不相交路径时,才能满足所有约束。做一些快速数学运算表明,如果公式有n个变量和m个子句,那么通过左分支的路径长度将为2n + 2,通过右分支的路径长度将为2m + 2,因此公式当且仅当存在从S到T的一对节点不相交的路径时才能满足,如果公式不可满足,则注意到根本没有合法的路径。
希望这有帮助!