4月になって、あわただしく、なかなか作成に手がつかず。。。
1週間、更新が止まってしまった。
GWまでには復活したいが
忘れ去られそうだ。。。
煮詰まっているという事もないのですが、
乱数の部分をモンテカルロへと。。。
明日、富士通杯があるようだ。
期待できる要素はあるのだろうか。
張栩もあまり調子が良さそうではないし。
日本勢の1回戦の相手を見ると
欧米か?南米か?となっているようで、
正直、いきなり壊滅状態ということはないと思うけど。
2007年04月13日
2007年04月06日
2007年04月01日
2007年03月28日
2007年03月24日
毎秒の評価局面数
先日、将棋プログラムがトッププロと対局した試合が大きく報じられていましたが、記事にはその試合のために400万局面/秒を先読みするように改良してきたとあり、改良前でも80万局面/秒を読んでいたとのこと。
それで、自作のプログラムではどうだろうか?と考えてみたのですが、
前回のブログの三路盤MinMaxでは、3万局面/秒ほどだったので、かなり遅いです。
マイPCはceleron 2.66GHzなので、最新CPUより数倍遅いかもしれませんが、評価関数の計算時間が極わずか、なのにです。
いきなりC++の話ですが、
動的配列のvectorクラスが便利で先読みの中で使っていたのですが、これが遅い原因でした。やはり、というかVisual C++に対して、その事を指摘していたホームページを見たことががあったものの、あまり変わらないだろう、と思っていましたが、違いました。先読みルーチンの中でvector配列を使用しないようにすると、1手35秒が、5秒までになりました。
さらに基本的な事っぽいですが、releaseでビルドしたら2秒までなり、結果、約50万局面/秒まで軽くなった。ただ、評価関数をまともに実装しようとすると、すぐ重くなりそうですが。
それで、自作のプログラムではどうだろうか?と考えてみたのですが、
前回のブログの三路盤MinMaxでは、3万局面/秒ほどだったので、かなり遅いです。
マイPCはceleron 2.66GHzなので、最新CPUより数倍遅いかもしれませんが、評価関数の計算時間が極わずか、なのにです。
いきなりC++の話ですが、
動的配列のvectorクラスが便利で先読みの中で使っていたのですが、これが遅い原因でした。やはり、というかVisual C++に対して、その事を指摘していたホームページを見たことががあったものの、あまり変わらないだろう、と思っていましたが、違いました。先読みルーチンの中でvector配列を使用しないようにすると、1手35秒が、5秒までになりました。
さらに基本的な事っぽいですが、releaseでビルドしたら2秒までなり、結果、約50万局面/秒まで軽くなった。ただ、評価関数をまともに実装しようとすると、すぐ重くなりそうですが。
2007年03月20日
三路盤でMinMax
をなんとか実装してみました。
候補手はパスを含めて、着手可能な全ての場所
評価関数は単純に(黒石 - 白石 + アゲ白石 - アゲ黒石)
その他、αΒやハッシュ表などもなく、
全末端ノードの評価値によるMinMax(のつもり)で
初手をどこに打つか、やってみたりしました。
深さ 評価局面 計算時間 着手位置
7 996192 約35s (1 二)
8 4265041 約2m40s (1 二)
9 16787146 約10m30s (2 二)←真ん中
(列がずれてしまう。。。)
と、一応、動いているかも?という感じでした。
探索が深さ7で、真ん中に打ってこなかったが、
上の評価関数では、机上で考えた限りでも
初手が(1 二)と(2 二)で評価値に差がでないかもしれず。
動作に、半信半疑なところもありますが、気になっていた
move/undoで暴走することは、今のところなかった。
深さ7で、COM(1 二),MAN(2 二)の後の下の局面で

