SAT问题

什么是SAT问题?

  SAT问题即命题逻辑公式的可满足性问题(satisfiability problem),是计算机科学与人工智能基本问题,是一个典型的NP完全问题。
对于任一布尔变元x,x与其非“¬x”称为文字(literal)。对于多个布尔变元,若干个文字的或运算l1∨l2∨…∨lk称为子句(clause)。只含一个文字的子句称为单子句。不含任何文字的子句称为空子句,常用符号□表示。子句所含文字越多,越易满足,空子句不可满足。
SAT问题一般可描述为:给定布尔变元集合{x1, x2, ..., xn}以及相应的子句集合{c1, c2, ..., cm},对于合取范式(CNF范式):F = c1∧c2∧...∧cm,判定是否存在对每个布尔变元的一组真值赋值使F为真,当为真时(问题是可满足的,SAT),输出对应的变元赋值(一组解)结果。

CNF公式及.cnf文件
一个CNF公式也可以表示为一个合取式。
例如,由三个布尔变元a,b,c所形成的一个CNF公式(¬a∨b)∧(¬b∨c),可用集合表示为{¬a∨b,¬b∨c},该公式是满足的,a=0, b=0,c=1是其一组解。
一个CNF SAT公式或算例的具体信息通常存储在一个.cnf文件中,下图是算例problem1.cnf文件前若干行的截图。

CNF文件中,由‘c’开头的是若干注释说明行;
‘p’开头的行说明公式的总体信息,包括:范式为CNF;公式有200个布尔变元,由1到200的整数表示;320个子句。
之后每行对应一个子句,0为结束标记。46表示第46号变元,且为正文字;-46则是对应的负文字,文字之间以空格分隔

DPLL算法基本思想

DPLL算法是基于树/二叉树的回溯搜索算法。其中涉及到的一些对CNF公式的化简策略如下:

  1. 单子句规则

如果子句集S中有一个单子句L,那么L一定取真值,于是可以从S中删除所有包含L的子句(包括单子句本身),得到子句集S1,如果它是空集,则S可满足。否则对S1中的每个子句,如果它包含文字¬L,则从该子句中去掉这个文字,这样可得到子句集合S2。S可满足当且仅当S2可满足。单子句传播策略就是反复利用单子句规则化简S的过程。

  1. 分裂策略

按某种策略选取一个文字L.如果L取真值,则根据单子句传播策略,可将S化成S2;若L取假值(即¬L成立)时,S可化成S1. 交错使用上述两种策略可不断地对公式化简,并最终达到终止状态,其执行过程可表示为一棵二叉搜索树,

  1. 纯文字规则

在一个合取范式中,若一个命题变量要么以全是正文字的形式出现,要么以全是负文字的形式出现,那么该文字就称为纯文字。消除这种所有出现即为正或出现即为负的原子公式所在子句的规则就称为纯文字规则.

  1. 消除原子公式规则

假设给定的合取范式或一部分子式可以表示为以下这种形式:
其中, P 、 Q 、 R 都是析取子式, u 和 u 不在其它子句中出现,且 P 、 Q 、 R都与原子公式 u 无关,那么该公式可以消减为不含原子公式 u 的形式:

  1. 重言子句规则

如果一个子句是重言子句(一般是子句中存在互补的文字),那么就可以将它从合取范式中删除。

  1. 包含规则

如果A1,A2 是合取范式 B 的两个子句,且A 1 ⊆ A2,则求合取范式 B 的可满足性问题时可以直接将子句A1 删去。

  1. 分裂规则

设 CNF 公式的子句集为:
DPLL算法是经典的SAT完备型求解算法,对给定的一个SAT问题实例,理论上可判定其是否满足,满足时可给出对应的一组解。

DPLL算法基本实现过程
对 CNF 公式中的文字进行真值赋值所得出的搜索空间可以用一棵二叉树来表示。树中的每个节点对应一个布尔变元,取值只能为 1 和 0 ,左右子树表示该变量取真值和假值的分支,从二叉树中根节点到叶子节点的一条路径就表示 CNF 公式中的一组变量赋值序列。

基于 DPLL 的算法都是对这棵二叉树从根节点开始进行深度优先搜索 (DFS) 遍历所有的通路,以找到使问题可满足解。

容易知道,一课二叉树的叶子节点只能有两种:

  1. 子句集取真值,该问题是可满足的。
  2. 子句集中含有一个或多个空子句,该问题不可满足 。

绝大部分回溯搜索算法都是建立在原有的 DPLL 算法框架之上的。它们的求解过程基本上都是分为以下 3 个阶段:

  1. 变量决策阶段(即 DECIDE 过程):在搜索过程的每一分支阶段,选择未赋值的一个变量为其赋值为 0 或 1 ,该变量称为决策变量,决策变量在赋值时所处的二叉树中的高度称为它的决策层
  2. 推理阶段(也称为 BCP 过程):每一次已选择变量赋值之后,识别该赋值所导致的必要的赋值或者根据已有的变量赋值对子句进行化简,即进行布尔约束传播过程。
  3. 回溯阶段( BACKTRACK ):推理过程中发生冲突时,进行冲突分析和子句学习,并实现算法的回溯,使搜索过程从较深的变量决策层返回至较浅的决策层。冲突即指 BCP 过程中,至少出现了一个子句不可满足的情况。

