Algorithm 将图可达性降低到SAT(CNF)

Algorithm 将图可达性降低到SAT(CNF),algorithm,graph,sat,Algorithm,Graph,Sat,所以我在课本上遇到了这个问题。我想知道如何将图的可达性问题简化为SAT(CNF)问题。(即,当图G中存在从开始到结束节点的路径时,公式是可满足的) 1) 我不知道如何从多项式时间内可以解决的问题(图可达性)到NP(SAT)问题 2) 我似乎找不到一种方法来将图的这些节点/边表述为CNF中与可达性相对应的实际子句 我试着考虑像Floyd Warshall这样的算法,这些算法可以确定从开始到结束节点是否存在路径,但我似乎无法将这一想法表述为实际的CNF子句。非常感谢您的帮助 几年前,我们做了类似于您

所以我在课本上遇到了这个问题。我想知道如何将图的可达性问题简化为SAT(CNF)问题。(即,当图G中存在从开始到结束节点的路径时,公式是可满足的)

1) 我不知道如何从多项式时间内可以解决的问题(图可达性)到NP(SAT)问题

2) 我似乎找不到一种方法来将图的这些节点/边表述为CNF中与可达性相对应的实际子句


我试着考虑像Floyd Warshall这样的算法,这些算法可以确定从开始到结束节点是否存在路径,但我似乎无法将这一想法表述为实际的CNF子句。非常感谢您的帮助

几年前,我们做了类似于您的任务的事情。我们的方法完全基于Floyd Warshall(F-W.)算法。 直觉上,你会想做这样的事情:

  • 为每对节点使用F.-W.生成所有可能的路径
  • 生成表示每个路径的子句。可以描述为“如果选择了路径,则必须选择以下节点”
  • 生成一个子句,将所有路径合并为一个CNF。最有可能的是“恰好是一”条款
  • 更正式一点:

  • 为图中的每个节点分配一个二进制文本。该文本的值为True。它属于两个节点之间的路径
  • 为一对节点运行F-W
  • 将结果路径转到子句:

  • nodes关于你的第一个问题:因为你只是在设计一种方法,将p中的一个问题简化为NP中的一个问题(而不是反过来),这实际上不是一个问题。您可以将任何图形可达性问题转化为SAT问题,但这并不意味着您可以将任何SAT问题转化为图形可达性问题。

    要得到您期望的答案可能并不太难,但以下是真正的答案:

    将问题X还原为问题Y意味着将X的任何实例转换为Y的实例,以便Y的答案提供X的答案。通常,我们需要P时间缩减,即问题的转换和答案的提取都必须在多项式时间内发生

    图的可达性很容易在线性时间(当然是多项式时间)内求解,因此从图的可达性到SAT的简化非常简单:

  • 给出一个图的可达性问题,用线性时间求解
  • 如果所需路径存在,写出任何可满足的SAT实例,如(A)。否则,写出任何不满意的SAT实例,如(A)和(~A)

  • cs.stackexchange.com是一个很好的地方,可以询问您在SO是否有问题。这个答案似乎基于如何使用SAT解算器解决问题。然而,我认为提问者正在寻找一个更一般的答案,即如何降低对目标的可达性SAT@JacobSoderlund哦,我想你是对的。不过,它可能会提供一些关于如何做到这一点的见解。
        nodes <- get_nodes_from_path(path)  
        node_lits <- logical_and([n.literal for n in nodes])
    
    all_paths <- exactly_one(all_path_clauses)
    all_paths <- True