【オセロ,将棋】ボードゲーム【囲碁,War】 at GAMEDEV
[2ch|▼Menu]
[前50を表示]
300:名前は開発中のものです。
13/07/02 NY:AN:NY.AN bfbryvu1.net
FFみたいなアクティブタイムバトル(ATB)制とか、
タクティクス・オウガみたいなウエイトターン(WT)制は?

301:名前は開発中のものです。
13/07/03 NY:AN:NY.AN wkoZZDOw.net
ハンターハンターの軍棋をゲーム化するとかね。
つうか軍棋って同じ名前で実在するんだな。日本にも軍人将棋ってのがあるが。
ここで色々案も挙がってるが、すでにPCもない時代からこういう考えはあったわけだ。

302:名前は開発中のものです。
13/07/07 NY:AN:NY.AN 1jzG+TM2.net
軍蟻は良いかも!
著作権が難しいが・・・

軍人将棋はバリエーションとローカルルールがありすぎて対応が大変
ZoGにも欲しいな
西洋軍人将棋(ストラテゴ)は、PCでも割と見かけるが

303:名前は開発中のものです。
13/07/07 NY:AN:NY.AN 0lzHS3C/.net
ハンターのあれってちゃっとルール公開されてたの?
コマが3つまで重ねられるって事しか解んないわw

304:名前は開発中のものです。
13/07/07 NY:AN:NY.AN lXyODQZR.net
ルールなんて自分でこさえちゃえばいいよ。
コマを重ねるってのは、要するに馬にのせたり方天画戟といった装備だったり
名声や決意・覚悟といった精神的なものの加点要素なんじゃないのか?
あるいは倒れた仲間を回収して回復ポイントまで運べるとか。逆に補給物資を運んでいるか。

将棋やチェスなら、味方のコマと重なると2倍の能力になり、一回とられても相打ちで敵も倒せて、自分はそこに残れる、的なシステム。

305:名前は開発中のものです。
13/07/07 NY:AN:NY.AN tapz/Poj.net
作りたい奴はすでに作り始めてたりする

ハンターハンターに出てきた架空のゲーム「軍儀」
スレリンク(cgame板)l50

306:名前は開発中のものです。
13/07/08 NY:AN:NY.AN VxgBNd3t.net
なるほど、高さ=三次元的なゲームだったのか。
二段や三段のコマは一段のコマには抜けれず壁の役割になれる。
壁構築で地形みたいな要素にもなる感じかな?

307:名前は開発中のものです。
13/07/09 NY:AN:NY.AN PWW1vFJn.net
高さを考慮したSLGといえば、タクティクスオウガ系のゲーム画面(盤面)になりそう・・・

308:名前は開発中のものです。
13/08/03 NY:AN:NY.AN gVJOFEFN.net
age

309:名前は開発中のものです。
14/09/08 16:59:53.68 67y2qr+m.net
教京サーバアビエ無戸籍交際薬剤消毒介護職利権ローション羽田帝国上層部24時間パトロール義務上野飲み会マックさむらいニューヨーク森林火災チェック問題ヤーフォー確定申告不足ラーメンスーパーポイントdビデオデッキ破壊タイピングGTX860MIGOZ

教京サーバアビエ無戸籍交際薬剤消毒介護職利権ローション羽田帝国上層部24時間パトロール義務上野飲み会マックさむらいニューヨーク森林火災グリーにんにく牡丹黒家宝ラーメン

教京サーバアビエ無戸籍交際薬剤消毒介護職利権ローション羽田帝国上昇部24時間パトロール義務セコム強盗マックさむらいニューヨーク森林火災グリーにんにく牡丹黒家宝ラーメン
築地TPP偏食中国人勧誘マナー憤怒北京オリンピックパブ立橋フロアWHO経済制裁代協議会飲み食い代官僚日テレ漏洩ボーリングITC問題調査福岡駐車近代道廃人画税幕張銀行ググール無断決裁広告料寒孫ゼリー失調栄養士指的フィルム不毛ハンバーグースラーメン

糞箱弐個弐個沖縄ランド近年ペット原発難民船頭100万円コミックコラムシフト廃品鉄工業プラチナ小スモ再販問題WHO光金アナ雪エネルギーソーシャル決裁ニッカン奮闘鬼記者サービスカ米ラマン露店捜査キセルストアアイダホ会長農家不動産工場感激息子

310:名前は開発中のものです。
15/08/18 16:59:55.72 QcCJSSMl.net
どなたか教えていただけますか?
最近、オセロAIのプログラミングをCで行っています。
今は、探索ロジックの勉強のため、終盤の完全読みを作っています。
置換表付negaMax、置換表付PVSは通常の探索ではきちんと動作しています。
現在MTD(f)にとりかかりました。MTD(f)では、ドライバは擬似コードそのまま。
テスト関数は置換表付negaMaxを流用していますが、そのままだとFail-LowとminMax値
の区別がつかずに、Fail-Lowの指し手を返してしまうので、初段のみαを-1する事で、
内部的に区別できるようにしています。
動作確認にいくつかテストケースでテストしましたが、FFO#40の時におかしな事がおきます。
(FFO:URLリンク(www.radagast.se)
問題)本来の評価値は+38(A2B1C1…)なのに、+30が返る。
以下、判明している状況です。
1)置換表を使用せずにMTD(f)を動作させる。 −>正解
2)単体でNull Window Searchを行う。      −>正解
3)置換表を使用してMTD(f)を動作させる。   −>少なくともFFO#40では誤答する
4)FFO#40で失敗する条件は、fにminMAX値より幾分小さい値(黒+30未満)を設定したとき。
5)negaMax初段でαを-1するロジックを入れなくても、同じ事になります。
デバッグで確認したところ、Fail-Highになるべき条件(黒+30や黒+36の時)で、下限値を
返しています。同一条件で、下限をさらに-1してテストしたところ、α<g<βである事が確認
できましたので、minMax値として間違った値が返っていることになります。
どうも原因は置換表にあり、Null Window Searchの中で、何回も再利用していることに
あるように思います。とはいえ、MTD(f)といえば置換法を再利用する事が前提です。
どこかに誤りがあるのではないかと思います。
同じような問題に遭遇した人はいますか?

311:310
15/08/18 17:06:51.32 QcCJSSMl.net
ちなみに、置換表のキーは、盤面と手番です。
ハッシュ値を使用し、衝突した場合は、チェーンで下につなげています。
今のところ、メモリーの上限等は設定しておらず、領域も足りています。

312:名前は開発中のものです。
15/08/18 21:27:38.25 ZHAQ4NnD.net
正気か?

313:310
15/08/18 23:21:46.36 5wjtKO2B.net
何がですか?

314:名前は開発中のものです。
15/08/18 23:27:30.51 ZHAQ4NnD.net
その質問に答えられる人間が2chにいると?

