トップページ > 囲碁・オセロ > 2014年10月28日 > GrgAM4vG

書き込み順位&時間帯一覧

8 位/163 ID中時間01234567891011121314151617181920212223Total
書き込み数5001000000000000000000006



使用した名前一覧書き込んだスレッド一覧
名無し名人
コンピュータオセロ総合スレッド

書き込みレス一覧

コンピュータオセロ総合スレッド
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分になった程度で、プロファイラ使っても原因はわかっていません。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。