fmrevはfmを使って逆算検討を行うプログラムです。
次のような場合に使われることを想定しています。
(1) すでに完全であることが判明している図を逆算した図を効率よく検討する
(2) 難しくて頭から検討できない図を後ろから検討する
これについて少し補足をしておきましょう。
すでに完全であることが判明している図を逆算したとき、これを最初から検討し直すと、既に検討した部分を重複して検討することになります。
この無駄を避けるため「逆算した図が完全である」ことを検証する代わりに「逆算した手以外では不詰である」ことを検証するのが(1)です。
また、手数が長く難しい問題でfmでは何時間掛かるか分からない問題があったとします。
そんなとき、全部の検討を諦めるのではなく、後ろから検討していって「少なくとも○○手以降は完全」ということを確かめるのが(2)です。
(1)と(2)は逆算を途中から始めるか、最終図から始めるかの違いだけで、本質的には同じ作業――逆算検討――になります。
逆算検討を行うための機能はfmにあらかじめ備わっていますが、人手での実行は面倒で、ミスも生じやすいものです。
そこで、この作業を自動的に行うよう用意されたのがfmrevです。
逆算検討を行うために使用者はfmrevに図と作意を与える必要があります。
fmrevは図と作意を与えられると次のことを行います。
上記b.の所を最終図ではなく途中図として指定手数からの逆算検討もできますし、非限定を許容し、指定以下の検出解数なら逆算を続行することもできます。
- 作意が成立していることを確認する
- 作意が成立していたら、作意に従って最終図から1手逆算し、作意以外では詰まない(検出解数が0である)ことを確認する
- 上記を確認したら、作意に従って更に1手逆算し、作意以外では詰まない(検出解数が0である)ことを確認する
- 以下同様の作業を初形局面に至るまで繰り返す
詳しくは5.で説明します。
fmrevを利用するには、当然のことながらfm本体が必要です。
また、fmrevに図面と手順を与えるためにfmviewが必要です。
fmviewは基本的には棋譜閲覧のためのソフトですが、図面と手順をfmで利用し易いfdb形式に変換する機能も持っているので、fmrevでもfdb形式の棋譜を用います。
最初にfmrevに与える問題の棋譜を作成します。
直接「メモ帳」などで記述しても良いですし、fmの「手順確認」の機能を使ってfmo形式で出力するのも良いでしょう。
また、駒の動きが特殊でなければkifuwを使ってkif形式で作成しても構いません。
作成した棋譜をfmviewで開きます。
一度動かして、作意通りに駒が動いているのを確認した後、fmviewのツールバーから[ファイル]-[形式を指定して保存]を選び、表示されるダイアログボックスで、[ファイルの種類]を 「fmDBファイル(*.fdb)」とし、適当な名前を付けて保存します。
注意!
fdb形式で保存する前に、[設定]-[棋譜形式]で棋譜の形式を「fm式」にしてください。
fmrevは画面を持たないプログラムなので、実行はコマンドプロンプトから行います。
(コマンドプロンプトはWindowsXPならば、[すべてのプログラム]-[アクセサリ]の中にあります。)
コマンドプロンプトを起動後、fmrevを置いてあるフォルダ(fmやfmviewと一緒の場所に置くのが一番分かり易いと思います)に移動します。
以下は C:\fm\fmrev にfmrev.exeを置いていたときの例です。
この状態でコマンドラインに所定の入力を行い、fmrevを起動して逆算検討を開始します。
入力形式は以下の通りです。
fmrev.exe [/N<n>] <詰手順ファイル> [<fmオプションリスト>] /N<n> :n手目から逆算するとき指定する。 <詰手順ファイル> :fmview.exeで表示可能なファイルを指定する。 fmDB形式保存したファイルを*.fdbという名前で直接指定した場合には、 直接処理される(fmview.exeを起動することなく処理される)。 <fmオプションリスト>:fmのオプションスイッチ(/Mなど)を指定する。
注意! その1
/Nを使うと「手順確認」が行われません。
この場合の手順確認はfmの機能で直接行ってください。
注意! その2
fmオプションで/Bオプションは使わないでください。
fmrevが検出解数を確認できず、検討がストップします。
具体的な問題で実行例を見ていただきましょう。 例えば、次の問題を検討させるとします。これは筆者がOnline Fairy Mateの第156号(2000年6月4日発行)で発表した問題の収束部分です。
協力自玉詰 20手 9 8 7 6 5 4 3 2 1 +---------------------------+ | ・ ・ ・ ・ ・vと ・ ・ 王|一 | ・ ・ ・ ・ ・v玉 ・v歩v歩|二 | ・ ・ ・ ・ ・ ・ ・ ・ ・|三 | ・ ・ ・ ・ ・ と ・ ・ ・|四 | ・ ・ ・ ・ ・ ・ ・ ・ ・|五 | ・ ・ ・ ・ ・ ・ ・ ・ ・|六 | ・ ・ ・ ・ ・ ・ ・ ・ ・|七 | ・ ・ ・ ・ ・ ・ ・ ・ ・|八 | ・ ・ ・ ・ ・ ・ ・ ・ ・|九 +---------------------------+ 持駒:なし 53と 32玉 42と 33玉 32と 23玉 22と 13玉 12と 23玉 24歩 32玉 23歩成 31玉 32歩 同と 22と上 同と 21と 同と まで 20手
(このくらいならfmで普通に検討できるのですが、あくまで例として取り上げました。)
この図と手順を適当な名前を付けて保存します。
ここではOFM15603.FMOとしておきます。
これをfmviewで開きます。
ツールバーから[ファイル]-[形式を指定して保存]を選び、fmDBファイル(*.fdb)として保存します。
ここではOFM15603.FDBとしておきます。保存場所はfmとfmrevが置いてあるフォルダにしておきます。
コマンドプロンプトを起動し、次のコマンドを入力します。
fmrev OFM15603.FDB
これで検討が開始され、検討が無事終了すると以下のメッセージが出力されます。
fmrev: 指定詰手順が成立しています。
ところで、もし余詰が見つかったらどうなるでしょうか?
次のように、余詰のある図を与えてみましょう。
協力自玉詰 21手 9 8 7 6 5 4 3 2 1 +---------------------------+ | ・ ・ ・ ・ ・vと ・ ・ 王|一 | ・ ・ ・ ・ ・ とv玉v歩v歩|二 | ・ ・ ・ ・ ・ ・ ・ ・ ・|三 | ・ ・ ・ ・ ・ と ・ ・ ・|四 | ・ ・ ・ ・ ・ ・ ・ ・ ・|五 | ・ ・ ・ ・ ・ ・ ・ ・ ・|六 | ・ ・ ・ ・ ・ ・ ・ ・ ・|七 | ・ ・ ・ ・ ・ ・ ・ ・ ・|八 | ・ ・ ・ ・ ・ ・ ・ ・ ・|九 +---------------------------+ 持駒:なし 42玉 53と 32玉 42と 33玉 32と 23玉 22と 13玉 12と 23玉 24歩 32玉 23歩成 31玉 32歩 同と 22と上 同と 21と 同と まで 21手
そうすると、次のようなメッセージが出ます。
fmrev: 指定詰手順 1手目の図で余詰がありました。
なお、フォルダにFMREV000.FMI〜FMREV021.FMI、FMREV000.FMO〜FMREV021.FMOという検討のために生成された入力ファイルと検討結果の出力ファイルが生成されます。
これらはFMREVという接頭辞に(詰上りからの)手数を示す3桁の数値が付いたファイル名です。
この場合、余詰が見つかったのは1手目、即ちFMREV021.FMOなので、そのファイルを見れば検出された余詰を確認できます。
これらのファイルは、保存しないと次のfmrevでの検討時に消されてしまうので、必要な場合は名前を変えて保存してください。
また、逆算検討を中断したい場合はCtrl-Q(Ctrlキーを押しながらQ)で中断してください。
上のくらいの例なら、まだ普通にfmを使っても難なく検討できますが、そもそもそんな簡単な問題ならfmrevを使うこと自体がないと思います。 (普通にfmで頭から検討すれば良い。)
通常は次のように/Mオプションでメモリを割り当てて検討を高速化します。
fmrev OFM15603.FDB /M10=100mb
また、余詰がある場合待避ファイルが残るので、これを残したくない場合/S-(自動待避なし)を指定します。
fmrev OFM15603.FDB /M10=100mb /S-
/Nを使うと指定手数からの逆算検討ができます。
例えば20手の図を1手逆算した図をOFM15603-1.FDBに保存し、その手だけを検討する場合は以下のように指定します。
fmrev /N21 OFM15603-1.FDB /M10=100mb
fmrevは途中で非限定を見つけた場合、そこで検討をやめてしまいますが、多少の非限定があっても良いので、検討を続行して欲しい場合もあるでしょう。
そんなときは検出する解の上限を/Lで指定します。
/Lには2以上の値を指定でき、指定した数未満なら検討を続行します。
例えば、次の図で非限定は1つまで許容するとします。
協力自玉詰 24手 9 8 7 6 5 4 3 2 1 +---------------------------+ | ・ ・ ・ ・ ・vと ・ ・ 王|一 | ・ ・ ・ ・ ・ ・ ・v歩v歩|二 | ・ ・ ・ ・ ・ ・ ・ ・ ・|三 | ・ ・ ・ ・v玉 ・ ・ ・ ・|四 | ・ ・ ・ ・ ・ ・ ・ ・ ・|五 | ・ ・ ・ ・ ・ と ・ ・ ・|六 | ・ ・ ・ ・ ・ ・ ・ ・ ・|七 | ・ ・ ・ ・ ・ ・ ・ ・ ・|八 | ・ ・ ・ ・ ・ ・ ・ ・ ・|九 +---------------------------+ 持駒:なし 45と 53玉 44と 42玉 53と 32玉 42と 33玉 32と 23玉 22と 13玉 12と 23玉 24歩 32玉 23歩成 31玉 32歩 同と 22と上 同と 21と 同と まで 24手
非限定は1つまで良いので、/Lの値は2です。
fmrev OFM15603-2.FDB /L2 /M10=100mb /S-
この指定で動かすと3手目の非限定は非限定がひとつなので検討は続行され、2手目で次のメッセージが出て検討がストップします。
fmrev: 指定詰手順 2手目の図で余詰がありました。
ただ、あまり条件を緩めすぎると早詰や駒余りを検出しても、他の解に紛れて見落とす危険があります。
早詰や駒余りを見つけた時点で検討を打切る場合は、/LS(早詰打切り)や /LP(駒余り打切り)オプションを併用した方が良いでしょう。
例えば、5解までの検出は許すが、早詰・駒余りを許さず、自動待避を行わない場合はこう指定します。
fmrev OFM15603-2.FDB /L5,P,S /M10=100mb /S-
難しい問題をやらせる場合、単に/Mを付加するだけでなく、/M+(待避ファイルの引継ぎ)を行うと効果的です。
逆算の場合、検討局面が類似図に収束することが多いので、前回の検討結果が逆算図の検討でも役に立つからです。
/M+を使う場合は次のように/Sで待避ファイル名も指定します。
fmrev OFM15603-3.FDB /M10=100mb,+ /SOFM156
ただし、この方法は易しい問題にはお勧めできません。
待避ファイルの引継ぎはハードディスクへのアクセスが発生し、それに時間を取られるため、易しい問題では余分な時間を食うことになるからです。
問題の難度を見極めて適切にお使い下さい。
注意! メモリチェックに引っ掛からないために
待避ファイル読込とfmへのメモリ割当てはしばしば並行して行われるため、実際の空きメモリの半分ほどしか/Mに割り当てられないことがあります。
これを避け、ぎりぎりの大きさまでメモリを使いたい場合は、/XV(メモリチェックの省略)をFMENV(fmの環境ファイル)に定義してください。
本サイトで配布しているFMENVを例に取ると、1行目に以下のオプションが定義されていると思います。
OPTION = "/XG,T"
これにVを追加します。
OPTION = "/XG,T,V"
この指定により空きメモリをぎりぎりまでfmに割り当てることが可能になります。
ここまでfdb形式の棋譜に変換してからfmrevを起動する方法を説明してきましたが、fmo形式の棋譜を直接指定することもできます。
fmrev OFM15603.FMO
fmo形式の棋譜が指定されると、fmviewがfmrevと同じフォルダにあるかパスの通ったフォルダにある場合、自動でfmviewが起動されます。
fmviewが起動された後は、通常の手順と同様にfdb形式の棋譜の保存を行い、fmviewを終了させます。
fmviewの終了と同時に逆算検討が始まります。
(2009.4.16 七郎)