315:310
15/08/19 09:33:45.34 DdofkXsp.net
いなければ仕方ないですね。
テスト関数を置換表付negascoutにしたら、ちゃんと答えが返ってくるようになりました。
けど、なんか気持ち悪い。置換表の扱い方は一緒なので、たまたま上手く行ってるだけ
ではないかと思います。むむむ。
MTD(f)にこだわり続けてもあんまり意味が無いので、評価関数づくりに入ります。
3層パーセプトロン型にするか、普通の線形回帰にするか。
パーセプトロンタイプは、パターン学習のタイプを作ってみましたが、学習データ340万
棋譜に対して、1回回すのに3日がかりという状態で、検証サイクルが回しづらい状況な
ので、簡略化をするか、線形回帰を試すか思案中です。最終的には、両方作って対戦
させてみるかと思っています。いつになる事やら。

316:310
15/08/24 09:51:00.08 Y8Lk5h3w.net
BITBOARDで確定石をそこそこ正確に求める方法を考えました。
思いっきり脱線中w
ただ、斜め方向に「列すべてに石が置かれている」状態を検出する方法と、
その時に、斜め方向の列すべてに確定ビット(仮)を建てる良い方法が見つ
からずに、斜め方向のAND用の定数配列を用意してループを15回回してる。
縦横は、分割統治でそこそこなロジックになったんだけど。
45度回転を使っても、そんなに高速化できそうにないなぁ。
もちろん、完璧な確定石ではありません。
拾った石は確実に確定石ですが、確定石なのに拾えない石が若干あります。

317:310
15/09/02 11:43:34.50 s0BtWfox.net
ぬぬぬ。パターンによる線形回帰の石差予想。
最急降下法は収束してるんだけど平均2乗誤差が480とかになる。
1σでいうと1局面あたり22石(黒石の数では11石)もの誤差。
これでは使い物にならない。
ステージ分割しているんだけど、ステージが進んでも誤差はほぼ一緒。
ウェイトがオールゼロでも似たような数字になるレベル。
テストデータで局面評価させると、それなりに石差は計算しているっぽいが、
最善手で終局まで打ったデータ入れるとステージによって評価値が全く違う。
初期値をゼロからスタートすると、この辺なんだけど、1とかからスタートすると
もっと誤差が大きいところで収束してしまう。初期値を乱数にしたら、更に大きな
誤差で収束してしまう。
ローカルミニマムに捕まってるのかなぁ。
いくつかミスは見つけたけど、本質的な場所じゃないので、結果も変わらず。
むむむむ。

318:名前は開発中のものです。
15/09/02 16:33:21.80 6FNrQBf/.net
正規化をミスってる

319:310
15/09/02 21:57:59.44 5gNGVEfH.net
正規化というと、thellさんのlearning.pdfで言うところの、αの設定ですか?
当初はmin(β/100,β/Nj)の正規化型で作ってましたが、上手くいかないので
収束を早めるのは後回にして、今は単純にステージ毎の局面データ件数α=β/Nの
形にしてます。
が、発散を避けようとすると、βをあまりに小さくしなければならないのが、なんか変な
気がしています。今は10の-7〜-8乗くらいの値です。やっぱり変ですよね。
最急降下法のコードどこか間違えてるんだろうなぁ。

320:名前は開発中のものです。
15/09/03 04:25:48.28 CNXgxM7O.net
でもオセロだったら最終数手で11石くらいひっくり返ってぶれるのは普通じゃない?

321:名前は開発中のものです。
15/09/03 04:36:35.33 CNXgxM7O.net
あ、オセロのAIにはぜんぜん詳しくないんだけど
対局を見てたらクルクル石差が入れ替わるので
読み切らずに局面から石差を判断すると
どうなるんかなと思って

322:310
15/09/03 10:19:29.05 Fd8XT4rV.net
色々と失礼しました。
もう一度、よーく上記pdfを読み返していたところ、原因らしきものが見つかりました。
記載にあいまいというか、ちょっとおかしいところがあって、式の変形をしっかり追って
確認すれば良かったのですが、思い込みで解釈をして変な計算をしていました。
そこをとりあえずざっと修正したところ、遅々としつつも収束に向かっている模様ですが、
まだまだ完全ではないようです。ある程度二乗誤差が減ったところで、また増え始めたり
しています。正規化も試したけど、やはり同じ。
もう少し、検討してみます。

323:310
15/09/03 10:38:17.33 Fd8XT4rV.net
>>320
もともとひっくり返しあった後の終局を予測するのが目的なので、教師データは最終局面
の石差です。盤面の特徴(パターン)から、最終石差を予想するための重回帰計算なので、
その時点の石数は、説明変数に入れてません。なので、パターンの選択が適切なら、
最善手の応酬において1手毎にどれだけ石数が入れ替わろうと、影響を受けずに、
二乗誤差が終局に近づくほど減っていくと予想されます。
というか、そうなるように説明変数であるところのパターンを模索していくと理解しています。
手元にあるwzebraなんかは、評価値と称して最終石差予想が表示されているのですが、
やはり、ある程度の誤差を含みつつも、大きくぶれているようには見えません。

評価関数の使い道を考えると、実は絶対値はそれほど重要ではありません。
中盤探索のn手読みの時の盤面評価と、ムーブオーダリングに使うので、ある局面から
派生したn手先の局面における相対的な関係が保たれていればOKです。
また、MTD(f)法などを使う時の、fの初期値設定にも使います。この時は絶対値で正確な
方が良いはずですが、外れはすぐにカットされて次に行くので、トータルの時間に対する
影響は小さいように感じます。
とはいえ、相対的な関係が保たれているのかをチェックするのは難しいですから、
結局のところ出来上がった評価関数の評価は、教師データとの二乗誤差の小ささに
するしかないかなと。

324:310
15/09/07 01:11:39.28 OHPpdG+6.net
収束しかかった二乗誤差がまた増え始める原因はまだわかりません。
増え始めるまでは収束方向には向かっているのは確かなのでβの初期設定を
いって誤魔化す方向で。最急降下法ってこんなものなのかなぁ。
一通り納得したので、パターンをLogistelloと同一のものにまで拡充してスムージングも
入れてみましたが、新たなバグを仕込んでしまった模様で、一部計算がぐちゃぐちゃorz
バグ探しの旅に出ます。
裏で、Solverの速度アップを検討。
CountBitとPOPCountを組み込み関数にしてみました。FFO#40で30%ほど改善。
続いてFlip関数を64個のポインタ関数にしてみましたが、時間はほぼ変わらず。
ポインタ関数内の処理が非効率なのか。
Flipのデバッグ中に確定石計算でバグっぽいものを見つけましたが、回帰が落ち着く
まで見なかった事にします。

325:名前は開発中のものです。
15/09/10 17:45:51.81 R9JX9LJx.net
将棋の全駒にユニークなIDを振り、局面を将棋盤に見立てたkoma[9,9]にIDを入れることで表現しようと思っています
その場合、駒のIDから座標を取得するいい方法ってないんでしょうか?
IF文、Case文のオンパレードになってしまうのは仕方ないのでしょうか・・・・
言語C#

326:名前は開発中のものです。
15/09/13 16:22:10.24 5eWB08IT.net
駒側にも座標を持っちゃえば?