どちらかハネる思っていて、赤い所へ打ってきたので
少し驚いた。ハネると、隅に打たれてコウがらみでややこしい。
三路盤も考え出すと、はまりこみそうな気がした。
候補手はパスを含めて、着手可能な全ての場所
評価関数は単純に(黒石 - 白石 + アゲ白石 - アゲ黒石)
その他、αΒやハッシュ表などもなく、
全末端ノードの評価値によるMinMax(のつもり)で
初手をどこに打つか、やってみたりしました。
深さ 評価局面 計算時間 着手位置
7 996192 約35s (1 二)
8 4265041 約2m40s (1 二)
9 16787146 約10m30s (2 二)←真ん中
(列がずれてしまう。。。)
と、一応、動いているかも?という感じでした。
探索が深さ7で、真ん中に打ってこなかったが、
上の評価関数では、机上で考えた限りでも
初手が(1 二)と(2 二)で評価値に差がでないかもしれず。
動作に、半信半疑なところもありますが、気になっていた
move/undoで暴走することは、今のところなかった。
深さ7で、COM(1 二),MAN(2 二)の後の下の局面で
どちらかハネる思っていて、赤い所へ打ってきたので
少し驚いた。ハネると、隅に打たれてコウがらみでややこしい。
三路盤も考え出すと、はまりこみそうな気がした。
2007年03月16日
2007年03月12日
move/undo
を、どう実装するかが悩みの種の一つだったりしました。
先読みの中で幾度となく呼ばれるので、
いかにして軽くできるかと。
struct {
int bs[BSIZE];
int ws[BSIZE];
}
の構造体を一手ごとに全コピーを
最初に考えていたのですが、やはりでかすぎ。
チェスではxorで簡単にできるような書き込みを見て、
囲碁ではどうか、と考えていたら、
単に打石とアゲ石を配列にpushしていけばいいことに気づく。
戻すときはpopして現盤面とxorすればいいだけでした。
前回、話題にしたブログが2chのスレに貼り付けられたりして
ここを見た方がした、ということもないと思うのですが
少なくとも、私はしておりませんので(笑)。
先読みの中で幾度となく呼ばれるので、
いかにして軽くできるかと。
struct {
int bs[BSIZE];
int ws[BSIZE];
}
の構造体を一手ごとに全コピーを
最初に考えていたのですが、やはりでかすぎ。
チェスではxorで簡単にできるような書き込みを見て、
囲碁ではどうか、と考えていたら、
単に打石とアゲ石を配列にpushしていけばいいことに気づく。
戻すときはpopして現盤面とxorすればいいだけでした。
前回、話題にしたブログが2chのスレに貼り付けられたりして
ここを見た方がした、ということもないと思うのですが
少なくとも、私はしておりませんので(笑)。
2007年03月08日
ビット演算
数日前、ビット演算を調べ回っていたら
コンピュータ将棋で有名なY氏の本家ページとは別の
「FPGAで将棋プログラムを作ってみるブログ」
なるブログを見つけた。
そこで、モンテカルロ法の囲碁プログラムが手強いことを知る。
今までも、名前は目にしていたけど、???という感じだった。
2chの囲碁ソフトスレでも話題になってるけど、
MoGoってのが現在進行形で強くなってるようで
時代はモンテカルロ法、という感じがしてきた。
話は戻りますが、上記のブログで参考にされていて、
アマゾンでも高評価だったので
「ハッカーのたのしみ」(Hacker's Delight)
をアマゾンで注文してしまいました。
それで、今日、届きました。名前はアレですが、
ビット演算や数式による説明が多々ある真面目な本。
と、まとまりがないですが、
先読みのルーチンにどう手をつけたらいいものか思案中。。。
コンピュータ将棋で有名なY氏の本家ページとは別の
「FPGAで将棋プログラムを作ってみるブログ」
なるブログを見つけた。
そこで、モンテカルロ法の囲碁プログラムが手強いことを知る。
今までも、名前は目にしていたけど、???という感じだった。
2chの囲碁ソフトスレでも話題になってるけど、
MoGoってのが現在進行形で強くなってるようで
時代はモンテカルロ法、という感じがしてきた。
話は戻りますが、上記のブログで参考にされていて、
アマゾンでも高評価だったので
「ハッカーのたのしみ」(Hacker's Delight)
をアマゾンで注文してしまいました。
それで、今日、届きました。名前はアレですが、
ビット演算や数式による説明が多々ある真面目な本。
と、まとまりがないですが、
先読みのルーチンにどう手をつけたらいいものか思案中。。。
2007年03月05日
ハッシュ2
ハッシュによる同一局面チェックをしばらく考えてましたが
αΒ検索などの先読みで生じる場合に、
探索を効率化するのが主な使い方と思われる。
そのことをもあって、ハッシュについて調べてましたが、
コウを禁止着手としてはじくチェックとしては、
単に2手前の局面との比較でよかったみたいだ。
他の同一局面は3手以上進むし。
パスも考慮してアゲ石数の比較もするとして。
そうは思ったのですが、一応、ハッシュ関数は超単純に
int bs[BSIZE]; int ws[BSIZE];
を全部足して、% HASHSIZE したキー値の配列に手数を代入。
衝突は+1の場所に代入、としてハッシュ表を使うようにした。
これでもチェックになっていると思うが
最終的には局面データ同士の比較が必要なので、
コウチェックのみなら2手前の単純比較で十分っぽい。
とりあえず、石をとる、コウチェックで
一人二役だけど碁が打てるという状況になった。
αΒ検索などの先読みで生じる場合に、
探索を効率化するのが主な使い方と思われる。
そのことをもあって、ハッシュについて調べてましたが、
コウを禁止着手としてはじくチェックとしては、
単に2手前の局面との比較でよかったみたいだ。
他の同一局面は3手以上進むし。
パスも考慮してアゲ石数の比較もするとして。
そうは思ったのですが、一応、ハッシュ関数は超単純に
int bs[BSIZE]; int ws[BSIZE];
を全部足して、% HASHSIZE したキー値の配列に手数を代入。
衝突は+1の場所に代入、としてハッシュ表を使うようにした。
これでもチェックになっていると思うが
最終的には局面データ同士の比較が必要なので、
コウチェックのみなら2手前の単純比較で十分っぽい。
とりあえず、石をとる、コウチェックで
一人二役だけど碁が打てるという状況になった。


