将棋ソフト開発(仮)

将棋のソフトを作るのです。趣味で。

電王戦Final - 第五局

第四局の記事だけ書いてないんですけど。

第五局は、まぁこれはこれでいいんじゃないでしょうか。全てを含めて。

ただ川上さんの会見だけ、何を言いたかったのか一部分からなかったので、そのへんはなんとも言えないですけど。

 

ちなみに第五局で私が一番楽しかったのはエキシビジョンです(笑)。

私は将棋を見たいタイプなので。

 

 

では本題に。

自慢するわけではありませんが!

私のソフトは!

滅多に飛車とか角とか詰まされません!!

 

なぜなら、一手目でいきなりパスして相手が何を指そうとするのか探ろうとするソフトだから。

と言う事で、角や飛車が詰まされる盤面が比較的読みやすいわけです。

 十分な時間を得られればこの形式のほうが強くなります。

そのかわり、結論(指し手)を算出するのが遅くなって、早指しは弱いです。

 

またこの方式は、やんちゃなことを指せない役割も担わせてます。

純粋に一手パスした時に変化する点数が「局面の重み」なので、

どの程度やんちゃなことをしてるか、数値にして算出できるわけでもあります。

 

このとき、前後の局面や他の指し手と比べて、不自然な点数の推移がある場合、

「やんちゃなことをしてる」とか「綱渡りを始めようとしている」とか、ある程度予測します。

そうゆう時は、思考時間をおもいっきり増加させている仕様です。

(書くのは簡単ですが、苦労しました。と言うか本当に正しく動作してるのか今でも不明です)。

 

また、実はソフトは「詰めろ」とか「必至」を出すのは苦手です。

と言うか、ほとんどのソフトはそうゆう考えかたはしません。(出来ません)。

これは、ソフトの検索は総当り検索が基準にあるからで、

人間とは局面の理解の仕方や、手の考え方が違うからです。

「詰めろ」とは人間用の概念です。

 

でも、詰めろを簡単に出す方法があります。

一手パスするのです。これで詰んだら詰めろ。(たぶん人間の脳内と同じ方式です)。

んで、詰めろが正確に割り出された場合、その後の検索方式を最適化することができます。

 

私のソフトの場合は、詰めろを片っ端から出して、

(基本的には)その詰めろが解消されるまで検索を続けて点数を出します。

なので、手数に関わらず「詰めろ同士の優劣の比較」が可能になっています。

 

なので、私のソフトは、一直線の詰みとかにも案外強いです。

ちなみにソフトが、 「一直線の詰みに弱い」のと 「飛車が詰められる」 のは、

たぶん同じ理由だと思います。

手順通りの総当り検索だとそうなるんです。しょうがないね。

 

ただし、現段階できちんと作れているかと言われると、まだすごく不安定な動作です。

これ、理屈だけ書くと簡単に書いてるように見えると思うけど、

普通のプログラマーは嫌になって投げ出すレベルじゃないかなぁ。

 

そしてさらに、言うと、私のソフトは早指しするとめちゃくちゃ弱いです。

ある程度のスペックのあるPCで、一定時以上思考させたときに、始めて成果の出る方式です。

もちろん、今までにも書いてきたように、私のソフトは他にもいろいろなことをやっています。

なので、その遅さたるや凄まじい物があります。

 

 

でも、思考が遅いからって弱いソフトなわけじゃないんだよ。

むしろ本当の最善手を探すにはそれがいいんだよ、と言う思いがあります。

一応、なぜそうゆう考えなのかを「すごく大雑把」に書くとこうなります。

 

[A] 総当り検索速度:速度 300万 / 1sec, 一盤面探索平均40手。

[B] 遅いけど良い検索:速度 10万 / 1sec(速度1/30), 一盤面探索平均30手(検索盤面 3/4)。

だったとします。(数値の設定はすごく適当です)。

 

Aの場合、五手先を読むのに1億0240万0000盤面必要で、所要時間は約34秒です。

Bの場合、五手先を読むのに2430万0000盤面必要で、所要時間は243秒です。

(Bが7倍遅い)

 

Aの場合、15手先を読むのに 1073741824000000000000000盤面必要で (桁の名前は知らん)、

所要時間は99420539259259時間です。

Bの場合、15手先を読むのに14348907000000000000000盤面必要で、

所要時間は39858075000000時間です。

(Bが約3倍速い)。

 

30手読む場合は、Bが500倍の速度になります。

まぁ、65287649700231164383561643835616年かかるんだけどね。

 

だからBのほうが早指しは弱くて、長考は強いんです。

まぁそんな感じです。

( 実際はこんな単純な処理じゃないけど。

実際10手先を読んでる頃には、1手目は3つくらいに絞り込んでます)。

で、私はBが好きなんです。

 

だって、Aの方式って極論を言えば、単に総当り検索を作って、

あとは速いマシンを用意してくださいってことじゃないですか。

プログラマーはとは一体・・・

みたいな感覚を覚えるから。

しかも、探索手数が深くなればマシン速度が100倍になってもほとんど意味ないと言う・・・

 

 

話しにまとまりがないようですけど、今回はこれで終わり。