はじめに
こんにちわ、ユニバの MJ です。
普段はフロントエンドをしているんですが、社内の動きもありそろそろ C++ に手を出したいと思っていた時の話です。
SAT と SAT solver
この話はカナーーーーリ長くなるので割愛。でもここら辺を読んでくれれば嬉しい。
かくいう私も山がいっぱいある中の大学でSATを学んでいた一人です。
SAT
というのは充足可能性問題のことで、それを解くのが SAT Solver
です。
SAT
は NP完全
な問題として知られています。つまり数ある NP
な問題でもっとも難しく解き方によっては指数的に時間がかかってしまう問題(こんな言い方であっているのかとても不安!)
ともあれ、Solver
は この問題を効率良く解くための施策がいくつもされていて、それがとっても C++ の勉強に役立つ。ということです。
MiniSAT
はオープンソース なので自分で改造して性能を伸ばすことができます。
ちなみに Solver
の評価尺度はより早く問題を解くことなので、とてもシンプル。
コンペティションもあるのでみんなもやってみよう!
MAC で動かしてみよう
さて、上の話についてけた人なら当然
xcode
は入っているだろうし brew
も入っているでしょう。
入ってない人はとりあえず、入れましょう。
gcc
さて xcode
経由で入れた gcc
のバーションは少し古いです(私は 4.2でした。)
これだと 最新の minisat-2.2.0
をコンパイルしようとすると error します。
/core/SolverTypes.h:50:16: error: friend
declaration specifying a default argument must be a definition
friend Lit mkLit(Var var, bool sign = false);
mkLit 関係で error しているようです。 これを解消するために gcc5系
を brew
経由で install
しましょう。
brew install
まずは search
brew search gcc
そうすると次のような結果が返ってきました
gcc ✔
homebrew/dupes/apple-gcc42 homebrew/versions/gcc45 homebrew/versions/gcc48 homebrew/versions/gcc6
homebrew/versions/gcc43 homebrew/versions/gcc46 homebrew/versions/gcc49 homebrew/versions/llvm-gcc28
homebrew/versions/gcc44 homebrew/versions/gcc47 homebrew/versions/gcc5 Caskroom/cask/gcc-arm-embedded
どうやら私は brew install gcc
していた模様。もしかしたら homebrew/versions/gcc5
しても良いかもしれない。
install した gcc を使う
install
した gcc を見に行きましょう。私は brew
で install
したものは /usr/local/bin/
に入っているので確認します。
そうすると
gcc-5
g++-5
はい、version5 系の gcc が入っていました。
これを minisat
のコンパイルの時に使うよう指定してあげましょう。
ちなみに コードは ココからダウンロードして
適当なフォルダに展開します。
そのあとで、展開したフォルダにこんな感じのシェルを書いておくと楽かも
#!/bin/sh
export MROOT=$(pwd)
cd ./core
make r CXX=g++-5
加えて、Apple 用に /utils/System.cc
を次のように変更します。
#elif defined(__APPLE__)
#include <malloc/malloc.h>
double Minisat::memUsed(void) {
malloc_statistics_t t;
malloc_zone_statistics(NULL, &t);
return (double)t.max_size_in_use / (1024*1024); }
double Minisat::memUsedPeak(void) {return memUsed(); } <- この行を追記
#else
./build.sh
を実行すれば gcc5系
でコンパイルされ、solver
の実行ファイルができるはずです。
終わりに
これを xcode
で build して動かしたい気持ちになっている。できるかな。
とりあえずは terminal
で動かして SAT
の学習を始めましょう。