トップページ


基本技#01 「難しい問題は /M9 を使え」

 

1. まずは、おまじないのつもりで

次の問題をfmに解かせてみます。

ばか詰  +歩, 18玉39銀 #35

使用駒3枚ですから、入力も簡単ですね。
図面の入力が終わったらピリオドを押せば検討を開始してくれるのですが、素のままで検討をさせると待てど暮らせど答えを返してくれません。
解析中に X ボタンなどを押し、何を読んでいるか見てみます。

解析中画面

どうやら、と金で延々玉を追い掛け回しているようですね。
このような時に役に立つのが、今回の標題の
/M9 オプションです。
解析を始める前に、とりあえず“/M9”と入力してみます。

スクリーン入力画面での表示例

上はスクリーン入力を使ったときの例ですが、「不詰局面保存:9」と表示されていますね。
この状態で1度何かキーを押し、ピリオドを押して検討をしてみます。

解析結果

今度はなんと解析時間0秒!
これが /M9 オプションの威力です。

「こんなに速くなるなんて、何か問題があるんじゃ…」という疑い深い方は、このページの最後の項を読んでいただくとして、まずは何も考えずに /M9 を使ってみてください。速く正確な解析結果を得られます。

 

2. /M9 とは何か

“/M9”と入力すると“不詰局面保存”と表示されることから想像できると思いますが、これは解析中に不詰と分かった局面を憶えておく機能です。

「不詰局面」と言っても本当に局面だけ憶えていても役に立たないので、「この局面はあと何手では不詰」という情報を憶えておきます。これで、解析中に同じ局面が現れたら、「不詰or詰む可能性がある」が瞬時に判断できるというわけです。
「あと4手では不詰」として憶えていた局面が「あと6手でも不詰」と判明したときには、手数の情報が書き換えられます。

 

3. もっと記憶を

もっと難しい問題に /M9 を使うとこんな表示が出ることがあります。

再使用メッセージ

「再使用」という気になる言葉を含んだメッセージが表示されました。
これは保存局面数が足りなくなったので、憶えている局面の一部を破棄して、新しい局面を憶える領域として再利用します、というメッセージです。
このメッセージが出るようになると、解析の効率は極端に落ちてしまいます。そもそも /M9 で保存される局面数のデフォルト値は、
たった10万局面(2MB分)しかありません。fmはメモリをふんだんに使うことのできない時代に生まれたものなので、その時の仕様を引き継いでいるのです。今は、Windows環境で潤沢なメモリ資源が使える時代ですから、メモリに余裕がある限り大きなメモリを割り当てましょう。例えば512MBを使う場合なら、

/M9=512MB

と指定すればOKです。

注意 保存局面が大きくなると、中断したときの待避ファイルの大きさも大きくなります。
  リムーバブルメディアへの保存を想定しているときは、保存領域に注意してください。
  もちろん、使用可能なメモリの大きさの確認も忘れずに!

ところで、上の画面で /M2,9(2MB) となっているのは何でしょうか?
実は /M9 オプションを指定すると、自動で /M2 オプションも付いてくるのです。
使用者はあまり意識する必要はありませんが、これについては6項で補足します。

 

4. /M10 との使い分け

ドキュメントを読むと /M9 と同様のオプションに /M10 があることが書いてあります。
不詰局面を保存するときに、攻方の手番で憶えるか、受方の手番で憶えるかの違いですが、具体的にどう解析性能に影響するのでしょうか?

/M10の使用例

解析時間は /M9 と同じ0秒ですが、解析局面数は30600で、/M9 の時の 20118 より悪くなっています。では、/M10 は役立たずなのでしょうか?

次に「ばか自殺詰」で /M9 と /M10 の比較をしてみましょう。実は「ばか自殺詰」でも /M9 の方が良い結果を残すことが多いのですが、ちょっと気になる現象が起きます。まずは /M10 の実行結果です。(保存局面数はデフォルト値のまま。)

《/M10での解析結果》

/M10での実行結果

同じ問題を /M9 で解かせてみます。

《/M9での解析結果》

/M9での実行結果

解析局面数は /M9 の方が少ないのですが、画面の上部を見ると分かる通り、/M10の時は出なかったテーブル再利用のメッセージが出ています。これが、もっと手数が長く、多量のメモリを使用したときには、局面数の溢れが性能に影響を与えることも考えられます。

