将图形可及性降低到SAT(CNF)

时间:2019-06-17 02:50:41

标签: algorithm graph sat

所以我在教科书中遇到了这个问题。我想知道如何将图形可达性问题简化为SAT(CNF)问题。 (即,只要在图G中存在从起点到终点的路径,公式就可以满足)

1)我无法确定如何从多项式时间内可以解决的问题(图形可到达性)转到NP(SAT)。

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

我试图考虑像Floyd-Warshall这样的算法,该算法确定从起点到终点的路径是否存在,但我似乎无法将其表达为实际的CNF子句。帮助将不胜感激!

3 个答案:

答案 0 :(得分:1)

想出您期望的答案可能并不难,但是这里是 real 答案:

将问题 X 减少为问题 Y 是指将 X 的任何实例转换为 Y ,这样 Y 的答案就会提供 X 的答案。通常,我们需要减少P时间,即问题的转化和答案的提取都必须在多项式时间内进行。

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

  1. 给出图的可达性问题,在线性时间内解决;
  2. 如果存在所需的路径,请写出任何可满足的SAT实例,例如(A)。否则,写出任何不满意的SAT实例,例如(A)&(〜A)

答案 1 :(得分:0)

几年前,我们做了与您的任务相似的事情。我们的方法完全基于Floyd-Warshall(F.-W.)算法。 直观地,您想要这样的事情:

  1. 使用F.-W生成所有可能的路径。每对节点
  2. 生成代表每个路径的子句。可以描述为“如果选择了路径,则必须选择以下节点”
  3. 生成一个子句,将所有路径组合到一个CNF中。很有可能是“ exactly_one”子句。

正式一点:

  1. 为图中的每个节点分配一个二进制文字。该文字的值为 True iff。它属于两个节点之间的路径。
  2. 运行F.-W.一对节点
  3. 将结果路径转到子句:
    nodes <- get_nodes_from_path(path)  
    node_lits <- logical_and([n.literal for n in nodes])
  1. 获取路径path_lit <- get_new_literal() new 文字
  2. 将其添加到路径path_clause <- if_then_else(node_lits, path_lit)
  3. 转到2,枚举所有对

最后,您可以执行以下操作:

all_paths <- exactly_one(all_path_clauses)
all_paths <- True

SAT解算器将被迫选择路径之一,这将导致选择相应的节点。

答案 2 :(得分:0)

关于第一个问题:由于您仅在设计一种将P中的问题简化为NP中的问题的方法(而不是相反的方法),因此这实际上不是问题。您可以将任何Graph可达性问题转换为SAT问题,但这并不意味着您可以将任何SAT问题均转换为Graph Reachability问题。