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

    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;
}
欢迎一起讨论。

猜你喜欢

转载自blog.csdn.net/zhushiq1234/article/details/80546152