昔のfmでは「ばか系は /M9、ば自系は /M10」という使い分けで良かったのですが、現在はテーブル再利用時の処理が改善されたりして、必ずしもそう言えなくなっています。また、/M9 と /M10 を単独に使うのではなく、両方を併用し、どちらかに偏るようにメモリを配分すると良い結果が得られることも経験的に知られています。これらの再検証も含め、今後新たな実験結果が出たら、記事を追記することにしましょう。

 

5. /M11 はもっと強力

ばか系の作品を解くときに /M9 よりも強力な威力を発揮するのが、/M11です。
/M11 は「持駒の歩が減っただけで他に変化がない局面が現れたとき、その手のそれ以降の検索を行わない」というオプションで、要するに「歩の無駄遣いをしない」オプションと思えば良いでしょう。
実際 /M11 を用いた例を見ていただきましょう。使用した問題は3項と同じもの。この例はかなりの難問なので、/M11=1000MB という結構多目のメモリを割り当てています。

/M11での実行結果

これを /M9 で解いたときの結果は次のようになります。割り当てたメモリは同じ1000MBです。
この例の場合は /M11 の効果は1割弱ですが、問題によってはもっと大きな差が出ることもあります。

/M9での実行結果

ところで /M11 の親戚に /M12 というのがあります。これは /M11 よりも遥かに過激で「持駒の歩が増えただけで他に変化がない局面が現れたときに、その手のそれ以降の検索を行わない」というものです。つまりは「歩の無駄遣いをさせる」オプションですね。ば自系の持駒消去型作品では強力な威力を発揮しますが、下手をすると詰むものが詰まなくなる危険なオプションでもあります。

ひるがえって考えれば、/M11 でも詰むものが詰まなくなる危険性が皆無ではありません。
歩の無駄遣いをしないと詰まないことが、ばか詰でもあるからです。
せっかくですから、その具体例は読者のみなさんへの演習問題としておきましょう。

演習問題 ばか詰で /M11 を使ったときに詰まなくなる(又は手数が余分に掛かる)問題を作ってください。
   

6. /M 一族の紹介

/M の仲間には /M1 から /M14 まであるわけですが、普通にfmを使う分にはこのすべてを憶える必要はありません。特に /M3 から /M7 までは、メモリが充分に使えなかった昔の時代に考えられたもので、今ではほとんど使う必要がなくなっています。とりあえずは、/M9, /M10, /M11, /M12 の4つを憶えれば充分だと思います。

ただし、/M1 と /M2 については現在でもちゃんと生き残っています。これは要するに手順中に千日手が生じないようにするためのもので、メモリをほとんど消費しない割に効果は大きいオプションです。ただし、/M10 を指定すると /M1 が、 /M9 を指定すると /M2 が自動で付いてくるようになっているので、使用者はあまり意識する必要はありません。

 

7. 超絶的に心配性または超絶的に運の悪い方へ

/M11 や /M12 について、詰むものが詰まなくなる危険があると説明しましたが、/M9 や /M10 についてはその危険はないのでしょうか?

実は思いっきり運が悪いと、そうなることがあるのです!

/M を使ったとき、不詰局面はハッシュテーブルに登録されます。このとき、局面のデータは高速に参照が行えるよう数値化されて保管されます。この数値化のロジックにもよりますが、極めて低い確率(実際のコードは見ていませんが、普通に考えて(1/2)64)で「ハッシュミス」が起こり、異なる局面を同一の局面と誤認する可能性があるのです。

「ハッシュミス」の発生自体が極めて低い確率ですし、それが発生したために検討結果が覆るというのもこれまた珍しいことでしょう。もし、詰むはずの作が詰まない現象に出くわしたとしても、「ハッシュミス」に原因を求めるのは徒労です。少なくとも、fmでこの機能が搭載されてから今までは、「詰むはずの局面が詰まない」現象にはもっと確実な原因(バグや使用法の間違い等)がありました。

それでも心配だという方のために、/MS というオプションが用意されています。これは「不詰局面を数値化するときの乱数ハッシュの乱数の種を変更する」というものです。乱数の種が変更されることで、同じ局面で同じハッシュミスが起こることはなくなるので、結果の確実性が一層増すという理屈です。

乱数の種を変更しても同じ不幸に見舞われるという人は…、もはや人間の領域を超越しているので、そのことを誇りに思いましょう。

 

[*]