コンピュータ将棋についての議論をするなら、コンピュータ将棋についての基本的な知識くらいは持っていた方がいいでしょう。もちろん知らなくても議論に参加することはできますが、無駄な時間をかけずに済みますし、相手に迷惑がられることもありません(笑)。
ここでは、コンピュータ将棋についての議論をするにあたって、必要と思われる知識について説明します。
ものすごい大雑把な説明をすると、まず、ルール上合法的な指し手を全てピックアップします。合法な手、というとなんだか難しい表現ですがよく使われるんでこの機会に覚えて下さい。要するに「指すことができる手」のことです。銀が後ろに下がるとか桂馬が1段目に行くとか王手がかかっているのに別な手を指すとか二歩とか、そういう「違法な手」、つまり指してはいけない手以外の全ての指し手を言います。
この合法違法については、初手▲8六歩とか、▲7六歩△3四歩のあとの▲3三角成とか、▲2四歩△同歩のあとの▲2五飛とか、手の良し悪しについては勘案されません。とにかく指せる手を全てピックアップします。
そして、その中の1手を選んで指します。
これが将棋プログラムの正体です。
以上。
……というのはウソで、そんな仕組みで動いているプログラムが有段なわけはないです。ただ、現在のプログラムの根っこは、突き詰めればそういうことをしているんだということだけはご理解下さい。
さて。
上記のプログラムはあまりに弱すぎて話になりません。そこで、強くするための「工夫」をしています。
一番単純で効果的な工夫が、「その手を指したあとの局面が有利か不利かを調べ、有利になる指し手を選択する」というものです。人間的には「その手がいい手か悪い手かを調べ……」と言いたいところですが、この表現は厳密には正しくありません。調べているのはあくまでも指し終わった局面で、その局面が有利だからその手はいい手だ、と評価しているわけですからね。
具体的な判断基準としては、例えば駒の損得があります。
駒得であれば、まぁある程度の局面は有利であると思っていいでしょう。そこで、その局面が駒得かどうかを調べ、一番駒得になる手を選択する、という方法を取ります。駒得というのは駒に得点をつけて足し算をすればいいだけですから、コンピュータは簡単にできます。
しかし、そうなると、▲7六歩△8四歩のあとの最善手は▲3三角成(1歩得)ということになります(笑)。この基準だけではまずいですね。
というわけで、現在ではいろんな判断基準を設けて、それらを総合的に判断しています。駒の損得だけではなく、駒の働き、駒の位置、玉の固さ、手番など、いろいろあります。
効果的な判断基準を設けることが、プログラムを強くするポイントでもあります。
先に説明した評価法は、言ってみれば静的な評価です。その瞬間を取り出して評価しているわけです。
しかし、これでは形勢判断はできません。先の例でもあるように、▲7六歩△8四歩のあとの最善手は▲3三角成ということになってしまいます。
「そんなわけないよ。△同角で角損(正確には角と歩の交換)で不利じゃん」
そうですね。
この、「今の局面からその先を考える」、つまり読みを入れることが、プログラムを強くする方法の1つになります。もっと具体的に言うと、その先の局面を仮定的に作り、その局面の指し手を評価し、一番いい局面になる指し手を指すようにするわけです。当たり前っちゃ当たり前のことなんですけどね(笑)。
ただ、ここで重大な問題があります。
最初に、将棋プログラムの中身について「指せる指し手をピックアップして、その中から指し手を選ぶ」と説明しました。しかし、指せる指し手全部を調べて、それらそれぞれの局面についてまた指せる指し手を調べて……とやっていったら、全ての指し手を調べるのは大変な苦労になってしまいます。
名著『将棋は歩から』に、こんな記述があります(若干変えてあります)。問:先手が9枚の歩を1手ずつ全部突く(つまり、9手指す)としたら、何種類のパターンができますか? また、後手も同じようにして計18手指した場合、何通りのパターンが出現しますか?
先手だけのパターンについては、1×2×3×4×5×6×7×8×9=362,880通り。
先手後手だとすると、362,880×362,880で、131,681,894,400通り。
9枚ずつ合計18枚の歩を、違うパターンでつくだけで1300億を超える組み合わせが生じる。しかもこれは、単に歩をひとつずつ進めただけの話である。もし、他の駒の動きをこれに加えたら、どんな数字が出てくるのか、電子計算機でも手に負えないような、無限の変化となりそうである。初版が昭和23年の本なんで電子計算機という表現は見逃してやって欲しいんですが(笑)、つまりはそういうことなんです。「指せる指し手」全てをピックアップしていったら、全部を読むまでに時間がかかりすぎてしまうんです。「組み合わせ爆発」なんていう表現をしたりするらしいですが、とにかくそういうことです。
そこで出てくる方法が、読む手を少なくするというものです。純粋にプログラム技術の話になりますが、うまい方法を使ってなんとか調べる手間を少なくしようということです。
この「読む手を少なくする」というのを、よく「枝刈り」といいます。指し手が枝分かれして広がっていくのを木に譬えて「探索木」と表現し、その枝を読まずに捨てていく様を「刈る」と表現したようです。
方法にはいろいろあって、αβ法、PVS法、SSS法などが有名です。また、反復深化法、共謀数を用いた検索法なども開発されました。共謀数については、背尾詰に搭載されて『寿』を解図したことで一気に名が知られることになりました。
これらについてもきちんと説明したいところなんですが、正直図がないと辛いし大変なんで省略します。『コンピュータ将棋』『コンピュータ将棋の進歩 123』『ゲームプログラミング』等の書籍をお読み下さい。
上記のプログラム的アプローチとは別に、将棋的アプローチから読む手を少なくするという方法も考えられます。
例えば、1手目で飛車損になった。その手はその先を読んでも見込みがないでしょうから、もう読まない、というような考え方です。人間と同じような読みの方法ですね(逆に言うと、プログラム的アプローチでは全部読むという姿勢に変わりはありません。あくまでも、読むんだけど手間を省く、という方向です)。
ここで登場するのが先に出てきた評価点です。評価の恐ろしく低い手は読まない。もっと言っちゃうと、評価の高い順から○手しか読まない、とするのです。
1つの局面で読む手が100手あるとすると、2手で10000手、3手で1000000手読まなければいけません。しかし、例えば10手しか読まないとしてしまえば、3手先まで読んでも1000手分、5手先まで読んでも100000手しか読まずに済みます。これは大変な省略になります。
このような方法(「前向き枝刈り」といいます)では、全部の指し手を読んでいないわけですから、完全に有利な指し手を選択できるわけではありません。「よさそうな手」を選択できるだけです。
しかし、読む手の数を劇的に減らせるという効果は捨てがたいので、ほとんどのソフトはこの前向き枝刈りを行っています。AI将棋のように「そもそも指し手を全部ピックアップしない」という方法もあるくらいです。この辺については『コンピュータ将棋の進歩 2』を読んでみて下さい。AI将棋(YSS)のプログラムについての詳細な解説が載っています。
プログラムの「読み」の部分についての工夫については大体上記までのことを行っています。しかし、棋力をアップさせるポイントは読み以外の部分にもあります。
一番いい例が序盤です。
序盤から手を読む、なんていう人はほとんどいないと思います。ほとんどの人は、自分の得意な定跡を持ち、つまり知能に頼るのではなく知識をアテにして序盤を乗り切っていくわけです。
コンピュータ将棋にもこの方法が使えます。序盤のデータベースを作成し、「この形ではこの手が最善」という情報をたくさん登録しておけばいいのです。あとは、現在の局面がデータベースにあるかどうかを検索し、あればその手を指せばいいわけです。序盤に関してはこれで名人級になれます(笑)。
ただし、この方法は万全ではありません。
1つは、定跡というのは日々書き換わるということ。
例えば、41手目の先手の有力な指し手が5つあるとして、その5つ全てについて後手からの新対策が出て先手有利と言えなくなったとします。この場合、41手目の指し手を5つ以外から探すか、40手目に相手に△○○○と指されると不利になるからということで39手目に別の指し手を選択するかしかなくなります。つまり、新対策が出た時点で定跡ファイルは「ウソの情報」に変わってしまうわけです。
できるだけ頻繁にアップデートすることにより対処はできますが、完全ではありません。
定跡を外された場合にも困ります。
たくさん四間飛車の定跡を入れていても、初手▲8六歩とされたら定跡からは外れます(笑)。その瞬間定跡データベースはゴミ情報となってしまいます。もちろん、読みがきちんとしていれば△8四歩から咎めにいくでしょうが、データベースとしての価値がなくなることには変わりありません。
しかしそれでも、定跡データベースがコンピュータ将棋の棋力向上の役に立っていることには間違いありません。「コンピュータが理解できない定跡を、指し手だけマネて指してもそれは実力ではない」という人もいますが、とりあえず、なにも定跡を知らないより、定跡データベースが多い方がまともな指し手を続ける可能性は高くなります。結果として、強く「見える」ことは事実でしょう。
その他にも、将棋プログラムを強くするためのいろいろな方法が考えられています。
最終盤の詰めの部分について詰将棋ルーチンを呼ぶことはもはや常道ですし、必死ルーチンなども作られています。将来的には、詰めデータベースが構築される可能性もあるでしょう。
昔、谷川名人(だった頃だと思います)が「○図ではどんな持駒を持っていれば詰みか」という問題を連載講座で出していました。これらが何百万と集まれば、データベースにヒットすれば1秒で詰みあるいは寄せができるわけです。詰みについては現在のアルゴリズムでも十分でしょうが、必死、詰めろ、2手スキ……といった概念はまだまだコンピュータには難しすぎるので、カンニングペーパーをいっぱい用意しておくのは有力な方法でしょう。
序盤の駒組みについても研究が進んでいるようです。
特に定跡を外れた場合の駒組みについては、ユーザーからの要望も高いようです。「定跡から外れると、急に長考しだしておまけにクソ手しか指さない」なんて将棋ソフトが売れるとは思えませんしね(笑)。
これについては、AI将棋の作者が「落とし穴方式」を提唱しています。いくつか戦形ごとの駒組みシートを用意しておき、現在の局面から戦形を判断してそのシートを参照するんだそうです。シートには、「金がどこにいると評価点に○点プラス」とか書いてあって、他の手よりも評価点を上げるようにします。すると結果として他の指し手よりも「そこに移動する手」を選択する確率が上がり、こちらの考えたような駒組みをする……と、そういうものです。ポイントの高低をうまく変えると手を指す順番まである程度調節できるらしいです。
ハードの進化についても期待されています。ディープブルーが勝てたのは結局ハードの力が大きかったとも言えます(ソフト面での技術を否定するものではありません)。将棋でも、手がたくさん読めればそれだけいい指し手を選択する可能性が高くなるわけですから、ハードの進化は歓迎です。
もっとも、ハードがなんぼ進化したところで「電子計算機でも手に負えないような、無限の変化」であることには変わりがないんですが、10手読めるのが15手読めるようになったら、それだけ強くなったとは言えるでしょう。
以上です。
非常に駆け足ですが、大体のところは網羅していると思います。
ここまでの説明で判る通り、現在のソフトは
局面から指し手をいくつかピックアップし、それに点数をつけ、その点数が一番高い指し手を選ぶ
という非常に単純な構造で作られています。
もちろん、単純であっても簡単なものではありません。指し手を選択しないと読みの数が爆発的に上昇しますから枝刈りの技術は必須ですし、そもそも正確な評価点の算出方法なんてものは判りません。また、判ったとしてもそれを使う場面というものは違うでしょうから、その判断にまた困ります(序盤と終盤で同じ評価法をしていいわけはないですよね)。
というわけで、現在の将棋ソフトの問題点としては、
といった問題点があると思われます。駒組みの感覚や大局観というものは、究極的には全て評価関数に吸収されてしまう問題だと思います。というか、いい駒組みに高い評価点を与える評価関数、正しい大局観を表現する評価関数の作成問題になるので、結局は評価関数の問題に帰結してしまうといった方が正しいんでしょうか。
現在の将棋ソフトはこれらの問題を解決すべく取り組んでいる最中で、ということはまだ問題は解決されていないわけで、上記の問題がクローズアップされる場面は極端に弱くなります。例えば、定跡を外れた場合の駒組みがヘタレだったり、手待ちが続いた局面での打開の方法が思いつかなかったり、激しい将棋が収まった場合の将棋の流れについていけなかったりします。
将棋ソフトの強さが頭打ちになっているという指摘もこの辺りからきていて、基本的な方法論からさして進化していない状況なんです。逆に言うと、なにかうまい思いつきがあれば(たとえあなたがプログラミングができなくても)それを披露することによってブレイクスルーが生まれるかもしれません。
適当なコト言うなら今がチャンスですよ(<違う)