難易度の分類を変更し、バグで分類できてなかったものを整理し、定石を追加し、新アルゴリズムを追加した。BoundaryLUTの確定範囲の拡張も実装してみた。
結果、グラフの形は随分と変わってしまったが、職人さんの高難易度パズルの分析結果はこのようになった。いつもお世話になっております。

難易度4以下は通常の定石ルールで、分類は適当なのでスルー。5は早期閉路防止の簡単なやつとジョルダン曲線定理。6は仮想パス、7はブリッジ制約、8はLUT、9はGF2、10が先読みとなっている。この分類自体も適当ではある。
LUTはまとめて確定するのではなく、分析時は1手確定するごとに終了するように変更した。これにより必要なときにLUTで少しだけ確定して、その結果を使って定石ルールが次々に確定していく様子が見えるようになった。なのでGF2と難易度入れ替え。
このグラフより、LUTが必要な場所は実はほんの少しだったこと、定石ルールとアルゴリズムを足したらGF2と先読みが減ったこと、仮想パスで確定している場所が実際にあって効果が得られていること、早期閉路防止でxを打つことが意外に多いこと、そして、GF2と先読みが終盤に集中していることなどがわかる。
分析アルゴリズムは人間の手筋を再現することを目標にしていて、難易度の低い手から順番に使い、確定できなければ難易度を上げていって、1手確定できたらまた難易度の低い手から使う、ということをしている。従って難易度の高い手筋を使った場所は、それより低い難易度で確定できなかったことを意味している。
分析時には手筋をcsvで出力して、それを読み込んでグラフにしているのだが、このcsvの任意の位置の状態をPencilBox形式で出力して、Webアプリで読み込んで再現することができるようにしている。PencilBox形式は問題自体だけではなく、エッジの状態も保存できる形式である。
ルール適用ボタンもソルバーが確定させているが、アレとは適用順が違うし、一致していたとしても1000ステップ目が見たいからといって1000回ボタンを押すのもつらい。
で、先読みが適用されたあたりの状況を再現して眺めたりしていたのだが、職人が作るパズルは巧妙で確かに今のアルゴリズムでは逆立ちしても確定できないパターンになっていた。俺が見ると解き方はわかるのだが、それを処理する適切なアルゴリズムが思いつかない。
職人パズルが先読み無しで解けないということは、現状の問題生成ロジックでは職人パズルレベルの問題が生成できないということを意味する。
ふむ。まだまだ遊べそうだなこれ。







