- コンピュータオセロ総合スレッド
950 :名無し名人[]:2014/10/28(火) 00:10:18.47 ID:GrgAM4vG - >>929です。
>>946 ソース見ていただいたようでありがとうございます。 たしかに>>929には置換表、オーダリング、事前探索はありません。 これらは現在取り組んでいて改善の兆しが見えつつあるんですが、 >>948が言うように>>929の意図は>>907が30秒なのに対して >>929が300秒かかるのは何が原因か?ということでした。 >>907は置換表も事前探索もしていませんが、 オーダリングは動的ではないですが静的(テーブル参照)はしていて、 これが原因か?と思ったんですが、このテーブルを static el_t el[64] = { { 11 }, { 12 }, { 13 }, …, { 86 }, { 87 }, { 88 } }; として実行しなおしてみても、速度は変わらず30秒ぐらいだったんですね。 次に試したことが、位置ごとに探索すべき方向が必要最低限に設定されていて、 これが原因か?と思ったんですが、このテーブルを static const int of[89][9] = { { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, F0, F0, F1, F4, F4, F4, F4, F4, { 0 }, { 0 }, F0, F4, F4, F4, F4, F4, F4, F4, { 0 }, { 0 }, F4, F4, F4, F4, F4, F4, F4, F4, { 0 }, { 0 }, F4, F4, F4, { 0 }, { 0 }, F4, F4, F4, { 0 }, { 0 }, F4, F4, F4, { 0 }, { 0 }, F4, F4, F4, { 0 }, { 0 }, F3, F4, F4, F4, F4, F4, F4, F4, { 0 }, { 0 }, F6, F4, F4, F4, F4, F4, F4, F4, { 0 }, { 0 }, F6, F4, F4, F4, F4, F4, F4, F8, }; のようになるべくF4(最大限の8方向)を増やしてみても、速度は変わらず。 (全部F4に変更するとなぜか結果がおかしくなったので、 結果が変わらないようにF4に置き換えていった)
| - コンピュータオセロ総合スレッド
951 :名無し名人[]:2014/10/28(火) 00:13:21.86 ID:GrgAM4vG - 次に試したことが、最後の一手が展開されていたので、
これが原因か?と思ったんですが、sh関数内の if (l > 2) v = sh(-p, l - 1, -x, -n, -(i * 2 + d + 1), 1); else v = sh1(eh.s->c, -p, i * 2 + d + 1, n, x); の部分を if (l > -100) v = sh(-p, l - 1, -x, -n, -(i * 2 + d + 1), 1); else v = sh1(eh.s->c, -p, i * 2 + d + 1, n, x); にして最終一手展開が行われないようにしたのですが、速度は変わらず。 んで最終的に、自分の中で速度差の原因はこれじゃないかなと思うのは static int *of2[89][9][8]; という結論に至ったんですね。 これは実際に探索するマスをポインタで構築したものです。 これを自分のプログラムに実装することは無理そうだったんで試してないですが、 これまで述べたように色々な機能をオン・オフして試した結果、 消去法的にこれが原因じゃないかなと。
| - コンピュータオセロ総合スレッド
952 :名無し名人[]:2014/10/28(火) 00:15:33.66 ID:GrgAM4vG - >自分のプログラムはFFO#40が240秒くらいだったのを
>2秒くらいまで縮めましたので、アドバイスは色々できると思います〜 素晴らしいですね。 ちなみに240秒のプログラムは機能的には置換表、オーダリング、事前探索なしの >>929と同じような感じですか? だとすると300秒の>>929も頑張れば数秒になるということなので希望が持てます。 >探索ノード数を出してもらえるとさらに分かりやすいですね。 >>907も>>929もどちらも探索ノード数は出てきますよ。 正確にはノード数ではなくてリーフ数ですが、 どちらも約1.13億リーフになってますね。 >>949の画像みるとnode:24587268となってますが、これはリーフ数ですか? いずれにせよムーブオーダリングで一桁減少できてるみたいですね。 ちなみにムーブオーダリングに利用してる評価関数は 棋譜から学習させた関数ですか?それとも古典的な関数ですか? あと一手読みですか?
| - コンピュータオセロ総合スレッド
953 :名無し名人[]:2014/10/28(火) 00:17:51.31 ID:GrgAM4vG - >>907を実行した結果:
O - - O O O O # - O O O O O O # O O # # O O O # O O # O O O # # O O O O O O # # - - - O O O O # - - - - O - - # - - - - - - - - start = 110 end = 28220 time = 28.110000 21 38 113120511
| - コンピュータオセロ総合スレッド
954 :名無し名人[]:2014/10/28(火) 00:18:57.21 ID:GrgAM4vG - >>929を実行した結果(>>929に付属のoutput.txt):
○・・○○○○● ・○○○○○○● ○○●●○○○● ○○●○○○●● ○○○○○○●● ・・・○○○○● ・・・・○・・● ・・・・・・・・ Black = 12 White = 32 Empty = 20 2014/09/28 2:47:05 movablePositions = { (0, 1) (0, 2) (1, 0) (5, 0) (5, 2) (6, 2) (6, 3) (6, 5) (6, 6) (7, 3) } order = { 0 1 2 3 4 5 6 7 8 9 } value[0] = 30 value[1] = 30 value[2] = 38 value[3] = 38 value[4] = 38 value[5] = 38 value[6] = 38 value[7] = 38 value[8] = 38 value[9] = 38 value = { 30 30 38 38 38 38 38 38 38 38 } evaluation = 113304014 2014/09/28 2:52:23 position = (1, 0)
| - コンピュータオセロ総合スレッド
957 :名無し名人[]:2014/10/28(火) 03:20:22.97 ID:GrgAM4vG - >>955
>これはあんまり関係ないかもしれない >これでもほとんど変らないはず ほとんど変わりませんでした。 この新しいプログラムは static int *of2[89][9][8]; を使わないようにしたプログラムかな?と思ったんですが、 使用されてますよね?これは何を変更したプログラムですか? >CanMoveとかを局面毎に毎回呼んでるなら、そこらへんが冗長な計算な気がする 局面がパスのときにはそれが終局なのかを判定するためにCanMoveを呼びますが、 パスでないとき呼びません。 なので、毎回呼んでいるということではないですね。 >C++もC#も共通言語基盤とからしいからこれは意味ないのかな 基本的にポインタ以外は同程度の性能が出るはずだ、と思ってます。 ちなみに僕のC#のプログラム内でunsafeを利用してポインタを試してみましたが、 速度はあまり変わりませんでした。 どこかに10倍の差を発生させる決定的な違いがあるはずなんですが・・・。 >プロファイラー使えるならそれ使うのが一番早いような プロファイラーは既に使ってます。 時間かかってるところから優先的に改良して、できる限りのことはやりましたが、 >>929の5分が4分になった程度で、プロファイラ使っても原因はわかっていません。
|
|