327:310
15/09/14 09:33:29.38 Rx5y2/Cc.net
線形回帰で相変わらず時間食ってます。
一応、バグらしきものはそれなりに解消されましたが、やはりいかんせん収束が遅い。
一晩かけて50〜100試行して、途中で止めてやり直しなんてのやってる間に1週間は
あっという間に経ってしまうものです。まだ誤差が大きい。1000回程度回して、どこまで
収束するか見てみようかなと。またぞろ3層パーセプトロンが気になる今日この頃。
確定石計算もバグ取りはできたと思いますが、その分計算が1.5倍ほどに膨れてしまい
ました。しばらく思考実験していたら、確定石なのに確定していると評価できない確実な
パターンも思いついてしまって、どうせその程度のものなら重い確定石計算しないで普通
に準確定石程度にしとくのが良いかと悩み中。
Solverの速度アップですが、前からやろうと思っていた事を少しづつやっていますが、
統計とってきちんとやっていないので10%くらいの差だと良くわからない状況です。
コードのメンテナンス性が下がるのがネック。negaMAXが思いの他高速化してしまい
ましたが、MTD(f)が低速化しているかも(謎)。
それなりに評価関数が動きだしたので、置換表2枚にして反復深化も試してますが、
信じられないくらい劇遅状態です。これ本当にコストに見合うのかなぁ。評価関数の
計算が、というか、その中の確定石計算が重いんだと思うけど・・・。

