トップページ > 囲碁・オセロ > 2014年10月30日 > ERiENK+1

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

34 位/222 ID中時間01234567891011121314151617181920212223Total
書き込み数0400000000000000000000004



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

書き込みレス一覧

コンピュータオセロ総合スレッド
962 :名無し名人[]:2014/10/30(木) 01:05:37.96 ID:ERiENK+1
>>958

>最終一手のところではof2を使ってるけど、omではof2ではなくofを使うように変えてある
>sh1のところもofでやるようにしてもほとんど変らないはず
そうですか。
>>951に書いた自分の仮説(of2が速度差の原因)は棄却されましたね。
つまり、自分のプログラムと比べて>>907がof2により劇的に高速化しているのではなく、
自分のプログラムがどこかでヘマをしていると考えた方が良さそうです。
コンピュータオセロ総合スレッド
963 :名無し名人[]:2014/10/30(木) 01:35:52.88 ID:ERiENK+1
>>959

調査していただいたようでありがとうございます。
movablePositionsとorderの部分に時間がかかっているということで、
まずはプリミティブな処理であるorderの部分を自分でも調べてみました。

>>960はEnumerable.Rangeを使ったものと使わないものの比較で、
ループ処理の速度と配列の生成の速度を調べたものになります。
自分の環境でのリリースビルドでの実行結果は以下になりました。

673
31
1317
168

とんでもない違いw
ループ処理で20倍、配列生成で10倍ほど違いますね。

C#勉強し始めてEnumerable.Rangeはすっきり書けて便利だな〜
と思って使ってたんですが、何回も呼ばれるメソッドで利用するのは
避けた方が良さそうです。

この辺が可読性と高速性のトレードオフというか、
プログラマが意識して選択しなければならないところですね。

int[] array4 = new int[n];
for (int i = 0; i < n; i++)
{
array4[i] = i;
}

よりも

int[] array3 = Enumerable.Range(0, n).ToArray();

の方が可読性は高いが高速性は低いということで。
少量しか呼ばれないところはそのまま残して(可読性重視)
多量に呼ばれるところ、少なくとも1億回呼ばれる探索メソッドでは
高速性重視でこれから変更しようと思います。
コンピュータオセロ総合スレッド
964 :名無し名人[]:2014/10/30(木) 01:37:21.98 ID:ERiENK+1
int n = 100000000;
Stopwatch sw1 = new Stopwatch();
Stopwatch sw2 = new Stopwatch();
Stopwatch sw3 = new Stopwatch();
Stopwatch sw4 = new Stopwatch();

sw1.Start();
IEnumerable<int> order = Enumerable.Range(0, n);
foreach (int i in order)
{
}
sw1.Stop();

Console.WriteLine(sw1.ElapsedMilliseconds);

sw2.Start();
for (int i = 0; i < n; i++)
{
}
sw2.Stop();
Console.WriteLine(sw2.ElapsedMilliseconds);

sw3.Start();
int[] array3 = Enumerable.Range(0, n).ToArray();
sw3.Stop();
Console.WriteLine(sw3.ElapsedMilliseconds);

sw4.Start();
int[] array4 = new int[n];
for (int i = 0; i < n; i++)
{
array4[i] = i;
}
sw4.Stop();
Console.WriteLine(sw4.ElapsedMilliseconds);
コンピュータオセロ総合スレッド
965 :名無し名人[]:2014/10/30(木) 01:59:29.00 ID:ERiENK+1
次に、movablePositionsについてです。

>Listを止めてint[]にするだけでかなり速度改善すると思われます。
これについてはC#のListは通常のリストではないんですね。
配列は参照がO(1)で編集がO(n)
リストは参照がO(n)で編集がO(1)
ですが、C#のリストは配列をベースにしているようなんです。
なので、最初に確保する領域を適切に設定すれば
Listもint[]もほとんど変わらないと思います。

でも、movablePositionsが重いというのは事実なわけで、
なんとかしたいわけなんですが、そもそもこの
movablePositions(着手可能位置)を返すようなメソッドって
みなさんは用意してるんですかね?
ちょっと思ったのが、
少なくとも探索時にはアルファベータでカットが発生することを考えると、
最初にmovablePositionsを用意しておくんじゃなくて、
次の着手可能位置はどこ?と言われたときに初めて計算する、
という風にした方がいいのかなぁと・・・。


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