2006 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 12 |
2008 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 03 | 04 | 05 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 12 |
2008 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 03 | 04 | 05 |
2011-11-13
■[将棋] 疑似乱数を利用したdf-pn探索の簡易分散並列計算

GPWで見た保木さんの発表がお手軽で面白そうだったのでやってみました。
要はdf-pnにちょろっと乱数を加えた複数のクライアントがそれぞれ探索してみて、一番早く結果が返ってきたのを採用、という感じです。
C#版のBlunderでの実装は、↓こんな感じになりました。
とりあえずテーブルを用意しまして、、
[Blunder/SearchMate/AndOrTree.cs]
public struct RandEntry { public int P, D; }
/// <summary>
/// 乱数テーブル
/// </summary>
/// <remarks>
/// 疑似乱数を利用したdf-pn探索の簡易分散並列計算
/// https://ipsj.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=78266&item_no=1&page_id=13&block_id=8
/// </remarks>
public RandEntry[] RandTable = new RandEntry[1024];
新規節点で固定深さ探索をした結果のp, dに対して、ハッシュ値で表を引いてpかdを1bitシフトする感じに。
[Blunder/SearchMate/AndOrTree.FDS.cs]
// 乱数を加算
if (minD < Infinity) {
var t = RandTable[context.HistoricalHashValue & 1023];
p <<= t.P;
d <<= t.D;
}
乱数テーブルを埋めるところは↓こんな感じです。
for (int j = 0; j < randTable.Length; j++) {
uint rand1024 = rand.NextUInt() & 1023;
if (rand1024 <= 50) { // 5%くらいの確率でP=1, D=0
randTable[j].P = 1;
} else if (rand1024 <= 100) { // もう5%くらいの確率でP=0, D=1
randTable[j].D = 1;
} else {
// P=0, D=0 (乱数無し)
}
}
そしてコレをコア数分だけスレッド作って実行する処理をUSIEngine.csのgo mateのところに実装して、将棋所の「詰」ボタンで動くようにしてみました。
そして6コアで6並列で、そのうち1個は乱数無しにしていて、それ(オリジナル)と、6並列のうち1番早く答えが出たもの(最小)について、節点数と実時間を出力するようにしてみまして、試しに将棋図巧の1〜20番を解かせてみたところ、こんな感じに。
| 作品 | オリジナル節点数 | 最小節点数 | 節点数比 | オリジナル時間[ms] | 最小時間[ms] | 時間比 |
|---|---|---|---|---|---|---|
| 図巧2番 | 3,495 | 2,785 | 79% | 128 | 125 | 97% |
| 図巧3番 | 125,263 | 114,764 | 91% | 743 | 701 | 94% |
| 図巧5番 | 1,927 | 1,803 | 93% | 141 | 141 | 100% |
| 図巧7番 | 48,471 | 32,270 | 66% | 363 | 284 | 78% |
| 図巧9番 | 481,022 | 344,847 | 71% | 2,632 | 1,928 | 73% |
| 図巧10番 | 62,829 | 46,371 | 73% | 406 | 326 | 80% |
| 図巧11番 | 1,380 | 1,357 | 98% | 129 | 129 | 100% |
| 図巧12番 | 76,234 | 68,895 | 90% | 545 | 509 | 93% |
| 図巧13番 | 1,916 | 1,860 | 97% | 118 | 118 | 100% |
| 図巧14番 | 1,407,607 | 22,285 | 1% | 8,155 | 240 | 2% |
| 図巧15番 | 34,623 | 33,519 | 96% | 320 | 293 | 91% |
| 図巧16番 | 14,945 | 13,850 | 92% | 188 | 184 | 97% |
| 図巧17番 | 2,429,611 | 2,028,487 | 83% | 17,959 | 14,757 | 82% |
| 図巧18番 | 5,468 | 4,378 | 80% | 153 | 151 | 98% |
| 図巧19番 | 216,129 | 198,815 | 91% | 1,445 | 1,342 | 92% |
| 図巧20番 | 2,544,932 | 1,801,718 | 70% | 20,920 | 13,483 | 64% |
1,4,6,8は解けそうになかったので諦めました。_no
そして14番が凄い事になってますが、乱数の種を固定していなかったので再現性のないデータになってしまいました。(まぁ、オリジナルが回り道しすぎているだけの気もしますが)
最後に、無駄にフルセットな実行ファイル・ソース一式はこちらに。
トラックバック - http://d.hatena.ne.jp/ak11/20111113

リソースがふんだんにあればよさそう?
ところで今回はC#版ですが、C++版はさらに3倍以上速いとか?!
C++版はまだdf-pnまでは出来てないです。_no
気のせいですかね?
ある局面で検討させると、検討ボタンを押す度に解答が変更になったり?
2010と連続対局させてると評価値が似たようなグラフになる時と、全く違った形になったり?4・5種類の癖が有るように思うのですが…
もしかして、指し手がタンパクになったりするのは、コレが影響してるのでしょうか?
アルゴリズムを指定しても、固定しきれてないような?
あと並列探索をしている場合も、タイミングによって読み筋が変わる場合があります。
並列探索なし(スレッド数1)で時間無制限の検討でなら毎回同じ読み筋になると思います。…バグってなければ。