328:310
15/09/14 17:35:45.53 Rx5y2/Cc.net
反復深化が劇遅なのは、使い方を誤っていました。
リーフのところまで使うとコストアップなのは考えれば当然でした。
まあ、おバカなバグもありましたが。
negaMaxに対して反復深化を試すと、1割程度の高速化となりましたが、
negaScoutに対してやると多少低速化して、negaMaxの反復深化と変わらない速度に。
scout missが3倍近く増えているので、評価関数の精度があまり良くないためかなと。
move orderには、通常はmobilityとコーナー着手を使用しているのですが、これ、
何故か(少なくともFFO#40に対しては)scout missが恐ろしく少ないのです・・・。
MTD(f)が遅いのも、最初に設定するfを評価関数の値にして、それが結構外れで、
探索範囲が広がったのが原因です。scout missと同様に、結局のところ、途中で評価関数
を求めるタイプの高速化は、評価関数の精度次第という当たり前の結果に。
評価関数入れるとノード探索時間が1/10になるので、やはり評価関数用の確定石計算は
準確定石にレベルダウンしようかと思います。中盤AIでの話ですが。
今FFO#40が9秒台なので、あと3〜5倍高速化したい。

329:名前は開発中のものです。
15/09/14 21:42:06.86 1S1dymvg.net
その情熱がうらやましい

330:310
15/09/15 20:18:36.71 egtjjW0V.net
準確定石の計算って実は思ったよりコストフルかもと気づいてしまい、
急きょコーディングして比較してみる事にしました。
releaseモードだと、自分の計算方法では跡形も残らないため、時間計測不可能。
debugモードでも、数十倍速いと言う結果になりましたので、今の確定石計算ロジック
は、悪いモノではないと自分に言い聞かせる事にしました。
それより、回帰の学習で、少しずつ少しずつ250回くらいまで学習進めていたのですが、
バグを見つけてしまい、またやり直しです。むむむ。しかも、なおした事で計算時間が
2〜3倍になってしまうという。

331:名前は開発中のものです。
15/09/19 00:46:12.58 OgvQcqwn.net
回帰がやっとまともっぽいところまで収束するようになりました。
今、250回学習で、最終ステージが1σ=7.5程度です。
このペースだと、もっと学習させても、たいして変わらない気もしますが、
もう少し学習を進めてみようかと思います。
この評価関数を元に、反復深化+MTDF+negaScoutなsolverを動かして
FFO#40で8秒程度になります。インライン関数化とか、最終2手展開とか
やるべき事はある程度やっちゃったので、自分の力だとこの辺が限度かも。

332:310
15/09/22 22:15:30.40 70n8Fwqa.net
回帰は地道に学習中。もう少しやってみるって感じだけど、収束状態の誤差が大きいのは
ステージ分割でオリジナルな変な事をしているからじゃないかと気になりだした。
あと数百回学習を回したら、通常のステージ分割版も作ってみるかなと。
色々いじってるうちに、FFO#40が6.2秒まで来た。何が良かったのか良くわからない。
反復深化をターゲットに改良しているんだけど、negaScoutも同じ時間。
FFO#41を試したら、反復深化で45秒弱、negaScoutで30秒弱という結果に。
探索ノード数がすごい事になってるので、反復深化のmoveorderのどこかがおかしい
気がしている。

333:310
15/09/25 16:54:56.15 9OkLc3+M.net
回帰のステージ分割というかスムージングを、ネット上でノウハウ公開されてるみなさん
と同じようにしたら、1σで6を切ってきた。やっぱ、スムージングやり過ぎて、精度が
落ちていたのね。同一ステージ内でも値がばらついているので本当に必要なのか、
気になるので、落ち着いたら両方試そうかと。先に方向性見ちゃったから本来とは
逆順になっちゃうけど。
色々頑張ったら、FFO#40が5.1秒、#41が20秒、#42が18秒となりました。
ソースとにらめっこしてれば、ネタはそれなりに出てくるものだなぁと。
しかし、10年前のCPU使ってるThellにようやく勝てた程度。
Zebraの速さは何なんだと。こちらはcore i7だというのに。
目下の悩みは、_mm_popcnt_u64とBitScanFoward64が使えずに、それぞれ32ビット版を
使っている事。外部依存のところで関数の存在は確認しているんだけど、「そんな名前ない」
と出てくる。Cは趣味のAVRで小さいプログラムしか作った事がなかったけど、VC++くらい
巨大になると、どーもよーわからん。

334:310
15/10/04 01:12:59.97 +bDErzEp.net
色々やって、FFO#40でnegaScoutで3.4秒まで来ました。
反復深化は異なる方法で2種類作ってみたけど、FFO#40程度の深さだとnegaScoutとの
差が出てこない。22手とか24手とかまで行くと、差が出てくるように感じるけど、後回し。
どうしても気になって、Zebraのソース解説(日本語)を見つけて、そこに出てるソースを
見ました。自分なりにロジック面で工夫した事はほぼ同じ事をやっている。流石。
あとマクロを多用してる。僕はインライン指定でコンパイラ任せ。
マクロにするとデバッグが極端に大変になるので、マクロ化するのは最後。
そしてaspiration windowと称しているWindowの取り方が独特で、ここに高速化の
秘密があるとみた。早速真似してみると、また>>310のような問題が・・・
今回は前より理解が進んでいたため、2点修正して解消。
副次的に>>310の問題も、直ったと思う。
が、もう一つ答えを間違うケースを見つけてしまった。
今まではルートノードに問題があったけど、こちらはもっと下位ノードで戻り値がコンタミ
してる感じ。デバッグが難しく、重症っぽい。むむむ。

335:310
15/10/07 17:10:37.74 i7/9rua6.net
デバッグで試しに変えた箇所を戻し忘れたりして、二次災害三次災害を出して、
相当混乱したけど、やっぱり境界問題だった。これmoveorderの順によって出ない
可能性もあるので厄介。自分は開き直って、探索の幅に-1つけてるけど、皆さんは
どう回避しているのかなぁ。
zebraのwindowの取り方は、基本的にMTD(f)みたいに置換表利用を前提とした、
固定分割サーチだけど、negaScout(MTD(f)やzebra方式の中で使用している)と
速度的には同等な感じ。最初の探索で勝敗がわかるという点がメリットなのか。
MTD(f)は評価関数が正しくないと、検索時間が伸びる可能性があって、以前から
negaScout単体でも十分な気がしてる。
FFO#40は後述の静的評価関数を判明しているパラメータで最適化すると、
negaMaxで5秒台。negaScoutで3.4秒前後。MTD(f)で2.6秒前後。
ThellさんのHP記載よりは高速化したけど、zebraにはまだ勝てないというか、テストした
FFO#41〜#43ではzebraの高速度合(ノード数の少なさ)が突出している。
ノード削減はmvorder用の静的評価関数に掛かっている。静的評価関数のパラメーター
をいじってるけど、FFO#40最速のパラメータとFFO#43最速のパラメータが違い、#43用は
#43ではノード数を半減できるのに、#40では増えて遅くなってしまう。negaMaxで初段の
評価順見てると、まだまだなので、何か別の発想で並び替えが必要な感じ。
評価関数は1000回くらい回してようやく良い感じになってきたけど、まだ収束しては
いない感じ。学習係数はもっと大胆に大きくしても良かったかな。ここまでやると、
スムージング無しを試すのが億劫になってくる。
反復深化は、ソースのメンテが追い付いていないので、一回破棄。

336:310
15/10/12 23:43:49.17 ZTwsIi7y.net
色々やってるけど、FFO#40では速度向上はほとんどなし。
置換表のサイズが見えて来たので、1件ごとにmallocしていたのを、配列にして一括で
領域確保するように変更(当初の形)したら、速度のバラツキがだいぶ減ったように思う。
NPSが変動すると、何か悪いことしかたと悩んでしまい、修正して二次災害を起こすので
地味に大事かな。
FFO#43は多少高速化してて、パラメータ最適化するとMTD(f)で12秒台くらい。置換表
適用範囲の指定を下(葉)からしていたのを、上(ルート)からに変えた。あと、MTD(f)
などでは何回も置換表を読むので、2回目からはmoveorderに置換表の評価を使うよう
にした。
BITBOARDだと開放度の計算が簡単だという事に気づいて、静的評価関数に使ってみた
けど、現在使用中の次手mobility+αの順序より劣る感じ。+αが角とか×とかなので、
序盤から中盤用なのかなぁ。
negaScoutに加えた修正をnegaMaxに適用していたら、negaMaxがおかしくなった。
直して計測したらFFO#40が40秒程度に。冷静に考えると、これが常識的な速度だと思う。
前回の5秒台がどこから出て来たのか、今となってはわからない。前段の+α箇所も
結構変えていて、negaMaxはmoveorderで露骨にノードが増減するので、奇跡的な順序
が実現できていたのか。それともバグやオペミス勘違いかも。
そろそろ本格的にネタ切れ。この辺が限界かなぁ。
後回しにしていた修正箇所を直して綺麗になったら、中盤に行くかな。

337:310
15/10/14 23:51:46.51 V3YF/mde.net
negaMaxはmoveorderの修正漏れでバグってて、直したらやはりFFO#40で5.4秒でした。
MTD(f)は2.4秒でzebra並になったけど、#41以後は3〜4倍時間がかかる。
その差は探索ノード数に比例してる。前向き枝刈使うわけにはいかないし、#41以降の
差を詰めるにはmoveorderしかないと思う。
とはいえ主だった事は一通り試してしまった。むむむ。
偶数理論で思いついた方法が純粋に面白そうなので組んでみる。
想定では、速度が結構遅くなるはずなんだけど、まあ面白そうという事で。

338:310
15/10/16 10:24:07.38 Q2afyb0d.net
偶数理論の関数は思いのほか軽くできて、オーバーヘッドの心配が少ないです。
BITBOARDの空マスを、囲まれて独立している塊ごとに分離してBITBOARD配列にして
返す関数を作りました。これをPOPCountで数えて着手した場所が偶数空エリアなのか
奇数空エリアなのかを判定します。
最初にテストしたFFO#43のMTD(f)でいきなり30%近く高速化して「やった!」と思った
のもつかの間。実はミスで判定を逆にしてまして、偶数マスに打って奇数を相手に渡すと
加点になってました。で、いろいろテストした結果、最初にやったケースではたまたま
良かっただけみたい。例えばnegaScoutやnegaMaxでテストすると、係数変えたり判定
方法に工夫を加えたりいろいろしてみても、何をやっても探索ノードが増えてしまう。
自分はオセロ弱いので、必勝法みたいに言われているものが、アバウト的に最善手に
近い手を選んでくれるんなら、並び順の優先順位計算に、あるウェイトで入れてみようか
的に考えるだけでした。意味とか深く考えるよりやってみるという感じでした。が、最後に
残った2つの空所が偶数と奇数とかの例ならわかりやすいけど、空所が4〜5か所ある
ような状況で偶数理論を当てはめようというのが間違いなのかなぁと。
あと、薄々思っているんだけど、テストケースとしてFFOは良くないんじゃないかと(汗
FFOに最適化してると、もっと出現頻度が高い例題でより高速化できる可能性を放棄
しちゃっている事にならないかと。

339:310
15/10/17 09:29:41.90 uZH1KzRS.net
最終2手高速化したあたりから、ノード数が過小になっていたので、それを直しました。
自分のと比較すればよいかと思って放置していましたが、そろそろちゃんと比較しようかなと。
結果、探索ノードが思っていた以上に多かった事、そしてNPSは9〜11K出てるので、
NPSを落としてノード削減する余地があるという結果に。
あまりテストしていなかったFFO#41と42ではzebra方式と呼んでいた(後述)方法が、自分の
中では最速で、MTD(f)の結果があまり思わしくない事も。MTD(f)の#40は初期条件が良か
ったからの模様。
ここらへんでもう一度、zebraサイトのFFOテストページにあるcomplete logなるものを見て
みると、全然違う。バージョン違いなのか、やってる事が全く違う。
浅い探索をしてfを決めてNull window search(正確には幅3なので正解が判別できる)
を繰り返しているように見える。けど、ログ上に%が出てきて、98%、99%、%無しみたい
になっているので、何らかの方法で前向き枝刈しながら、評価値を求めていき、最後まで
幅3の探索しかしていないのかな。こういうのをPVSって言うのかな。
浅い読みとか、前向き枝刈とか絡んでくるんなら、中盤探索をやってから戻ってきた方が
よいのかな。。

340:名前は開発中のものです。
15/10/19 09:50:52.09 BMJ9Bhec.net
とりあえず、ざっくり中盤探索のnegaScoutを組んでみた。
素の状態で10手読みくらいなら1手10秒以内に終わりそうな感じ。
だけど、いろいろと気になる点が。
とり同一局面から着手可能な手の評価値の順番は、あまりくるっては
いないように見える。ただ、評価値事態は結構ずれている。
そして、黒番白番で精度が全く違うように見える。
言われてみれば、同一局面でも手番が逆転すると評価は全く変わるからなぁ。
今は、手番も一つのパラメータにしちゃってるから、その差異は埋められない。
パラメーターとか評価関数の区分とか再考の余地があるんじゃないかと。
前向き枝刈するにしても、評価関数がフィックスしないとダメじゃないかと。
というわけで、しばらく評価関数方面で時間つぶしかなぁ。

341:名前は開発中のものです。
15/10/26 09:44:35.41 uWG/Yjb0.net
中盤探索に入るにあたって、評価関数の計算の試作をいろいろしているんだけど、
いまいちぱっとしない。100回学習で1晩かかるし、300回試行くらいしないと傾向が
見えてこないので、時間がかかる。
で、仕方ないので、裏で序盤定石を作り始めてしまった。
こちらも棋譜ベースで作ろうと考えている。
そこまで来た時に、データベースのどういうデータが使いたいのかが、逆にはっきりして
来て、今使ってる360万件棋譜の中のデータを選別しようかという方向に傾きつつあります。
が、やっつけで作って中身が思い出せないフォーマット変換のプログラムから直さなきゃならん。
開き直って、もう1度、データ変換から作り直そうかなと・・・

342:310
15/10/30 17:31:41.23 uxyAnbEX.net
棋譜ベースで序盤20手の定石DB作った。
定石DBは置換表をベースに作ったので、検索は速いけど、容量が大きい・・・。
簡単にαβで20手探索してみた。
ネットで調べた定石集に載っていない手筋が出てきてしまった。むむむ。
5手目までエビ系で、しかも石差+2で黒勝ち。棋譜が偏っているのかな。
棋譜は例の50万棋譜計画の奴で10手目、20手目以降を訂正したというデータ。
明らかに壊れたデータが入っていたりと、何かと使いにくい箇所があるデータだけど、
定石DB作るにはこの量でも足りないのかも。
定石探索用の簡易版minMaxを作りながらつらつら考えていたら、終盤探索の
moveorderをもっと良くする方法を思いついた。評価関数の精度次第だけど。
新評価関数は、途中でうっかり仕込んだバグで遅延。ようやく原因が見つかって、300回
試行まで来た。もうちょい収束させたいけど、テストに使える程度にはなってると思う。

343:310
15/11/08 00:32:40.41 LMw8+3qF.net
moveorderを早くする方法というのは、事前に軽く探索した手順を保存し、その手順から
優先して探索するというもの。理論的にはscout missがゼロになる。
探索した手順を取り出す仕組みが必要になるので、その辺を改造しようと思ったところで、
悪い癖が出てしまいました。Cベースのソースを一旦棚上げして、C++ベースのクラスを
利用した形で一から作り直してしまいました。
moveorderの配列をvectorに変えたり、unordered_mapを見つけたので置換表に使って
みたり。置換表は、システム任せにして動的にメモリ確保に行かすと、探索ノードの減少
以上に速度低下して使えない。最初からある程度メモリ確保させようとしているんだけど、
いまいち設定がわからない。動的にメモリ確保するので、速度のバラツキも大きい。
そもそもC++は初めてなので、目的がオセロからC++というかunordered_mapの習得に
なりかかっていたので、一旦棚上げして、配列ベースの自作ハッシュの置換表に戻る
方向にしました。
とはいえ置換表を外してもnode/secが5kくらいしか出ていないので、実装が悪いところもありそう。
というわけで完全に寄り道しちゃってます。

344:310
15/11/12 16:56:19.10 4hPfHY6k.net
ようやく、C++ベースの終盤探索(negaScout)が、Cベースより若干速くなりました。
・unordered_mapの速度のバラツキはデバッガー上限定。
実行ファイルでも多少ばらつくけど、メモリ効率&メンテナンス性からunordered_mapを採用。
・探索した確定手順を返す方法の検討で苦戦。
negaScout+置換表では原理的に無理と認識するのに時間を要しただけでしたorz
置換表無しnegaScoutかnegaMax+置換表では、後者の方が高速。
・確定手順を元にmoveorderする改造の効果は限定的。
moveorderで先頭にする処理が重い模様。適用範囲を狭めて行くと1〜3手で同等の速度。
・ハッシュキー生成簡素化で若干速度アップ。
・その他、細かいスピードアップ。
確定手順の導入で50%以上速度アップを目論んでいたのですが、無駄な努力でありました。
一応、与える確定手順の数はマクロ定義で可変できるようにしてあります。
評価関数も修正を加えたいので、データ変換部からまた作り直しです。
目標も無しに同じ事2回やるのは面倒だなぁ。

345:310
15/11/19 14:23:44.03 W/V+CKXD.net
定石部分もクラス化が終わりました。クラスなんての扱うの初めてなので、もうちょっと
綺麗にできたかなと思う面もありますが、C++習得が目的ではないので。
終盤確定読みは0.05秒刻みで速度アップ。FFO#40で2.3秒になりました。
今まで、速いプログラムでは30手目くらいから勝敗判定を始めると言う記述を読んで、
なんて速いんだと思いつつ、何に使うんだろうと思っていましたが、ようやく腑に落ちました。
オセロというゲームは勝敗だけが問題で、勝つんなら2石差で十分。「少なくとも負けない
手」というなら、(-1,0)のNull windowで探索してβカットされた手を選べば良い。評価値は
不定(これより良いという値)でも負けない手であるという点では「確定」手順です。moveorder
が正確なら、極端に石差を減らす手も選ばない。これなら現状でも25手ちょいくらいは行けそう。
ただ、これは勝勢の時の話で、敗勢の時の評価値は「これより悪い」という数字だし、
逆転は相手のミスに期待するしかなく、相手も同等のロジックのAI相手だと必敗となる。
結局定石段階で勝負がつく事になります。
今、定石DBは30手を前提に組んでいますが、31手目から勝敗判定ができるんなら、定石
を外れない限り中盤探索が不要になり、定石から外れた時にのみ中盤探索が必要になる。
つまり中盤探索は対PC戦では重要度が低く、定石が切れたら、即、終盤探索が始まる。
そもそも評価関数が良ければ、中盤もあまり深く探索する必要がないわけで。
深く読む意味って、なるべく評価が正確なステージを使いたいからなんだなぁと。
というわけで、次はそろそろ中盤探索です。Multi Prob Cutの英語論文を読まねばならぬ・・・。

346:310
15/11/21 00:05:47.02 WWzrsUCT.net
定石DBを使って30手目まで着手した盤面の予想石差が2で勝ち判定だったので、
試しに31手目から勝敗判定をしてみました。
(-1,0)のNull windowで7分30秒ほどで解けました。
(参考)勝ちと引き分けを区別するために(-1,1)で計算すると9分30秒ほど。
探索ノード数がintではオーバーフローしてしまった・・・。
これから、33〜4手目(残り26〜7手)くらいで、10秒程度で解けると予想されます。
勝勢ならこれで良いのですが、敗勢の時は、初段がβカットされないので10倍程度
時間がかかる。そうすると、残り25〜6手目くらいが勝敗読みの限度かなと。
もっと高速化が必要なのか。それとも、何か発想の転換ができるのか。

347:310
15/11/23 21:01:42.47 24rahmZ0.net
ProbCutとMultiProbCutのBUROさんの論文あらかた読み終えました。
最初、MPCの方から読んでちんぷんかんぷんだったので、ProbCutを読んで、
戻って来て、ようやく実装のイメージが湧くところまで来ました。
というか、この発想に至る道具立てや考え方は、既に揃ってた感じ。例えば>>323とか。
これ>>345-346の勝敗判定の高速化に使える気がする。相手側の手番では
前向きカットしないようにすれば、相手の反駁手を見逃さないからいけるんかなと。
あまり深い読みで使用するとパラメータ作りでしばらくPCを占有しそうだけど。
カットペアは結構アドホックに決めているのかな。各組合せを総当たりで調べても、
σにそんな差があるとは思えないし、特異的に良い組み合わせがあるとも思えないし、
むしろ読む深さの差が増えるにつれてダラダラとσが大きくなって行くだけじゃないか
と思う。毎深さごとにMPCしてもオーバーヘッド負けになるだろうし、再帰的に使う事を
考えたら、2^n+αで4,8,12,16,20,24ってな感じで良いのかな。

348:310
15/11/25 22:32:57.73 APRE5Y1F.net
条件を決めて簡単にMPCパラメータの計算プログラムを作って検証してみました。
30手目の時点(深さ30)の時の浅い探索0〜10手でMPCパラメータを計算してみました。
例の300万件棋譜の30手目以後完全読み(らしい)190万件ほどのデータからランダム
に200件ほど抽出して使用。
結論)δが10石、R-2が0.7未満という状態で、とても使えたものではないという事に。
ただ、35、40、45手目時点からのカットを試す価値はあるかも知れない。
一方、30手目の時点で、深さ10の探索に対して、浅い探索6までで計算すると、
浅い探索4手でδが2石、R-2が0.931、浅い探索6手でσが1.5石、R-2が0.962
程度と、まずまずの結果に。これが、論文通りの使い方。
当たり前だけど、こちらは十分使えそう。ただ、結局深い探索に対して浅い探索の深さを
決めるのに、全パターン試すしか無いという。まあ、BUROさんのマネしちゃえば良いけど。
あと、中盤読みのプログラム、やっつけで、終盤探索の手順作成用の浅い読みプログラム
転用したんだけど、これnegaMaxなのよね。negaScout+MTD(f)にするなり、もう少し、
素の高速化をしないとパラメータ計算が大変。

349:名前は開発中のものです。
15/11/29 22:05:16.61 gx8DmdDE.net
googleとかfbが囲碁のAI作ってるが、どんなもんなの

350:310
15/12/02 23:21:25.70 Xp/MZwxE.net
とりあえずMPCの仕組と終盤探索用のパラメータだけ作り、終盤探索と勝敗判定に
適用してみました。
勝敗判定は31手目から。浅い探索は残り手数の1/3。T=1.5で時間短縮が微妙な感じ。
終盤探索はFFO#40でテストしたところ、T=1.5だと途中で正解着手がカットされている
模様で、T=2.0で正解。T=2.0だと時間変わらずみたいな微妙な結果に。
もう一度、MPCの論文を良く読んでみましたが、どちらかというと評価関数の精度の差
の方が大きい様子で、もともと標準偏差が倍近いので、そこを何とかしなきゃならんと。
論文を良く読むと・・・評価関数に確定石はおろか、mobilityも使っていない。使っている
のは、パリティー(手番)だけで、ここは自分の方が精度が良い方法のはず。という事で、
急きょ評価関数の説明変数をパターンだけにして再計算に着手しました。
とはいえ、書いてある学習係数があまりに違いすぎるので、自分がバグってる可能性も。
また、ネットでBUROさんのパワポ資料(2002年)みたいなのを見つけて読んでみると、
「selective endgame search」と称して、MPCの終盤探索への応用がサラっと書かれて
いて、「いまどきの強いオセロプログラムはみんなやってる」との事。iterative deepingを
前提にしているのでmoveorder作成で使ってるのかなぁ。正解着手だけ与えても速度アップ
は限界があり、正解以外着手のnull window searchの時間がバカにならないので。
あと、中盤探索は(17,5)というカットペアの記載あり。zebraのFFOのログでは中盤探索が
2.5kNPSなのに対して、僕のは250MPSと、速度が1/10なので・・・深さ17はしんどいかなと。
ちょっと期待しているのは、前述のとおり確定石計算を評価関数で使用しなくなったので
その分は速度アップしていないかなぁと。
評価関数の再計算を始めてしまったので、しばらくは中盤探索が動かせません。
というか、本当にLRの計算があっているのか、バグは無いのか、不安になる…

351:名前は開発中のものです。
15/12/02 23:37:59.26 Xp/MZwxE.net
>>349
囲碁オセロ板の該当スレで聞いた方が良いかなと。
コンピューター囲碁ソフトについて語るスレ30 [転載禁止]&#169;2ch.net
スレリンク(gamestones板)

352:310
15/12/04 23:35:12.62 DNSRUk3b.net
結局、確定石が評価関数の誤差の大きさと、収束性の悪さの原因だったみたいです。
前半から中盤はmobilityのウェイトが大きそうなので、とりあえず復活させてみました。
あと、スムージングは、あるステージで出現しなかったパターンが隣接ステージにある
可能性も考慮し、ウェイトがゼロのパターンを減らす目的もあるようです。
実際、200試行ちょっとでかなり誤差が減ったのですが、FFO#40で試すと途中の評価値
のバラツキというか、極端に0に近い局面が現れて、2σ以上の差異が簡単に出てしまい
ます。そこで、ちょっとだけスムージングを入れて、かつデバッグ段階ではウェイトゼロの
出現をアラームできるように改造しようかと思っています。
評価関数の重要性を痛感しています。しばらくは、ここで悩む事になるのかなぁ。
最低でも300試行するとなると3日かかる。

353:310
15/12/05 23:27:03.86 VLRyPTJJ.net
モビリティーも収束悪化の原因でした。
確定石の数にしても、モビリティにしても、ある程度大きな数字が出るものがダメっぽいです。
評価パターンとウェイトを確認できるようにして、FFO#40〜41の完全読みに登場する盤面を
チェックしましたが、ウェイトゼロのパターンは出現していないようです。
評価値が大きくぶれるところがありますので、スムージングを入れてみて計算開始です。

354:310
15/12/07 10:00:41.29 JSVZKjkd.net
スムージングも外してみたら、Buroさんの論文なみ(か、それ以下)のσが出そうな
感じになってきました。収束が良いのでβも大きくできたし、その後の計算でも工夫を
入れたので、Buroさん論文みたいに300回試行で十分なレベルになりそうです。
ウェイトゼロのパターンはありました。FFO#40の50手目のCORN2x5に1つ現れます。
現在selective endgame searchがどんなものなのか、想像を膨らませています。
iterative widening endcutのイメージがなんとなくつかめてきました。
ソースを探して見ちゃえば早いんだろうけど、面倒だし、想像だけで頑張る。
MPCが動いたら、solver改造して、本当に速くなるのか確認する。

355:310
15/12/10 23:16:49.62 lQAJMVKx.net
結局、評価関数は1000回試行までやってます。
β・1/Nでやってるけど、それだと収束が遅いので、100回試行ごとにβを倍々に。
1000試行目で発散するステージが出たので、βを下げて最後の100試行を実行中。
その間、反復深化などで使えるように、置換表を改造。前回評価範囲をmoveorderで
再利用します。いちいち消しているとメモリ解放で時間がかかるし、全データを入れたまま
用途をキーで区別すると、使用時に選択する事になりオーバーヘッドが気になるので、
一番新しい評価値をひたすら上書きし、置換表として使用する時のみ、今回探索か
区別するようにしました。moveorderで若干割り切った作りです。
同時に中盤探索(MPCなし、反復深化)をちゃんと作ってみました。MPC計算で、結構深い
深さまで探索する予定なので、反復深化が上手く機能するようなMPC計算ロジックを考え
ようと思っています。
それができたらiterative wideningのテストをしてみようと思います。

356:310
15/12/11 22:32:36.55 c1YdnEjo.net
あちゃ。ウィンドウ幅1でiterative wideningやると、正解着手もβカットされた手も
置換表の値が全部同じになって、次の探索でmoveorderが意味なしになって、
速度が大幅低下する事が発覚。
仕組み考えないと・・・。

357:310
15/12/13 23:14:55.34 RUGsIY6w.net
一応回避したけど、MPCの速度向上は限定的。
中盤探索というか評価関数が驚くほど遅いのだろうという結論に。
放置していた中盤探索の素の高速化に入ります。
1か所ネタはあるんだけど。

358:名前は開発中のものです。
15/12/18 00:28:56.19 ht2BaviT.net
中盤探索で2か所改良して、速度は2倍にアップ。まだzebraの6掛け程度の速度です。
終盤探索のiterative wideningを想像しながらテストするも、いまいち速度向上が望めない。
MPCのカット基準を緩めながら(widening)、置換表にmoveorderを貯めていく事でβカット
をどんどん起こさせて、最後の完全読み時点ではほぼ完ぺきな順序に並び変える事で
高速化を実現する方法だと想像しているんだけど、違うのかなぁ。
そんなこんなでやけくそ気味に、浅い探索(11手読み)+negaScout(-∞,+∞)を試したら
FFO#40で1.93秒という最速タイムが出てしまった。MPCもMTD(f)も意味なしorz
#41,#42もこの方法でかなり高速化したけど、それでもまだzebraの方が速い。

359:310
15/12/20 17:21:06.88 UpZkem/K.net
中盤探索で改良をしたらかえって遅くなるを繰り返してます。
で、やけくそ気味にmoveorderの「置換表がない時」の計算値を、簡素化してみたら
中盤探索の速度そのままに、終盤探索部分の探索ノードが減少して高速化。
終盤探索部分も同様に簡素化したら、FFO#40で1.75秒以下になりました。
それでも相変わらず#41/42はzebraがずーっと早い。
で、MPC使うと遅くなる理由を考えていたら、いま使っているMPCのセットは終盤探索用に、
残り手数と浅い読みのセットを独自パターンにして計算した奴だと言う事を思い出した。
深い探索のスコア=終局のスコアとなり、深い探索が不要になるので。
中盤の高速化するネタももう出てきそうにないし、先に進むか・・・

360:名前は開発中のものです。
15/12/23 11:41:36.91 Acs4Om0o.net
iterative wideningって詰め碁用のアルゴリズムっぽいけど違うの?
310の言ってるのってただのAspiration Searchか何かに見えるけど
てか置換表にmoveorderを溜めるとはどういう意味だ

361:310
15/12/23 16:26:13.00 MLtsaD3t.net
どもです。
Buroさんのパワポっぽい資料に名前しか書いてないので中身がわかりません。
わかっているのはMPCと併用するらしいことくらいです。
iterative wideningで検索すると確かに碁の関連の英語論文がヒットしますね。
関係なさそうだと思って放置していましたが、ちょっと見てみようかなぁ。
置換表云々は、僕の想像です。
αβを前提にしたアルゴリズムで高速化するネタの一つに、moveorderを工夫して
βカットが起きやすくするってのがあると思います。
反復試行する際、置換表には前回の評価の範囲が入っています。
それを今回探索のmoveorderの並べ替えに利用しようというものです。
反復深化なんかと同じ考え方です。
逆に言うと、反復を前提としたアルゴリズムで高速化するネタが、それくらいしか
思い浮かばないのです。

362:名前は開発中のものです。
15/12/23 20:37:25.92 Acs4Om0o.net
ああ、オーダリングに以前の探索の結果を置換表から引いて使うってことか
置換表に順列か何かを放り込んでいくのかな?とか思ってしまった
bitboard + NegaScout + 置換表 + MPC + 評価関数とマージンの学習
をやってるっぽいのはわかったけど、とりあえず定番どころは全部入れてるのかな
NegaScoutで最初のノードを探索するときに、
探索窓を(-inf, inf)で探索せずに、前回の評価値eを使って
(e - d, e + d)で探索して、失敗したときに限り窓を広げて再探索するのがAspiration Searchだけど
もうやってるかな
あとCPUのSIMD命令使ったり、並列化したりとかはめちゃ効果でかいよ

363:310
15/12/23 22:38:37.71 MLtsaD3t.net
>>362
ご助言ありがとうございます。
MPCはまだ途中ですが、そんな感じです。
終盤n手高速化の類もしています。中盤探索だと葉に近いところで置換表外すと、
著しく速度が低下するので、最後まで置換表を使っています。
で、中盤の速度がいまいちで12手読みくらいが実用範囲って感じです。
MPCでd計算に100棋譜くらい試して一晩で計算できる範囲は13〜14手くらいが
限界な感じです。そろそろMPC計算しちゃおうかと思いつつ、まだ悶々と中盤探索で
どこか高速化できないかトライ中です。
SIMD命令はコンパイルオプションでそれらしい場所があったので、設定してみましたが、
速度変わらずで放置しています。どうやって使うものなのでしょうか?
そもそも、組込関数のpopcountとかbitscanで64ビット版が使えずに放置してる状況です。
並列化はMPCが終わって、一通りオセロの形にしてから、次ステップで勉強しようかと
思っています。
アスピレーションサーチは、1σは±7〜8手なので試しに±8の幅にしてテストしてみた
ところ、確かに若干高速化できている様子です。mtd(f)は下から寄っていく時はβカットが
効くのですが上から寄っていく時は遅いので、一発目で探索できる確率を上げつつ、
ある程度幅を絞るには、このくらいがちょうど良い感じですね。

364:310
15/12/24 20:33:24.09 zDiJT168.net
ちと調べてみました。SIMD命令はx64でコンパイルしている時は、設定しなくても自動的に
使うようになっているみたいな説明を見つけました。
並列化とかベクター化とかもコンパイラが自動でやってくれるみたいですが、レポート出し
たら確かに一つも対象になっていませんでした。評価値算出とmobilityの2関数は、なんか
効きそうな気がしますので、少し悶々とトライしてみます。
また、_mm_popcnt_u64と_BitscanFoward64は、今やってみたら、何故か使えました。
色々とコンパイラのオプションをいじったのが原因かなぁ。謎。
多少速度アップした模様です。
アスピレーションウィンドウはdの計算しなきゃと思っていましたが、よくよく考えたら、
評価関数の計算時の誤差ログが残っていますので、そいつでパラメータ作成してみます。
と、久々にFFO#43まで時間計測したところ、#43で答えが違ってる。
数か月前に最終2手高速化をいじった時にバグを仕込んだ模様です。
調べようとdebugモードにしたら64ビット組込関数が使えない。
やっぱりコンパイルオプションのどこかみたいですが、わからない。
だんだん問題が発散してきて、頭の切り替えが追い付かなくなってますorz

365:名前は開発中のものです。
15/12/24 20:53:24.01 DG4HDn4P.net
pop_cntはめちゃめちゃ速度上がった経験あるが(三割アップ)
オセロだとそうでもないのかな。

366:310
15/12/24 22:56:29.36 zDiJT168.net
_mm_popcnt_u32()はすでに使っていました。u64が使えなかっただけです。
u32→u64で3〜5%くらいの高速化になっています。
困った事に、debugビルドの側では、まだ64bit版が使えていません。
debugを使いたい時は32bitに直さないといけない。
コンパイルオプションをいろいろ見比べていますが、どこなのかいまだにわかりません。
#43は最終2手なのか1手なのか、どちらにバグがあるのか切り分けようとして
ソースいじっているうちに直ってしまいました(汗)。

367:名前は開発中のものです。
15/12/25 15:25:23.28 skIhqDAd.net
>>364
コンパイラの自動ループ展開(あんま賢くない)に限らず、
手動でAVXだのSSE命令だの使えるところは使ったらという話
あとMPCは本質的に前向き枝刈りなので、過激に刈りすぎると答えがずれる可能性はあると思うけど
(バグの原因は当たりがついているようなので関係ない気がするが

368:310
15/12/26 11:23:54.66 2a5cp76f.net
どもです。バグったところはMPC使って無い箇所でした。
コンパイラの自動ループ展開は上記2か所で試してますが、なかなかうまく行きません。
なんとか依存関係を解消してループ展開強制すると劇的に速度低下する状態です。
その代り、いろいろググっていたら、BMI命令を見つけて、BLSIとPEXTを使ってみました。
速度バランスが変わったのでパラメータで置換表適用範囲を狭めるなどもしましたが、
FFO#40で1.55秒前後まで高速化できました。中盤探索も高速化はしているはずですが、
数%程度の改善というところでしょうか。まだ50%は高速化したい状態です。
色々アドバイスいただいたお蔭で、ようやくSIMDまわりの使い方がわかってきました。
ここまで来ると、BITBOARD操作の関数の見直しをしたくなりますね。
中盤探索の一番重い部分なので。

369:310
15/12/28 10:45:49.88 i0yT273K.net
デバッグモードでu64系の関数が使えない件、解消しました。
MTD(f)に代えてアスピレーションウィンドウを採用しました。
中盤探索は、隣の評価値をたどっていくと、かえって遅くなるのでnegaScoutだけで
探索していましたが、これでMPC計算が多少高速化できそうです。
MPC計算はまだしていません。反復深化でどのくらいの深さの探索で、どのくらいの
件数なら実用的に計算できるか試行しています。14手読みまでは行けそうですが、
15手だと厳しいかなぁという状態。20手付近では盤面によっては、探索ノードが爆発的
に増えて、時間のバラツキも大きいです。
また、FFO#40-44の完全読みを計測しました。zebra比で#40は圧勝、#41-42は引き分け
ですが、#43-44は完敗。理由は#43-44は正解となる初手が2つあるためで、#43は10秒
以上かかってます。むむむ。

370:名前は開発中のものです。
15/12/28 21:28:38.25 kMgyHY3u.net
オセロ完全解析は何年後くらいになりそうですか?

371:310
15/12/29 02:31:09.04 F/Ba7yoX.net
ちょっと一括変換操作を誤って大変な事になっていました。一通り直していたところ、
FFO#40で1.45秒程度が出るようになってしまいました。多分、修復がてら置換表登録・
検索関数の変数の並びを、整列したのが効いたのだと思っていますが、びっくりポンです。
前回課題の正解着手が複数あるケースですが、MTD(f)のような評価値決め打ち系の
探索では、ぴったりの答えが見つかった時点で、ほかの手を探索する必要が無い事に
気づき、直してみたところ、FFO#44は速度アップしました。が、#43はまだ駄目です。
とはいえ、#43は浅い探索の評価値が外れすぎて時間がかかっているような感じなので、
浅い探索の深さを残り手数で調整すると直りそうな気がしています。
あと、FFOテストの全データをテストできるように登録しましたが、#59を見て、はたと、
途中全滅時のスコア計算が違う事に気づきました。自分のは一番単純なアメリカルール
です。ここを直すと、確実に時間が遅くなるような気がしますが、明日直してみます。
てな事をやって、一晩に0.1秒(比率にして7%前後)も短縮していると、まだなんか
やる事があるんじゃないかと・・・。

372:名前は開発中のものです。
15/12/29 03:05:56.17 rs+91GZQ.net
結局MTD(f)をやってるのかやってないのか意味わからんな

373:310
15/12/29 10:25:40.74 F/Ba7yoX.net
って、βカットしない事を確認しなきゃきゃいけないから、ぴったりの答えがあっても
全手を探索しないとダメじゃん。すんません。

374:310
15/12/29 10:52:28.77 F/Ba7yoX.net
>>372
やったりやらなかったりで、いろいろ比較して試してます。
MTD(f)では、ワーストケースではウィンドウ中心が評価値の最少単位で動く関係で、
1石以下の少数計算をする中盤探索では、よけいに時間がかかる事が多いです。
そのため、アスピレーションウィンドウ導入前はただのnegaScoutにしてました。
終盤探索は、最少単位が1石になりますので、許容範囲です。
MTD(f)もアスピレーションウィンドウも、所詮本チャンのnegaScoutを呼び出すための
ドライバーにすぎないので、どちらも用意して、何かの折に速度比較しています。
今回は、ボツりましたが、ぴったりの値が見つかったら後の探索を省略する際には、
MTD(f)の方がマッチングが良かったので、そうしました。
ボツになりましたので、またアスピレーションウィンドウに戻りましたが。
#40ではzebraよりはるかに高速化できましたが、#43など遅いケースでは、数倍の時間が
かかります。こういうタイプの時間差は、単純な高速化じゃなくて、何らかのアルゴリズム
の違いがあるのかなと想像しています。

375:310
15/12/30 00:01:33.75 lfikhn/D.net
結局、本日は探索速度アップばかりやってました。
中盤探索というか評価関数の計算でBMI2命令を徹底的に使ってみました。
また、ボードの回転操作系も見直しました。
10%程度は高速化できたと思います。でも、期待したほどではなかった。
あと、速度アップするなら、ボードの対角線転置かなぁ。あと効果は微妙だけど、180度
回転がビットオーダーの逆転なので、これも何か組み込み関数があったらうれしいなと。
終盤探索では、FFO#59問題に対処。
スコア計算の修正と、全滅など64石の差がついた時に、βカットと同様に後続の探索を
パスして時短。minMaxで言うところのα値の更新があり得なくなるからです。
浅い探索が11手だと3秒程度で解けるのに、15手だと60秒かかったりと、いまいち動き
に納得がいかないので、まだ何か問題があるかも知れません。
中盤探索をあと50%は高速化したいなぁ。というか、zebra見てるとできるはず。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

3148日前に更新/322 KB
担当:undef