Upgrade to Pro — share decks privately, control downloads, hide ads and more …

コンピュータで問題をサッと解きたい!

 コンピュータで問題をサッと解きたい!

2015年に作ったスライドです。

SATソルバー, CSPソルバー

prime number

June 04, 2015
Tweet

More Decks by prime number

Other Decks in Technology

Transcript

  1. コンピュータで問題をサッと解きたい!
    KMC-3 回生 prime

    View Slide

  2. 2
    自己紹介
    KMC-ID: prime (KMC-3 回生 )
    理学部 3 回生数学系
    Twitter: @_primenumber
    Github: primenumber
    KMC での最近の活動 :
    競技プログラミング練習会
    部誌 /C88
    計算機・電子錠の管理

    View Slide

  3. 3
    今日の本題
    コンピュータを使って、色々な問題をサッと解きたい
    例題 :
    数独
    最大独立集合
    地図の塗り分け

    View Slide

  4. 4
    例 : パズルゲーム ( 数独 )
    同じ行・列・ 3x3 マス内に 1 〜 9 の数字が一度ずつ出る
    ようにマスを埋める

    View Slide

  5. 5
    例 ) 最大独立集合
    独立集合 :
    グラフ上の頂点集合で、どの 2 点も隣り合わないもの
    最大独立集合 :
    独立集合の中で頂点数がもっとも多いもの

    View Slide

  6. 6
    地図の塗り分け
    地図上の地域を、隣り合った地域が別の色になるように
    塗り分けるとき、最小何色で塗れるか?

    View Slide

  7. 7
    コンピュータに問題を解かせるとき
    コンピュータは計算が速いが、計算速度には限度がある
    解の候補を全部調べていると現実的な時間で終わらない
    n マス開いた数独で 1 〜 9 の埋め方は 通り
    さっきの例だと 39 マス開いているので約     通り
    1 秒間に 10 億通り調べても約 5 垓年かかる
    なんとかして計算時間を減らさないといけない
    9n
    1.6×1037

    View Slide

  8. 8
    コンピュータに問題を解かせるとき
    枝刈り
    解にならないとわかった解の候補を調べずに切り捨てる
    例 ) 数独
    途中まで埋めた時点で、ある列に同じ数字が 2 回出ていたら、
    このあとどう埋めても解にはならない→調べなくて良い
    問題の還元
    適切な変換によって問題をより小さい別の問題に帰着する
    例 ) 最大独立集合
    隣合う頂点が一つ以下の頂点は必ず使うとして、隣合う頂点を
    取り除いた問題を考える

    View Slide

  9. 9
    コンピュータに問題を解かせるとき
    その他にも様々なテクニック・アルゴリズムが存在
    しかし、問題ごとに最適なテクニックを考えるのは面倒
    何とかしてサッと解きたい…

    View Slide

  10. 10
    そんなときに
    !!SAT ソルバ !!

    View Slide

  11. 11
    SAT ソルバ
    ダジャレ
    ではない
    SATisfiability の頭文字
    「充足可能性問題」という問題を解くプログラムを指す
    MiniSat という簡潔かつそれなりに高速なオープンソース
    のソルバがある
    C++ 、 600 〜 2000 行(バージョンによる)

    View Slide

  12. 12
    充足可能性問題
    与えられた命題論理式を真にするような変数への真偽値
    の割り当てが存在するか判定する問題
    命題論理式 :
    変数    は命題論理式
    命題論理式   に対して次は命題論理式
    (否定)
    (かつ)
    (または)
    (ならば)
    例 ) ((¬x
    1
    ∨x
    2
    )∧(¬x
    2
    ∨x
    3
    ))
    x
    1,
    x
    2,

    A ,B
    (A∧B)
    (A∨B)
    (A ⇒B)
    ¬A

    View Slide

  13. 13
    充足可能性問題
    例 ) は充足可能
                   とすればよい
    例 )      は充足不能
    どう真偽値を割り当てても真にならない
    ((¬x
    1
    ∨x
    2
    )∧(¬x
    2
    ∨x
    3
    ))
    x
    1
    =True , x
    2
    =True, x
    3
    =True
    (x
    1
    ∧¬x
    1
    )

    View Slide

  14. 14
    なぜ充足可能性問題?
    実は、「クラス NP 」に属する任意の問題は充足可能性問
    題に変換できることが知られている
    クラス NP :
    解の候補が与えられたときに、それが本当に解であるかを
    多項式時間で判定できる判定問題
    判定問題 :
    yes/no で答えられる問題

    View Slide

  15. 15
    なぜ充足可能性問題?
    実際、例で挙げた問題は充足可能性問題に帰着できる
    「〇〇を最大 / 最小化する〜〜を求める」
    → 「〇〇は n 以上 / 以下になる」に変形し、 n で二分探索
    あとはルールを論理式で表し、充足可能性問題を解くだけ
    充足可能性問題は理論上も実用上も重要な問題
    長年の研究によって高速なソルバが作られている
    問題をそのまま解くより充足可能性問題に変換したほうが
    高速に解ける場合が少なくない
    変数 10 万、論理式のサイズ 100 万以上でも解けたりする

    View Slide

  16. 16
    乗法標準形
    多くの SAT ソルバでは論理式を乗法標準形にして渡す
    乗法標準形 : 節 1∧ 節 2∧…∧ 節 n
    節 : リテラル 1∨ リテラル 2∨…∨ リテラル n
    リテラル : 変数 もしくは ¬ 変数
    例 )
    Fact.
    任意の命題論理式は乗法標準形に変換できる
    ((¬x
    1
    ∨x
    2
    )∧(¬x
    2
    ∨x
    3
    ))

    View Slide

  17. 17
    問題を解く流れ
    問題 論理式
    問題の解 SAT の解
    変換
    変換
    SAT ソルバ

    View Slide

  18. 18
    例 ) 数独
    「  が真⇔ i 行 j 列の数字は k 」とすると
    i 行 j 列には 1 〜 9 のどれかの数字が入る

    行 i に同じ数字 k が二度出てきてはいけない

    のように変換し、すべてを∧で繋ぐ
    既に割り当ての決まっているマスも論理式に付け加える
    x
    ijk
    x
    ij 1
    ∨x
    ij2
    ∨⋯∨x
    ij 9
    (¬x
    i 0k
    ∨¬x
    i1k
    )∧(¬x
    i 0k
    ∨¬x
    i2k
    )∧⋯∧(¬x
    i 8k
    ∨¬x
    i9k
    )

    View Slide

  19. 19
    例 ) 最大独立集合
    「大きさ n 以上の独立集合 S が存在」を論理式で表す
    と定義すると、各辺      の条件は
    さらに「  が真⇔          」と定義する
      の条件は     と表せる
    乗法標準形に直すと
    最後に単項   、      を加えれば解ける
    x
    i
    ⇔v
    i
    ∈S
    e
    i
    =(v
    i
    1
    ,v
    i
    2
    ) ¬x
    i
    1
    ∨¬x
    i
    2
    n
    i , j
    |S∩{v
    1,
    v
    2,
    ⋯,v
    i
    }
    |≥ j
    n
    i+1, j+1
    ⇒((n
    i , j
    ∧x
    i+1
    )∨n
    i, j+1
    )
    n
    i , j
    (¬n
    i+1, j+1
    ∨n
    i, j
    ∨n
    i , j+1
    )∧(¬n
    i+1, j+1
    ∨x
    i
    ∨n
    i, j+1
    )
    n
    |V|,n
    ¬n
    1, j
    (∀ j≥2)

    View Slide

  20. 20
    例 ) 地図の塗り分け
    地図を n 色で塗り分けるとする
    「  が真⇔地域 i を色 j で塗る」
    各辺      の条件は
    各頂点はどれかの色で塗るので
    「 n 色以下で〜〜」は最大独立集合のときのようにする
    x
    i , j
    e
    i
    =(v
    i
    1
    ,v
    i
    2
    ) ¬x
    i
    1
    , j
    ∨¬x
    i
    2
    , j
    (∀1≤ j≤n)
    x
    i ,1
    ∨x
    i ,2
    ∨⋯∨x
    i,n

    View Slide

  21. 21
    問題点
    クラス NP の問題に還元できないような問題は解けない
    将棋やチェスの最善手は(おそらく)わからない
    実際充足可能性問題は難しい
    多項式時間で解けるアルゴリズムは見つかっていない
    充足可能性問題に多項式時間アルゴリズムがある⇔ P=NP
    SAT ソルバは頑張って枝刈り等で高速化している
    それでも問題によりなかなか計算が終わらないことがある
    → 枝刈りのヒントを与えると高速化できる場合がある

    View Slide

  22. 22
    問題点
    問題点を乗法標準形に変換するのはかなり面倒
    整数や小数をうまく扱うのはかなり面倒
    上手く変換しないと計算時間の増大を招くことも
    充足可能性問題変換して問題を解いたあと、解を人間の
    わかる形にするのも面倒

    View Slide

  23. 23
    解決策
    CSP ソルバを使う
    制約充足問題 (CSP) のソルバ
    Sugar というソルバが有名
    1.人間にとってよりわかりやすい形で問題を記述
    2.充足可能性問題に変換して解く
    3.人間のわかりやすい形にして表示する
    整数に関する条件、一意性に関する条件等を上手に扱う

    View Slide

  24. 24
    問題を解く流れ
    問題 論理式
    問題の解 SAT の解
    変換
    SAT ソルバ
    制約式
    CSP の解
    変換
    変換
    変換
    Sugar
    制約ソルバ

    View Slide

  25. 25
    数独を CSP ソルバで解く
    i 行 j 列の数字を x_i_j とする
    i 行 j 列は 1 〜 9 の整数のいずれかである
    (int x_i_j 1 9)
    i 行目にある数はすべて異なる
    (alldifferent x_i_1 x_i_2 … x_i_9)
    列、 3x3 ブロックも同様
    (乗法標準形に比べて)とてもわかりやすい

    View Slide

  26. 26
    まとめ
    SAT ソルバは充足可能性問題を高速に解く
    色々な問題が充足可能性問題に帰着できる
    解法を考えるのが面倒なときは、 SAT ソルバにお任せ
    論理式を考えるのも面倒なら CSP ソルバに丸投げしよう

    View Slide

  27. 27
    参考文献 / リンク
    MiniSat Page: http://minisat.se/
    MiniSat 入門 :
    http://www.kl.i.is.nagoya-u.ac.jp/person/yasuhiro/minisat/minisat12.pdf
    高速 SAT ソルバーの原理と応用 :
    http://www-erato.ist.hokudai.ac.jp/docs/seminar/nabeshima.pdf
    Sugar: a SAT-based Constraint Solver:
    http://bach.istc.kobe-u.ac.jp/sugar/
    パズルを Sugar 制約ソルバーで解く :
    http://bach.istc.kobe-u.ac.jp/sugar/puzzles/

    View Slide