下图是DPLL算法实现的一个基本流程图:

接下来就是关于具体的DPLL实现过程:DPLL实现所需要的数据结构,数据预处理过程,加速搜索的启发式策略(如何快速地选择决策变量赋值),以及在搜索赋值过程中遇到冲突时的解决办法,以及基本回溯方法等等。

原文部分内容来自《陈稳. 基于DPLL的SAT算法的研究与应用.硕士学位论文,电子科技大学,2011》

基于DPLL的SAT求解器相关推荐

  1. 从零开始编写SAT求解器(一)

    从零开始编写SAT求解器(一) 从零开始编写SAT求解器(一) 源起 背景知识 SAT问题 DIMACS文件 DPLL算法 项目架构 从零开始编写SAT求解器(一) 源起 最近在github上看到了非 ...

  2. windows下编译以及运行cryptominisat 求解器(sat求解器)

    cryptominisat是由msoos所开发的一款sat求解器,sat的具体问题另外一篇博客里有详细介绍点击打开链接,本篇文章只介绍如何在windows下运行cryptominisat,将自己遇到的 ...

  3. sat求解器解哈密顿回路

    资料:https://ozanerdem.github.io/jekyll/update/2019/11/17/representation-in-sat.html https://modref.gi ...

  4. 2-2 组合优化问题-常用模型与通用求解器

    组合优化问题常用模型 组合优化问题常常难以求解,我们可以把这些转化为目前已经有成熟求解器的模型. 1. 可满足性问题(Satisfiability, SAT) 上一节已经讲过,SAT 是一个 NPC ...

  5. Flow Free solver[连线游戏求解器]

    Fast automated solver for Flow Free puzzles written in C.  用C语言编写的连线游戏的快速自动求解器. GIF of the final pro ...

  6. FLUENT软件求解器选择(转载)

    在FLUENT软件当中,有两种数值方法可以选择: ● 基于压力的求解器. ● 基于密度的求解器. 从传统上讲,基于压力的求解器是针对低速.不可压缩流开发的,基于密度的求解器是针对高速.可压缩流开发的. ...

  7. Fluent求解器——空化模型

    一.空化 当液体经过部分阀件时,液体的压力可能会降低到饱和蒸气压以下,随着压力减小,液体发生汽化的过程即为空化.空化过程中,液体中的微小汽泡以及未溶解的气体或气核会进一步发展并形成空穴,与此同时,在低 ...

  8. 几何约束求解器算法的实现

    GitHub上有很多开源的几何约束求解器算法的实现,可以帮助你更好地理解和应用这些算法.以下是一些值得关注的项目: "OpenCascade":这是一个开源的CAD内核,包含了几何 ...

  9. 基于深度搜索的树路径求解_基于深度学习的自动验证码求解器

    基于深度搜索的树路径求解 计算机视觉,网络安全,深度学习(Computer Vision, Cybersecurity, Deep Learning) Disclaimer: The followin ...

最新文章

  1. md加密 16位 32位
  2. TCP/IP网络协议的通俗理解,socket,http,soap。
  3. ip guard保证java代码安全_IP-guard加密新增四大功能 让一“密“防百疏
  4. 防止stack buffer overflows攻击的方法 : Canary 漏洞缓解机制
  5. 02_Android写xml文件和读xml文件
  6. Xilium.CefGlue的入门
  7. 用Yum安装最新的MySQL版本
  8. 广西国际商务职业技术学院官网计算机功课,2019—2020学年秋季学期线上线下混合式教学课程听课情况汇报...
  9. 排序算法总结(C++)
  10. samba 和 nfs 实验
  11. PDF to Word OCR for Mac(PDF文档转换成word格式)
  12. 整理C知识点--函数(重点)
  13. Ruby 常用的正则表达式1
  14. 前端html静态页面化妆品电商购物网站.rar(含html源码)
  15. 怎么将CAD图纸快速导入转换成常见的黑白JPG格式?
  16. python取字母以及数字随机数
  17. curl命令操作ElasticSearch
  18. 针对s3c2440芯片制作交叉编译工具链
  19. Hibernate入门简介----张冬
  20. 盘点|2018半导体产业城市“风云榜”

热门文章

  1. HFSS学习笔记——T型波导
  2. java word导出图片格式_用java怎么将word文档转成图片格式
  3. Java中JFrame窗口添加背景图片
  4. java adb命令_从Java程序执行ADB命令
  5. Python——利用pygame模块制作RPG游戏(一)
  6. 【IDEA】- IDEA导入 mysql驱动包的时候 编译时可以找到驱动包 , 但是运行时无法找到
  7. java2实用教程答案_Java-2实用教程(第5版)习题解答.doc
  8. TCPIP详解Protocol 读书笔记(三) IP协议讲解
  9. MATLAB | 一个贼简单的粒子圣诞树
  10. Docker  入门