cryptominisat是由msoos所开发的一款sat求解器,sat的具体问题另外一篇博客里有详细介绍点击打开链接,本篇文章只介绍如何在windows下运行cryptominisat,将自己遇到的坑都写下来,方便后来人。
sat求解器cryptominisat下载:点击打开链接
从链接中下载sat求解器后,链接中提供了如何在windows下编译源码,具体步骤参考下图,
注意:这里的编译器使用的是vs2015,如果不想自己去改参数的话,一定要装上vs2015,具体的步骤就按上图进型操作。唯一注意的点就是, 在获取zlib的时候,直接通过上述命令获取就行,不要自己去下载zlib,自己下载zlib的话,会存在各种问题,上述都是楼主踩过的坑。
通过上述步骤之后,会在编译后的文件加build的文件夹里有一个
使用vs2015打开该文件,会看到
其中cryprominisat5是生成cryptominisat.exe可执行程序,使用这个可以直接对cnf文件进行求解。
而如果想使用lib文件,然后通过代码的形式使用lib库,则是libcryptominisat5这个项目生成的,一定要注意,这里是以release方式生成的lib,在应用该lib的时候,一定需要使用release方式生成项目而不是通过debug的方式。
在bulid/lib/release/文件夹下,就是生成的lib库,然后新建项目,引入include头文件和lib库就可以使用cryptominisat求解器了。
可以运行该代码来尝试求解器是否配置成功。
#include <cryptominisat5/cryptominisat.h> #include <assert.h> #include <vector> using std::vector; using namespace CMSat; int main() { SATSolver solver; vector<Lit> clause; //Let's use 4 threads solver.set_num_threads(4); //We need 3 variables solver.new_vars(3); //adds "1 0" clause.push_back(Lit(0, false)); solver.add_clause(clause); //adds "-2 0" clause.clear(); clause.push_back(Lit(1, true)); solver.add_clause(clause); //adds "-1 2 3 0" clause.clear(); clause.push_back(Lit(0, true)); clause.push_back(Lit(1, false)); clause.push_back(Lit(2, false)); solver.add_clause(clause); lbool ret = solver.solve(); assert(ret == l_True); assert(solver.get_model()[0] == l_True); assert(solver.get_model()[1] == l_False); assert(solver.get_model()[2] == l_True); std::cout << "Solution is: " << solver.get_model()[0] << ", " << solver.get_model()[1] << ", " << solver.get_model()[2] << std::endl; return 0; }欢迎一起讨论。