- 1 名前:名前は開発中のものです。 [03/07/10 00:10 ID:6FQp6G+O.net]
- 比較的地味なボードゲーム専用のスレが欲しくて立ててみました。
私はc言語で作ったデータベースを使って人間と対戦できる将棋かチェス みたいなソフトを作りたいと思ってますが、グラフィックインターフェースの 作り方がわからなくてつっかえているレベルです。
- 350 名前:310 mailto:sage [2015/12/02(水) 23:21:25.70 ID: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 名前:名前は開発中のものです。 mailto:sage [2015/12/02(水) 23:37:59.26 ID:Xp/MZwxE.net]
- >>349
囲碁オセロ板の該当スレで聞いた方が良いかなと。 コンピューター囲碁ソフトについて語るスレ30 [転載禁止]©2ch.net kanae.2ch.net/test/read.cgi/gamestones/1447640768/
- 352 名前:310 mailto:sage [2015/12/04(金) 23:35:12.62 ID:DNSRUk3b.net]
- 結局、確定石が評価関数の誤差の大きさと、収束性の悪さの原因だったみたいです。
前半から中盤はmobilityのウェイトが大きそうなので、とりあえず復活させてみました。 あと、スムージングは、あるステージで出現しなかったパターンが隣接ステージにある 可能性も考慮し、ウェイトがゼロのパターンを減らす目的もあるようです。 実際、200試行ちょっとでかなり誤差が減ったのですが、FFO#40で試すと途中の評価値 のバラツキというか、極端に0に近い局面が現れて、2σ以上の差異が簡単に出てしまい ます。そこで、ちょっとだけスムージングを入れて、かつデバッグ段階ではウェイトゼロの 出現をアラームできるように改造しようかと思っています。 評価関数の重要性を痛感しています。しばらくは、ここで悩む事になるのかなぁ。 最低でも300試行するとなると3日かかる。
- 353 名前:310 mailto:sage [2015/12/05(土) 23:27:03.86 ID:VLRyPTJJ.net]
- モビリティーも収束悪化の原因でした。
確定石の数にしても、モビリティにしても、ある程度大きな数字が出るものがダメっぽいです。 評価パターンとウェイトを確認できるようにして、FFO#40〜41の完全読みに登場する盤面を チェックしましたが、ウェイトゼロのパターンは出現していないようです。 評価値が大きくぶれるところがありますので、スムージングを入れてみて計算開始です。
- 354 名前:310 mailto:sage [2015/12/07(月) 10:00:41.29 ID:JSVZKjkd.net]
- スムージングも外してみたら、Buroさんの論文なみ(か、それ以下)のσが出そうな
感じになってきました。収束が良いのでβも大きくできたし、その後の計算でも工夫を 入れたので、Buroさん論文みたいに300回試行で十分なレベルになりそうです。 ウェイトゼロのパターンはありました。FFO#40の50手目のCORN2x5に1つ現れます。 現在selective endgame searchがどんなものなのか、想像を膨らませています。 iterative widening endcutのイメージがなんとなくつかめてきました。 ソースを探して見ちゃえば早いんだろうけど、面倒だし、想像だけで頑張る。 MPCが動いたら、solver改造して、本当に速くなるのか確認する。
- 355 名前:310 mailto:sage [2015/12/10(木) 23:16:49.62 ID:lQAJMVKx.net]
- 結局、評価関数は1000回試行までやってます。
β・1/Nでやってるけど、それだと収束が遅いので、100回試行ごとにβを倍々に。 1000試行目で発散するステージが出たので、βを下げて最後の100試行を実行中。 その間、反復深化などで使えるように、置換表を改造。前回評価範囲をmoveorderで 再利用します。いちいち消しているとメモリ解放で時間がかかるし、全データを入れたまま 用途をキーで区別すると、使用時に選択する事になりオーバーヘッドが気になるので、 一番新しい評価値をひたすら上書きし、置換表として使用する時のみ、今回探索か 区別するようにしました。moveorderで若干割り切った作りです。 同時に中盤探索(MPCなし、反復深化)をちゃんと作ってみました。MPC計算で、結構深い 深さまで探索する予定なので、反復深化が上手く機能するようなMPC計算ロジックを考え ようと思っています。 それができたらiterative wideningのテストをしてみようと思います。
- 356 名前:310 mailto:sage [2015/12/11(金) 22:32:36.55 ID:c1YdnEjo.net]
- あちゃ。ウィンドウ幅1でiterative wideningやると、正解着手もβカットされた手も
置換表の値が全部同じになって、次の探索でmoveorderが意味なしになって、 速度が大幅低下する事が発覚。 仕組み考えないと・・・。
- 357 名前:310 mailto:sage [2015/12/13(日) 23:14:55.34 ID:RUGsIY6w.net]
- 一応回避したけど、MPCの速度向上は限定的。
中盤探索というか評価関数が驚くほど遅いのだろうという結論に。 放置していた中盤探索の素の高速化に入ります。 1か所ネタはあるんだけど。
- 358 名前:名前は開発中のものです。 mailto:sage [2015/12/18(金) 00:28:56.19 ID: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 mailto:sage [2015/12/20(日) 17:21:06.88 ID:UpZkem/K.net]
- 中盤探索で改良をしたらかえって遅くなるを繰り返してます。
で、やけくそ気味にmoveorderの「置換表がない時」の計算値を、簡素化してみたら 中盤探索の速度そのままに、終盤探索部分の探索ノードが減少して高速化。 終盤探索部分も同様に簡素化したら、FFO#40で1.75秒以下になりました。 それでも相変わらず#41/42はzebraがずーっと早い。 で、MPC使うと遅くなる理由を考えていたら、いま使っているMPCのセットは終盤探索用に、 残り手数と浅い読みのセットを独自パターンにして計算した奴だと言う事を思い出した。 深い探索のスコア=終局のスコアとなり、深い探索が不要になるので。 中盤の高速化するネタももう出てきそうにないし、先に進むか・・・
- 360 名前:名前は開発中のものです。 mailto:sage [2015/12/23(水) 11:41:36.91 ID:Acs4Om0o.net]
- iterative wideningって詰め碁用のアルゴリズムっぽいけど違うの?
310の言ってるのってただのAspiration Searchか何かに見えるけど てか置換表にmoveorderを溜めるとはどういう意味だ
- 361 名前:310 mailto:sage [2015/12/23(水) 16:26:13.00 ID:MLtsaD3t.net]
- どもです。
Buroさんのパワポっぽい資料に名前しか書いてないので中身がわかりません。 わかっているのはMPCと併用するらしいことくらいです。 iterative wideningで検索すると確かに碁の関連の英語論文がヒットしますね。 関係なさそうだと思って放置していましたが、ちょっと見てみようかなぁ。 置換表云々は、僕の想像です。 αβを前提にしたアルゴリズムで高速化するネタの一つに、moveorderを工夫して βカットが起きやすくするってのがあると思います。 反復試行する際、置換表には前回の評価の範囲が入っています。 それを今回探索のmoveorderの並べ替えに利用しようというものです。 反復深化なんかと同じ考え方です。 逆に言うと、反復を前提としたアルゴリズムで高速化するネタが、それくらいしか 思い浮かばないのです。
- 362 名前:名前は開発中のものです。 mailto:sage [2015/12/23(水) 20:37:25.92 ID:Acs4Om0o.net]
- ああ、オーダリングに以前の探索の結果を置換表から引いて使うってことか
置換表に順列か何かを放り込んでいくのかな?とか思ってしまった bitboard + NegaScout + 置換表 + MPC + 評価関数とマージンの学習 をやってるっぽいのはわかったけど、とりあえず定番どころは全部入れてるのかな NegaScoutで最初のノードを探索するときに、 探索窓を(-inf, inf)で探索せずに、前回の評価値eを使って (e - d, e + d)で探索して、失敗したときに限り窓を広げて再探索するのがAspiration Searchだけど もうやってるかな あとCPUのSIMD命令使ったり、並列化したりとかはめちゃ効果でかいよ
- 363 名前:310 mailto:sage [2015/12/23(水) 22:38:37.71 ID: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 mailto:sage [2015/12/24(木) 20:33:24.09 ID:zDiJT168.net]
- ちと調べてみました。SIMD命令はx64でコンパイルしている時は、設定しなくても自動的に
使うようになっているみたいな説明を見つけました。 並列化とかベクター化とかもコンパイラが自動でやってくれるみたいですが、レポート出し たら確かに一つも対象になっていませんでした。評価値算出とmobilityの2関数は、なんか 効きそうな気がしますので、少し悶々とトライしてみます。 また、_mm_popcnt_u64と_BitscanFoward64は、今やってみたら、何故か使えました。 色々とコンパイラのオプションをいじったのが原因かなぁ。謎。 多少速度アップした模様です。 アスピレーションウィンドウはdの計算しなきゃと思っていましたが、よくよく考えたら、 評価関数の計算時の誤差ログが残っていますので、そいつでパラメータ作成してみます。 と、久々にFFO#43まで時間計測したところ、#43で答えが違ってる。 数か月前に最終2手高速化をいじった時にバグを仕込んだ模様です。 調べようとdebugモードにしたら64ビット組込関数が使えない。 やっぱりコンパイルオプションのどこかみたいですが、わからない。 だんだん問題が発散してきて、頭の切り替えが追い付かなくなってますorz
- 365 名前:名前は開発中のものです。 mailto:sage [2015/12/24(木) 20:53:24.01 ID:DG4HDn4P.net]
- pop_cntはめちゃめちゃ速度上がった経験あるが(三割アップ)
オセロだとそうでもないのかな。
- 366 名前:310 mailto:sage [2015/12/24(木) 22:56:29.36 ID:zDiJT168.net]
- _mm_popcnt_u32()はすでに使っていました。u64が使えなかっただけです。
u32→u64で3〜5%くらいの高速化になっています。 困った事に、debugビルドの側では、まだ64bit版が使えていません。 debugを使いたい時は32bitに直さないといけない。 コンパイルオプションをいろいろ見比べていますが、どこなのかいまだにわかりません。 #43は最終2手なのか1手なのか、どちらにバグがあるのか切り分けようとして ソースいじっているうちに直ってしまいました(汗)。
- 367 名前:名前は開発中のものです。 mailto:sage [2015/12/25(金) 15:25:23.28 ID:skIhqDAd.net]
- >>364
コンパイラの自動ループ展開(あんま賢くない)に限らず、 手動でAVXだのSSE命令だの使えるところは使ったらという話 あとMPCは本質的に前向き枝刈りなので、過激に刈りすぎると答えがずれる可能性はあると思うけど (バグの原因は当たりがついているようなので関係ない気がするが
- 368 名前:310 mailto:sage [2015/12/26(土) 11:23:54.66 ID:2a5cp76f.net]
- どもです。バグったところはMPC使って無い箇所でした。
コンパイラの自動ループ展開は上記2か所で試してますが、なかなかうまく行きません。 なんとか依存関係を解消してループ展開強制すると劇的に速度低下する状態です。 その代り、いろいろググっていたら、BMI命令を見つけて、BLSIとPEXTを使ってみました。 速度バランスが変わったのでパラメータで置換表適用範囲を狭めるなどもしましたが、 FFO#40で1.55秒前後まで高速化できました。中盤探索も高速化はしているはずですが、 数%程度の改善というところでしょうか。まだ50%は高速化したい状態です。 色々アドバイスいただいたお蔭で、ようやくSIMDまわりの使い方がわかってきました。 ここまで来ると、BITBOARD操作の関数の見直しをしたくなりますね。 中盤探索の一番重い部分なので。
- 369 名前:310 mailto:sage [2015/12/28(月) 10:45:49.88 ID: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 名前:名前は開発中のものです。 mailto:sage [2015/12/28(月) 21:28:38.25 ID:kMgyHY3u.net]
- オセロ完全解析は何年後くらいになりそうですか?
- 371 名前:310 mailto:sage [2015/12/29(火) 02:31:09.04 ID:F/Ba7yoX.net]
- ちょっと一括変換操作を誤って大変な事になっていました。一通り直していたところ、
FFO#40で1.45秒程度が出るようになってしまいました。多分、修復がてら置換表登録・ 検索関数の変数の並びを、整列したのが効いたのだと思っていますが、びっくりポンです。 前回課題の正解着手が複数あるケースですが、MTD(f)のような評価値決め打ち系の 探索では、ぴったりの答えが見つかった時点で、ほかの手を探索する必要が無い事に 気づき、直してみたところ、FFO#44は速度アップしました。が、#43はまだ駄目です。 とはいえ、#43は浅い探索の評価値が外れすぎて時間がかかっているような感じなので、 浅い探索の深さを残り手数で調整すると直りそうな気がしています。 あと、FFOテストの全データをテストできるように登録しましたが、#59を見て、はたと、 途中全滅時のスコア計算が違う事に気づきました。自分のは一番単純なアメリカルール です。ここを直すと、確実に時間が遅くなるような気がしますが、明日直してみます。 てな事をやって、一晩に0.1秒(比率にして7%前後)も短縮していると、まだなんか やる事があるんじゃないかと・・・。
- 372 名前:名前は開発中のものです。 mailto:sage [2015/12/29(火) 03:05:56.17 ID:rs+91GZQ.net]
- 結局MTD(f)をやってるのかやってないのか意味わからんな
- 373 名前:310 mailto:sage [2015/12/29(火) 10:25:40.74 ID:F/Ba7yoX.net]
- って、βカットしない事を確認しなきゃきゃいけないから、ぴったりの答えがあっても
全手を探索しないとダメじゃん。すんません。
- 374 名前:310 mailto:sage [2015/12/29(火) 10:52:28.77 ID:F/Ba7yoX.net]
- >>372
やったりやらなかったりで、いろいろ比較して試してます。 MTD(f)では、ワーストケースではウィンドウ中心が評価値の最少単位で動く関係で、 1石以下の少数計算をする中盤探索では、よけいに時間がかかる事が多いです。 そのため、アスピレーションウィンドウ導入前はただのnegaScoutにしてました。 終盤探索は、最少単位が1石になりますので、許容範囲です。 MTD(f)もアスピレーションウィンドウも、所詮本チャンのnegaScoutを呼び出すための ドライバーにすぎないので、どちらも用意して、何かの折に速度比較しています。 今回は、ボツりましたが、ぴったりの値が見つかったら後の探索を省略する際には、 MTD(f)の方がマッチングが良かったので、そうしました。 ボツになりましたので、またアスピレーションウィンドウに戻りましたが。 #40ではzebraよりはるかに高速化できましたが、#43など遅いケースでは、数倍の時間が かかります。こういうタイプの時間差は、単純な高速化じゃなくて、何らかのアルゴリズム の違いがあるのかなと想像しています。
- 375 名前:310 mailto:sage [2015/12/30(水) 00:01:33.75 ID:lfikhn/D.net]
- 結局、本日は探索速度アップばかりやってました。
中盤探索というか評価関数の計算でBMI2命令を徹底的に使ってみました。 また、ボードの回転操作系も見直しました。 10%程度は高速化できたと思います。でも、期待したほどではなかった。 あと、速度アップするなら、ボードの対角線転置かなぁ。あと効果は微妙だけど、180度 回転がビットオーダーの逆転なので、これも何か組み込み関数があったらうれしいなと。 終盤探索では、FFO#59問題に対処。 スコア計算の修正と、全滅など64石の差がついた時に、βカットと同様に後続の探索を パスして時短。minMaxで言うところのα値の更新があり得なくなるからです。 浅い探索が11手だと3秒程度で解けるのに、15手だと60秒かかったりと、いまいち動き に納得がいかないので、まだ何か問題があるかも知れません。 中盤探索をあと50%は高速化したいなぁ。というか、zebra見てるとできるはず。
- 376 名前:310 mailto:sage [2015/12/31(木) 21:04:10.05 ID:i5TR43+g.net]
- 2015年の年の瀬は、MPC計算のメモリーリークの原因探しで更けていく・・・
置換表クラスあたりっぽいんだけど、デバッグの仕方が良くわからないという・・・
- 377 名前:310 mailto:sage [2015/12/31(木) 23:46:42.84 ID:i5TR43+g.net]
- ギリギリ12時前に直った。
メモリリークではなく、不正なアクセスでした。 多分直ったと思う・・・ 来年の抱負は、MPCの計算をする事と、GUIを作る事です。 元々VBのGUIからDLLで呼び出すつもりでしたが、なんとなくC++でやってみようか という気になってきています。
- 378 名前:310 mailto:sage [2016/01/03(日) 11:08:48.54 ID:3YPfF+nL.net]
- バグは解消してました。なんとも不可思議な事になっていました。
スタック領域を破壊していて、破壊された箇所がたまたまdepth(残り探索深さ)だったため、 探索深さがマチマチになってました。計算時間やメモリ使用量が異常になる以外は、そこそこ それっぽい探索結果が出ていたため、メモリリークだと思ってしまったという。 中盤探索の置換表適用範囲も、ちゃんと効くようになって深さ11〜12まで置換表を使用 するのが効果的と出て、探索値のバラツキもそこそこ揃って、探索時間も予想できる範囲に。 メモリ使用量も安定しました。 ある棋譜に対し、20手目から終局まで順に、深さ1〜17の探索を、反復深化を活用しながら 探索値を求めるプログラムを用意して、14棋譜を対象に実行したところ凡そ7時間で完了。 速度的にはこんなものかなぁという感じ。もっとも、深さ17だと結構、探索時間・ノード数の バラツキが大きいので、10件前後だと終了時刻もバラツクはず。 とりあえず、棋譜からランダムに10件程度を抽出し、この探索結果を貯めていくところまで 作りました。トータル100件程度集めれば、MPCパラメータ計算には十分だと思う。 探索結果を貯めてあるので、毎晩10件くらいづつ追加し、直説法で都度パラメータ再計算 して精度を上げていく事ができる。
- 379 名前:310 mailto:sage [2016/01/04(月) 22:22:10.63 ID:1p46+Vgy.net]
- MPCのための探索データ蓄積の間に、並列処理について調べてみました。
VC++だとopenMPとPPLってのが使えるみたいです。 ?concurrent_unordered_mapが便利そうなので、PPLにしよううかなと。 で、脳内コーディングであれこれ考えていたら、AIの中でBoardクラスを参照渡しして、 差分型で盤面を進めたり戻したりしているのが、とても並列処理と相性が悪い事に 思い至りまして・・・。コピー型に戻して、何をクラス化するのかとか見直してみようかと 言う事に。 多分数日がかりになるかなと。
- 380 名前:名前は開発中のものです。 mailto:sage [2016/01/04(月) 22:36:46.74 ID:iMclxIQO.net]
- Boardはスレッドごとに持てばいいんでない
スレッドを生成するときだけコピーすれば
- 381 名前:名前は開発中のものです。 mailto:sage [2016/01/05(火) 01:07:47.45 ID:UyX0E5Wd.net]
- 自分の場合は将棋作ってて、並列にしたけどstockfishのソースとか参考になるよ
スレッド待機させてノードの終わりの方で判定して、OKなら分割させて そこで上でも言われてるけど、盤の情報をコピーして走らせるの 自分は盤面作成とか更新巻き戻しなどを最初スレッドとか考えてなく直にアクセスしてて 全てポイントにからに変更するのが、かなりだるかった
- 382 名前:名前は開発中のものです。 mailto:sage [2016/01/05(火) 20:35:26.92 ID:zrGyzNpa.net]
- へーこのスレって意外と人いるんだなぁ
将棋作ってる人がいるとは驚き
- 383 名前:310 mailto:sage [2016/01/09(土) 02:12:28.10 ID:GhyCVx1P.net]
- どもです。
とりあえず、コピー方式に変えてましたが、変にバグを仕込んだりして、時間がかかって ました。ようやくデバッグもあらかた終わったのですが、まだ原因不明・解釈不能な速度 差があって、終盤探索のみ速度が10%以上低下した状態です。 というか、コピー版を書きながら気づいた箇所を、ボードクラス版にも反映すると、ボード クラス版が高速化して、差が広がるという。 で、クラス版がFFO#40で1.40〜1.42秒になりました。 >>380さん おっしゃる通りですorz プログラム直しながら、ネットでVC++の解説をつまみ読みしながらのコーディングに 限界を感じたので、オライリーさんの出番という事で、アマゾンに本を数冊注文しました。 到着待ちの間にやるなら、適当に作っていったクラスの整理統合かなぁ。 あと、openMPのお勉強。
- 384 名前:名前は開発中のものです。 mailto:sage [2016/01/09(土) 02:32:30.66 ID:Uphigh+6.net]
- 最近のvc++使ってるのなら普通にstd::threadでやるのもいいかも
- 385 名前:310 mailto:sage [2016/01/10(日) 01:14:26.88 ID:F6Uvkb4b.net]
- うわ。色々やり方あるのね。
VC++だとPPL、openMP、std::threadか。 PPLについては、逐次処理のまま置換表で使っているunordered_mapをconcurrent版に 変えてみたところ、置換表付探索の速度がおおよそ半分になってしまったので、結構 微妙な印象を持っています。 とりあえずopenMPでどこまでできるか試してみて、気に入らなかったらstd::threadで 細かく制御できないか考えてみます。 先ほど、コピー版で置換表登録に影響するバグ発見。直したところ、FFO#40が1.26秒 とかになってしまいました(汗)。不可思議な速度差の原因はこれで間違いないと思います。 edaxまであと10倍の速度アップかぁ。並列化で3倍くらいまで詰められないかと期待。 一応、Boardクラスのポインタ渡し版(差分方式)も試してみましたが、今のところ、若干 速度低下しています。もともとの差分方式は、Boardクラスを継承したAIクラスのメンバ 関数として実装してます。 これらの一見無駄な作業も、バグ探し&逐次探索の速度アップに有効だったという事でorz
- 386 名前:310 mailto:sage [2016/01/11(月) 20:31:40.39 ID:IrhGHm3u.net]
- とりあえずopenMPで並列化トライしてみましたが、コンパイル中に内部エラーになる。
ネットで見ると最適化オプションがらみらしいけど、なんかよくわからなかったのでパス。 PPLを使って、とりあえず並列化のテスト。オセロでは標準的と思われるn段YWBCに してみました。forループみたいな特定の形ではPPLは結構簡単という印象。 バグは一通りとれた状態だと思いますが、FFO#40で1.25秒が0.85秒程度になり 30%強の高速化。あと少しだけソース修正するつもり。 使ってるパソコンは2コアでした。昨夜まで4コアのつもりでいましたが(汗)、2コアなら こんなものなのかな。
- 387 名前:名前は開発中のものです。 mailto:sage [2016/01/11(月) 21:53:26.50 ID:oLh2eOse.net]
- 2コアYBWCにしてはまあまあ並列化されてるような感じ
もちろんもっと効率化はできるけど
- 388 名前:310 mailto:sage [2016/01/13(水) 13:02:44.01 ID:Yd1pcfW8.net]
- どもです。
コア数2だと、理屈の上では2倍近くまでは速度アップできるのかなぁと思います。 一般的にはどのくらいの倍率をターゲットにしているのでしょうか。 YBWCの適用のパターンをいくつか試しましたが、タスクマネージャーで見たCPU使用率 は、ほぼ100%になってるので、単純にはスピードアップは難しい感じがしてます。 PPL自身のオーバーヘッドなのか。 PPLは楽ちんだけど、チューニング箇所がなさすぎな感じ。 あと、YBWCやってる以上、YBの着手をmove orderingする意味が無い感じなので、 sortが一つ省けるかなぁというところ。ルートに近いので、あまり効果は無いと思うけど。 ここまで来ると、8コアのパソコン持ってきたら・・・ SIMD拡張命令だBMI命令だを使っておきながら、コア数2で頑張るのもどうかみたいな。
- 389 名前:310 mailto:sage [2016/01/16(土) 09:10:45.76 ID:mjTPCiWE.net]
- PPLはMicrosoftのDeveloper Networkくらいしか情報が無いので、ひたすらリンクを
たどって情報収集してますが、ほとんど機械翻訳で、結局カーソルあてて英文読ま ないと意味が分からないという・・・ で、排他制御とかいい加減にしていたノード数カウントなどをきちんとして、ソースの見易さ と効率を上げようと色々と細かく修正。combinableとかcritical_sectionとかInterlockedとか。 と・・・思ったら・・・中盤探索で確率10%程度で違う答えが返ってくる・・・ 並列探査のバグはわかりにくくて時間を食ったのですが、どうもcombinableの動作が変。 期待した動作をしていない。でも、情報が無さすぎで、どこを直せば良いのかわからず、 結局同等の機能を動的配列にしてしまった。
- 390 名前:310 mailto:sage [2016/01/16(土) 11:37:48.70 ID:mjTPCiWE.net]
- 中盤探索を1万回程度回して、違った答えが返ってこない事を確認できました。
ノード数カウントはInterlockedIncrementを使っているんだけど、やはり排他待ちロスが 大きいようで、ノードカウントありだと0.8秒前後、無しだと0.7秒前後になる。 使えなかったcombinableみたいな形にして、一つの再帰関数内はローカル変数で加算 して、最後にまとめて1か所で排他加算するようにしてみようかな。 並列タスクの起動順で、探索ノード数が違ってくる関係で、実行時間のバラつきが±0.5 秒くらいになっている。
- 391 名前:310 mailto:sage [2016/01/18(月) 09:54:27.64 ID:ED4vwFCp.net]
- 結局、ノード数・リーフ数カウントは、戻り値を構造体にして返す方向にて検討。
普段の探索には不要だけど、solverだと表示したいので。 これで完全にローカル変数になり、排他ロスを気にする必要がなくなる。 デバッグ用の置換表回りの統計は、所詮デバッグ用なので、一旦全削除。 必要になったら、こちらは#ifdefで囲って、排他加算する。 で、構造体の形であれこれ悩んでいたら、戻り値をクラスにできる事に気が付いて・・・ あらためてC++すげーと感心中。 けど、かなり全面的な修正になるので、時間食ってます。 まずは中盤探索を修正して、ノード数がおかしくない事を確認。 終盤探索の修正はこれから。探索を使う系の統計処理も変更しなきゃならないけど、 MPC以外は、次いつ使うかわからないw
- 392 名前:310 mailto:sage [2016/01/19(火) 00:13:53.27 ID:Dh1WPUXC.net]
- 終盤探索の修正完了。
0.8秒±0.05秒と、結局、Interlockedでグローバル変数のノード数を加算するのと、 大して時間が変わらないか、もしかしたら微妙に遅くなったかも。元に戻すのが面倒 なので、他で改良点を探すしかないかなと。
- 393 名前:310 mailto:sage [2016/01/21(木) 10:04:20.88 ID:c00KCFqr.net]
- YBWCでは、最適着手手順(PV)のラインで置換表でmoveorderする意味が無いという事
を突き詰めていくと、いちいち前回探索の置換表を引くループを回して、都度最善の着手 を求めるのではなく、前回探索で得たPVを渡せば、時間が短縮できそうな気がしてきま した。ツリーの浅い部分なので、全体にどれくらい効くのかはわかりませんが。 また、浅い探索などで最適着手手順を取得する時、negaScout+置換表だと正しいscoutmiss が発生した時に、nullサーチ時の置換表が適用されて、それ以後のPVが得られないという 事で、悩むところではあります。 まずは戻り値の構造体でPVを返すように改造して、効果を見たうえで、YBWCを適用する 深さでnegaScoutをやめてnegaMaxにするか、それともnullサーチは置換表適用外とするか どれが良いか試してみようかなと思っています。 できるだけ高い位置で並列化した方が良いという指摘と、置換表もなるべく高い位置で 効かせた方が良いという指摘の、どちらを優先するのかですね。置換表はばっさり探索 をカットできるけど、並列化はカットせずに時短するので、置換表優先かなという気もして いますが、高い位置でどれくらい置換表が効いているのかもわからないですし・・・。
- 394 名前:310 mailto:sage [2016/01/23(土) 01:31:00.95 ID:0OQfWIYl.net]
- パソコン再起動すると、何かのタスクがCPUを30%くらい占有してしまいます。
昨日まで快調に動いていたのが突然遅くなって、悩んでいましたが、これが原因のようです。 というわけで、本日は色々改変したソースの速度が計測できずに悶々としてました。 色々すったもんだ挙句、PVラインを渡す形にしましたが、効果があったかどうかは微妙。 色々付け足した事で生じた速度低下はペイしたかなぁという感じで、#40で0.78秒前後。 本格的にネタが尽きて来たので、ここから先は、MPCをきちんと実装してiterative widening にかけるしかないかなぁという感じです。あと、定数で渡している置換表適用高さなどの パラメータを、空マスや使用条件で作ると、実用的になるかな。
- 395 名前:310 mailto:sage [2016/01/27(水) 01:18:29.98 ID:IVwAw5rN.net]
- オライリーの並列化本が来たので拾い読みしながら並列プログラミングの勉強。
PPLの各アルゴリズムが何を目的とするものなのかが、少しずつ分かってきました。 抽象化度が高いので、最初のとっかかりとしては良いかも。何故かcombinableが 上手く動かないとか、parallel_reduceの中身がよく分からないとかありますが。 で、並列化できるところを探して速度が上がるか試したり、同じ処理をより綺麗に書き 換えしたりして、微妙に速度アップし、0.70〜0.75秒くらい、ノード数が15M、NPSが21M nps程度になりました。たまに0.68秒台が出ます。 Edax4.3のFFOベンチの結果を確認したところ、ノード数で1.5倍、NPSで4倍、計6倍の 差があります。NPSをコア・クロック換算しても1.5〜2倍の差があり、ノード数は別として、 まだ速度アップの余地があるのではないかという事で、単品速度アップに走ってます。 ノード数はMPC導入後のiterative wideningである程度追い付けるかなと淡い期待。 いくつか速度アップネタがありますが、サッカー日本代表見ながらでははかどらず。 続きは明日。
- 396 名前:310 mailto:sage [2016/01/29(金) 11:31:08.14 ID:trvaxUQ+.net]
- 先日の速度アップネタはすべて不発でしたが、その際にノード数のカウント漏れを見つけ
て、修正したところ、ノード数は17〜8Mという感じでした。その際に、最終2手高速化の 箇所でもカウント漏れがあり、まずは正確なノード数を簡便に把握しようと外してみたところ、 意に反して速度低下しないところか、どうも微妙に高速化したように見えまして(汗。 最終3手高速化を試してみたり、最終1手高速化も外してみたり、moveorder適用とか、 そもそもmobilityを求めずに空マスを順に着手してみるとか、その辺の適用深さを変えて みたりいろいろとやって現時点の最適パラメータにしてみたところ、0.63〜0.68秒、最速で 0.60秒が出るようになりました。 αβカットの効きが悪くなっているため、ノード数は24〜25Mとなりました。 その分NPSは37〜38Mと速くなっていますが、こんな方向で高速化してて良いのか? というわけで、ノード数が違う段階でNPSを比較しても意味が無いという事に気が付きました。
- 397 名前:310 mailto:sage [2016/01/30(土) 20:51:37.62 ID:yCKBToEa.net]
- 囲碁がすごい事になってますね。オセロで一通り勉強したら小さい盤の囲碁をやって
みようと思っていたので、モチベーション低下中。とはいえ、ああいうのをオセロに応用 しようとしたら、あそこまでマシンパワーいらないんじゃないかとか・・・。 ここのところ、もっぱらSTLやPPLの機能を綺麗に使う方向での改良ばかりしてました。 pararell_reduceの使い方もわかりました。negaScoutの繰り返しループが綺麗に並列化 できたんじゃないかと。ただ、MAPする件数がしれているので、parallel_reduceではなく 逐次版のaccumlateの方が速いという結果に。あと、時間計測が結構飛び飛びの値に なるので時間計測関数を精度1msのものに変更。 色々やった結果、若干高速化したうえで、時間のバラつきが消えてくれました。 100回試行で計測すると610ms±15ms(1σ)となり、逐次処理のほぼ2倍の速度に。 ノード数は同程度で、NPSは40M超えて来ました。このNPSのままノードを半減できれば 良いのに。
- 398 名前:310 mailto:sage [2016/02/07(日) 21:48:19.14 ID:xNqeS9Ve.net]
- ここら辺で、EDAXとかとの速度差の原因を考えたところ、次の2点が考えられました。
1.評価関数の精度が悪い可能性 2.個々の関数で速度アップの余地がある可能性 という事で、1は熟考が必要なので後回しで、速度アップの対象として、flipとmobilityの 高速化を検討。とはいえ、良い知恵があるわけでもないので、ネット徘徊。 現在、ポインタ関数で分岐して処理しているflip関数を1発で処理するopenCLのソースを 発見。Master Othelloの作者のものでEDAX4.3のflip関数を参考にしているらしい。 中身を解読するとベクターを使っている。とりあえず処理を真似て逐次処理で組んでみたら 結構速度アップしました。 解読の過程で、ようやくベクタ化の意味がわかったので、mm256系の命令を使って、 ベクタ化してみましたが、若干速度低下。原因は恐らくlzcntで一回ベクタを抜けてしまう 所だと思うので、ハッカーのたしなみを読んでベクタ演算で組み直してみる予定。 合わせてmobility関数もベクタ化。若干速度アップしたかなという程度。 組み込み関数は使い方が面倒臭いので、演算子のオーバーロードしまくってみました。 flip関数は非ベクタの分岐無しバージョン、mobilityはベクタという状態で、500msを切る 数字が出るところまで来ました。flipのベクタ化ができて、パラメータ調整するともうちょい 良い数字が出るかなと期待。
- 399 名前:310 mailto:sage [2016/02/09(火) 01:09:41.58 ID:MeGl+gwc.net]
- flip関数続き
・lzcntを自前で組んでみましたが、やはり処理が重く速度低下。ボツ。 ・右方向と左方向で処理が違うので、片側+180度回転で、同じ処理にしてlzcnt不使用 にしてみたが、180度回転×4が重くて速度低下。ボツ。 ・できるところまでベクタ化して、lzcnt以後はスカラ計算で、速度若干改善。 ・上記からlzcnt後、再度ベクタ化してみたら、速度若干低下したのでボツ。 ・64bit×4の値を代入する関数を変更したら、意に反して結構速度改善。 ・闇雲に__declspec(align(32)) してみたら若干速度改善してバラツキ減少。 これらにより、450msくらいになりました。 ベクタ化はまだ何かありそう。 ちゃんと書いてなかったですが、途中からノート数カウントを外してます。入れると100ms 程度の速度低下になります。一応、デバッグ用に#ifで切り替えられるようになってます。 が、そんな状態なので、nps計算に意味が見いだせないという・・・。 続いて評価関数をベクタ化できないか考えましたが、BMI命令使っているので厳しい。 計算楽にするため、でかい配列を何回も引いているので、ここを何とかしたい気がする。 黒・白・空の3を基数とする3進数でナンバリングしているんだけど、高速で計算する方法 が見つからず。 平衡3進法を手早く計算する方法があると、黒を1、白を-1、空を0にして、定数足すとか できるんだけど、どんなに調べても、基数変換に王道なしという言葉しか見つからない。
- 400 名前:名前は開発中のものです。 mailto:sage [2016/02/15(月) 00:14:34.50 ID:2rfyeFpJ.net]
- 高速化については一旦棚上げ。何やっても速度が上がらない。
ひたすらノード数カウントの速度低下を抑えて、カウントのバグ取りして。 色々発見はあったけど、結局ソースを綺麗にしただけだった。 後は、いずれゆっくり時間をかけて、評価関数を作り直すかな。 MPCを組みました。一応動作している模様。 これからしばらく、GUI作りに入ります。 MFCよくわからん。
- 401 名前:310 mailto:sage [2016/02/20(土) 13:43:08.30 ID:ZGi2V8ih.net]
- GUIできた。昔作った序盤定石部分と合体。
中盤探索を反復深化にして、3秒を超えて新しい深さに入らないあたりで調整。 MPCで25手くらいまで読めるように調整。 終盤完全読みは38手から。36手からMPC付で完全読み(つまり完全ではない)。 こんな感じでできたので、早速プレイ。自分だと軽く全滅負けしてしまうので、zebra先生 にお越しいただきました。が、滅茶苦茶弱い。 良く見ると、定石が効いている段階で+16だったのが、中盤読みになった瞬間に一気に −14くらいまで落ちて、そのまま挽回できない感じ。zebra先生は、その前に定石から外れ て、既にzebraから見て+14程度の評価値を算出している。つまり、定石部分がおかしい。 それ以外は、評価値もzebraとは大きく違わないし、終盤探索もちゃんと機能している感じ。
- 402 名前:310 mailto:sage [2016/02/20(土) 23:06:47.33 ID:ZGi2V8ih.net]
- zebra先生にならって定石の評価を表示するオプションをつけてみました。
ロジック的には間違いなさそうですが、定石DBがおかしいというか、定石に登録がない 手順に正しい変化があって、それを無視しているため、間違った判断をしているみたい。 一応、完全読みという触れ込みの棋譜を元にしているはずなので、使い方をどこかで 勘違いしているんだと思います。しばらく悩むしかなさそうです。
- 403 名前:310 mailto:sage [2016/02/21(日) 01:04:17.33 ID:nPWuqcvw.net]
- 試しに定石部分を外して、中盤探索で開始してみたら、zebraの20手読みに対して
2戦して1勝1分となりました。読みの深さは、こちらが上なので、こんな感じでしょうか。 序盤20手分は評価値が無いので、20手近い探索を反復無しで探索するため、MPCを 使っても最初の数手は1手あたり5分以上掛かってしまいます。 定石については、以前にウェブで見つけてテキストに起こした定石データがあるので、 それを評価0で登録してみようかなぁと思っています。 定石の自己学習とか、評価付けとか、どうやるんだろ。
- 404 名前:310 mailto:sage [2016/02/25(木) 21:06:56.39 ID:fXRsnvrs.net]
- 定石データを、上記の手打ちデータで作り直しました。
当初は並び取りとかの極端な進行以外は評価0.0にしたため、mobility関数のビット列 の下から定石に従って着手する形となり、zebra先生のBookに誘導されるように、少しずつ 不利な定石に乗り換えていき、負けるという展開に(汗 悔しかったので別のソフトを拾い、戦ってみると、そちらには圧勝。決して弱くはないと思う。 また、zebraとの対戦時にBookで評価値がついているものは、それを参考に修正したところ、 時々勝てるような感じになりました。 EDAX先生+UnifiedBookなるものを拾って、そちらと戦ってみたところ、軽く惨敗。 fjt定石とかだと終盤近くまでBookがあるみたいで、Bookが続く限り紛れが無い。 こちらが中盤探索などでミスるたびに−2づつ落としていき、お話にならないレベル差を感じました。 しばし熟考の上、定石の拡張、評価付けを考えてみようかと思います。 あと、評価値が近い時には、何らかの確率で手を選択するようにもしてみたいと思います。
- 405 名前:310 mailto:sage [2016/02/28(日) 01:10:48.52 ID:hQzoi2Tz.net]
- 縦取り系は白番黒番試して、定石の評価値を修正してみました。
あと、AIの進行ごとのパラメータを試行錯誤して、なるべく負けないようにしてみました。 これにより、AIの読み時間が結構伸びて、1ゲームワーストケースで1手2分、トータル 5分くらい思考してしまいます。これは、反復深化などで、タイムアップをせずに、次の ステップに入る制限時間だけ決めているためです。 EDAX+Unified Book先生はレベル21で、黒番白番ともに引き分けになります。 こちらは20手前に定石が切れていますが、その後も最善手が打てているという事になり ます。こちらは何局打っても手を変えないので、EDAX先生のBookの進行に合わせた だけですが。一方zebra先生は比較的手をいろいろ変えてくるので、勝ち負けが発生します (もちろん、各アプリの設定次第ですが)。 序盤定石の評価値をそれなりにしたら、後は引き分け進行をひたすら登録していって、 相手が最善しか着手しないと信用すると負けないプログラムができちゃうのではないか と、ふと思いましたが・・・。トップ同士の対局が引き分けばかりになるのは、こういう事 なんでしょうね。というか、完全解析ってこれが完成した状態なのか。 EDAX先生のUnified Bookは、いくつかの引き分け進行棋譜の集合体のようですが、 元データが幸い既知のWthor形式なので、それをもらってしまうと、トップレベルになる のかなぁ。トップな人がBook構築に主眼を移したり、開発が止まったりする訳だと。 そろそろ、混とんとしているプログラムを綺麗に直して、パクリBook作って開発終了しちゃ おうかと思い始めています。速度的には、まだまだ改善の余地はありそうですが。
- 406 名前:じょげなら ◆kXDiHQuNQ2 mailto:sage [2016/02/29(月) 19:18:07.19 ID:etqtABZA.net]
- ライフゲーム囲碁というゲームのネット対局場を作りたいです。
囲碁でいうKGSみたいなのが理想です。 プログラムはある程度わかりますが、ネット関連の知識が乏しいです。 何から始めればいいですか?
- 407 名前:名前は開発中のものです。 mailto:sage [2016/02/29(月) 19:21:39.28 ID:etqtABZA.net]
- URLがNGワードに引っかかる…
- 408 名前:名前は開発中のものです。 mailto:sage [2016/02/29(月) 19:34:26.59 ID:etqtABZA.net]
- 好きな言語
C++ C# Ruby 嫌いな言語 Java Python Perl
- 409 名前:406 mailto:sage [2016/03/01(火) 20:52:33.32 ID:6wFQeZGp.net]
- とりあえずHTML5の本買ってきた
- 410 名前:406 mailto:sage [2016/03/03(木) 19:44:49.47 ID:Hi4nZgiL.net]
- fast-uploader.com/file/7012557196681/
碁石をぽちぽち置けるところまで作った
- 411 名前:310 mailto:sage [2016/03/04(金) 10:15:09.55 ID:Q4DtXsqP.net]
- >>410
一晩考えてみた。 通信回りに興味を持って遊んだのは15年くらい前だし、Javaとかイメージしかないし。 あまり助言できる事はありませんが、一つ言えるのは、UIに凝ったりサービス内容を 考えたりするのは最後で良いと思います。 Rubyが好きなら、まずはCGIベースで、テキスト表示で対戦を実現する仕掛けを作る事 だと思います。次に複数のユーザーが接続するのであれば、身元確認のためのID/パス ワード管理が必要になりますし、個々の対戦を区別するにはセッション管理が必要になり ます。この辺は、スタンドアロンのアプリには無い、独特の世界なので、結構新しい技術、 テクニックの習得が必要になるかと思います。いまどきあるのかわかりませんが、チャット のスクリプトとかあれば、参考になるかも。 その辺から入り込んで、いろいろ調べていくと、だんだんと必要な技術、知識が増えてくる んじゃないかと思います。
- 412 名前:406 mailto:sage [2016/03/04(金) 18:58:38.77 ID:w3YPuhPg.net]
- >>411
レスありがとうございます。 確かにセッション管理とか知らないです。 チャット調べてみます。
- 413 名前:406 mailto:sage [2016/03/07(月) 21:05:27.22 ID:NI+TTWmM.net]
- RoRの本買ってきた。
チャットはまだ調べてない。
- 414 名前:名前は開発中のものです。 mailto:sage [2016/03/09(水) 19:45:29.94 ID:Cf1/SDqU.net]
- うおおおおセドルがああああぁぁぁ
- 415 名前:310 mailto:sage [2016/03/10(木) 02:00:10.79 ID:hvbQwbFh.net]
- うむむ。
これにて、オセロができたら次は囲碁という目標が雲散霧消してしまいました。 どうしよう。
- 416 名前:310 mailto:sage [2016/03/10(木) 18:05:03.79 ID:b1SmaPOg.net]
- AlphaGO強すぎ・・・orz
今夜は、囲碁関係者だけじゃなく、AI周りの人も、Google以外全員お通夜ですね。
- 417 名前:名前は開発中のものです。 mailto:sage [2016/03/10(木) 19:38:43.78 ID:SphVvbk5.net]
- 310氏もalpha碁注目してたか。
セドル一発入れてほしいなぁ
- 418 名前:名前は開発中のものです。 [2016/03/11(金) 09:04:36.30 ID:HTdTU0Fi.net]
- 浮上
- 419 名前:名前は開発中のものです。 mailto:sage [2016/03/12(土) 12:19:15.41 ID:k2nAbsiz.net]
- おお、このスレ生きてたんだ
なんで RoR なんか見てるのよスレ間違えたかと思った
- 420 名前:名前は開発中のものです。 mailto:sage [2016/03/13(日) 18:01:59.50 ID:X9umXTnK.net]
- せどるううううッよくやったあああああぁっ
人類の勝利やあああぁぁっ
- 421 名前:名前は開発中のものです。 mailto:sage [2016/03/13(日) 19:02:49.19 ID:Gv0++KTh.net]
- お、第四局はセドル勝ったか
- 422 名前:310 mailto:sage [2016/03/13(日) 20:47:23.70 ID:50OeMIN8.net]
- うむ。なんか期待を裏切られっぱなしw
この負けっぷりを見ると、囲碁もトライしたくなってくる希ガス。
- 423 名前:406 mailto:sage [2016/03/15(火) 20:44:49.53 ID:NF77F+OG.net]
- RoRとjavascriptの連携がよくわからん。
でもちょっとづつだけど進んでる。
- 424 名前:310 mailto:sage [2016/03/16(水) 23:06:52.43 ID:YEZK1fac.net]
- アルファ碁ロスまっただ中ですw
オセロ作ったおかげで、一連の勝負をいままでとは違う視点で見れたかなぁ。 とりあえず、囲碁のモンテカルロ解説した本と、ディープラーニングの入門書を 買ってきた。さらっと読んだけど、ディープラーニングは理解に時間がかかりそうorz オセロで3層パーセプトロンを試したときは、結局うまく動かなかった。 実装が悪いのもあるけど、学習にもすごく時間がかかった。 あれをディープにしたら、どうなっちゃうんだろうかは不安ではある。 こちとら、SurfacePro3しかないし(汗
- 425 名前:406 mailto:sage [2016/03/19(土) 20:06:25.11 ID:Ik15FlWh.net]
- railsでdeviseとかいうgemをつかってユーザー認証機能実装したけど、
複数ユーザーがログインして対局させる方法がサッパリわからん。
- 426 名前:406 mailto:sage [2016/03/24(木) 20:20:54.97 ID:C08ak5N3.net]
- ブラウザ閉じたときに自動ログアウトのやり方がわからん
- 427 名前:名前は開発中のものです。 mailto:sage [2016/03/25(金) 13:51:48.34 ID:9Ea9sx62.net]
- ブラウザは通信があった時にしかクライアントの消息が確認できない。
n分アクセスが無かったらサーバー側で勝手にログアウトさせちゃう タイムアウト方式が普通かなと。その時間経過後にアクセスがあっても ログインからやり直し。 このログインからタイムアウト(ログアウト)までの間をセッションと呼ぶ。
- 428 名前:名前は開発中のものです。 mailto:sage [2016/03/25(金) 14:16:19.46 ID:9Ea9sx62.net]
- 1行目おかしかった。
>WEBサーバ、ブラウザという仕組みは、ブラウザから通信があった時にしか、 >サーバーはブラウザの消息を確認できない。 に修正。 1.初画面からログインする 2.サーバが、HTMLにセッションNoを埋め込んで、ブラウザに表示。 サーバでは、セッションIDを配列などで管理して、IDと最終アクセス時間をとっておく。 3.ブラウザ側からのCGIリクエストには、必ずセッションNoを入れて送信。 セッションNoで、相手がだれか(ID)を特定して、処理を行う。 つまり、個々の処理はセッションNoで管理されている。 4.ブラウザからCGIリクエストが来た時に、タイムアウトしていたら、ログアウト処理へ あと、ゴミ掃除で1日1回くらいタイムアウトしているものを削除。 この辺が基本。対局型の場合。 5.2つのセッションが対局している事になるので、対局管理する配列を用意。 6.相手の着手待ちの時に、どうするのか?その辺が肝。 HTMLに細工して、1秒ごとにリロードさせる。リロードにより、着手が行われたか それとも秒読み時間切れになったか?判断をサーバーに依頼する。 などなど。やり方は色々あるかと思う。 とにかく、肝は、情報がブツ切れで、あちこちにある事。これにより、サーバーで簡単に判断 ができない事があるので、いくつかの機能をブラウザスクリプトに依頼しなきゃならん。 それでも、相手が放置して逃げた時、ブラウザを閉じて逃げた時(回線切断やPCダウン)、 などなどの例外が起きるので、それらをタイムアウト検出などで拾わにゃならん。 どうするのかなどの、例外処理をリストアップして、一つずつ対応を決めていく事。 プログラムテクニックはどうとでもなるけど、例外事象の拾い上げの方が大変。
- 429 名前:406 mailto:sage [2016/03/25(金) 17:43:19.31 ID:/V6G/Eic.net]
- 丁寧にありがとうございます。
javascriptのwindow.oncloseからなんとかならないかといろいろ調べていましたが、無理筋なんでしょうか。 タイムアウト検討してみます。
- 430 名前:名前は開発中のものです。 mailto:sage [2016/03/26(土) 21:27:54.24 ID:DUGO8n57.net]
- >>429
そういう事を考えるんなら、Javaアプレットとか、ActiveXとかの、 ブラウザ上で動いて通信できる方法を試した方が良いかもね。
- 431 名前:406 mailto:sage [2016/03/30(水) 21:45:07.64 ID:yYbYes7U.net]
- すいません、教えてください。
4.ブラウザからCGIリクエストが来た時に、タイムアウトしていたら、ログアウト処理へ あと、ゴミ掃除で1日1回くらいタイムアウトしているものを削除。 このゴミ掃除というのはサーバー側がクライアント側から何のアクションも受けずに 能動的にタイムアウトしているセッションをみつけ削除するということですか? どうやって書けばいいのかわからないのですが…
- 432 名前:名前は開発中のものです。 mailto:sage [2016/03/30(水) 23:26:15.10 ID:DNbQONAE.net]
- >>431
そうです。別にしなくても良いし、月1回手作業で削除しても良いけどね。
- 433 名前:406 mailto:sage [2016/03/31(木) 20:31:39.10 ID:dkaj1Oq1.net]
- >>432
手作業ですかうーん。 まあ、頭の片隅に置いておきます。 ありがとうございます。
- 434 名前:名前は開発中のものです。 mailto:sage [2016/04/01(金) 19:52:02.46 ID:JLskKsZt.net]
- 隠しコマンド受け付けるようにしておいて
管理者のクライアントから定期的にコマンドを投げればいい
- 435 名前:310 mailto:sage [2016/04/05(火) 10:45:13.03 ID:82XTVDoH.net]
- 久々登場。アルファ碁ロスがでかすぎて、やる気がでないです。
とりあえず、BOOK上で乱数入れて手をばらけさせるようにしました。あとの課題は、 1.持ち時間制度 2.ステータスバーの更新 標準のStatusBarだとOnMouseMoveなどで更新されるとの事。 リアルタイムに更新させるためには、マウスくるくるさせてなければならん。 3.中盤探索の高速化 反復深化+置換表で高速化が効いていない懸念があるけど未確認。その他の高速化検討 4.同じ手順で負けないためのBOOKの自動学習 5.オフラインでの引分手順の自動生成 となります。けど・・・本当にモチベーション上がらない。 時々、気が向いた時に、Zebra先生やEDAX+UB師匠相手にポチポチ手打ちで対戦して、 相手のBOOKに登録されている引き分け手順を見つけて、手入力でBOOK更新してます。 Zebraは研究モードがあるので、ほぼ拾い終わりましたが、逆に引き分けだらけになりました。 EDAX+UB相手だと、こちらが定石から外れるケースでも、EDAX側は学習データで先が 見えていて打ってくるので、ほぼ負けになります。 たまに、EDAX+UBも中盤探索が走ってくれて、極まれに勝勢になる事がありますが・・・ 何が腹が立つと言って、そういう時に限って完全読み時にEDAXがバグって、既に石がある 所に着手して逆転した事にされます。もちろん反則なので勝利は勝利ですが、すっきりと 勝たせてもらえないのが腹立たしい。をのれ。 というわけで。やはりオセロは、引き分け手順のリストアップが、強さの肝である事も再確認 してしまいまして。そこまでの根性は無いなぁというのも、モチベーション低下の原因。
- 436 名前:406 mailto:sage [2016/04/06(水) 22:31:38.47 ID:SXJnF3U3.net]
- ログインユーザー一覧表示できるようになりました。
RoRのコーディングは一休みして棋譜管理にとりかかろうと思ってます。 SGFをパクろうかとおもってますが、結構難しい orz.
- 437 名前:406 mailto:sage [2016/04/08(金) 22:18:30.78 ID:kkoRA2nm.net]
- 棋譜ツリー表示すんの結構メンドクサイような希ガス
いいライブラリはないんか
- 438 名前:406 mailto:sage [2016/04/09(土) 23:59:42.58 ID:SBv5rCvL.net]
- KGSのレーティングシステム難しい。
まだそんなこと考える段階じゃないけど。
- 439 名前:406 mailto:sage [2016/04/11(月) 21:25:49.37 ID:A4FL2sT8.net]
- javascriptでオブジェクトの比較ってjsonで変換してそれを比較しろとか某ページで見たけど
そんな事せにゃならんの?
- 440 名前:406 mailto:sage [2016/04/12(火) 23:02:53.74 ID:xYnFmhAQ.net]
- textuploader.com/5w3sq
棋譜ツリーだいぶ形になってきた。
- 441 名前:406 mailto:sage [2016/04/16(土) 22:59:10.60 ID:MXucFBba.net]
- Rails側とjavascript側の連携がやっぱわからん。
色々めんどくさすぎ。
- 442 名前:406 mailto:sage [2016/04/23(土) 00:16:56.63 ID:Gce7F8Ms.net]
- エンコード間違えてて動かなかったわ。
railsがログ吐いてくれてなきゃ一生気づかなかっただろうな。
- 443 名前:406 mailto:sage [2016/04/27(水) 21:48:14.23 ID:JGExYAi7.net]
- 開発に使ってたノートのキーボードが一部効かなくなったわorz.
windowsにログインできなくて焦った。 アカウントでも乗っ取られたのかと思ったらソフトキーボード使ったらログインできた。 USBキーボードとかで代用できればいいんだがどうかな〜。
- 444 名前:406 mailto:sage [2016/05/02(月) 21:58:59.67 ID:i7WwatVD.net]
- invalid multibyte character
とかってエラーが出るんだけど、どこに全角があるのかさっぱりわからん。 app/controllers/application_controller.rb:1にあるらしいんだけどいくら調べてもみつからん。
- 445 名前:406 mailto:sage [2016/05/02(月) 23:06:51.86 ID:i7WwatVD.net]
- 以下のログが出るんだけど、だれか原因わかる人いない?
Started GET "/" for ::1 at 2016-05-02 22:55:10 +0900 ActiveRecord::SchemaMigration Load (1.2ms) SELECT "schema_migrations".* FROM "schema_migrations" ArgumentError (invalid multibyte character): app/controllers/application_controller.rb:3:in `<top (required)>' app/controllers/home_controller.rb:5:in `<top (required)>'
- 446 名前:406 mailto:sage [2016/05/03(火) 11:00:58.43 ID:6pwgCgml.net]
- すいません、解決しました。
- 447 名前:406 mailto:sage [2016/05/13(金) 22:42:29.22 ID:Zx20RSfa.net]
- やはりポーリングだけでは限界があるか?
- 448 名前:310 mailto:sage [2016/05/16(月) 21:32:31.63 ID:KQ1qSDyb.net]
- モチベーションダダ下がりだったけど、なんとなくソースの整理していたら、
直したいところがいろいろ出て来て、見直し中。 後ろ向き枝刈で探索時間は変わらないけど、探索ノード数が2/3になった。 この枝刈手法の速度アップできたら面白いかもと思いつつ、元々自分が 結構高速に書いていた処理(未使用)を流用しているから、これ以上速度アップ できるかわからん。 でも、EDAXには勝てないんだろうなぁ・・・ EDAXの孫情報からインスピレーション得てるネタだし。
- 449 名前:310 mailto:sage [2016/05/26(木) 16:01:37.05 ID:ZBCA70ec.net]
- 遅々として進んでいます。
ソースを一から組みなおして、いろいろと綺麗にしてます。 並列探索を入れない段階で、FFO#40が結構速くなった。 いまさらながらに、FFOテストを40〜59まで実行して比較しようとしたところ、 前から薄々気づいていたけど、FFO#41以後が遅い。酷いケースになると 探索ノード数が10倍=時間も10倍になる(#51)。自分のは指数関数的に 比較的にきれいにノード数が増加している。同じようなノード数のものもあるので、 ZebraやEdaxはどこかで上手にばっさり刈り込んでいる感じ。#52以後は時間が かかりすぎて、未検証ですが。 ZebraやEdaxもノード/秒が一定しているので、置換表みたいな重い方法では なく、簡単な方法で刈り込んでいるっぽい。とすると、moveorderかなぁ。 一応、MPCの99%で評価値の並び順は置換表に残してあるので、そんなに 間違った順番でソートしていないと思うんだけど。 あと、mtd(f)だと最初から最後までNullサーチしかしない事に思い至り、そこで 処理の効率化できる箇所が無いかと考えてます。Nullしかやらないんなら、 アルファ越えの再探索でウィンドウを広げる必要もないわけで。逐次探索部分 では効果不明だけど並列探索だとYBWCでPVを検索し終わるまで待つ必要が そもそもない(仮アルファを求める必要がない)ので、多少速度アップできない かなぁと。
- 450 名前:310 mailto:sage [2016/05/27(金) 00:36:10.52 ID:gIFpjm1c.net]
- 早々に状況が判明しました。ここに書くと進むんだよなぁ。
mtd(f)+negaScoutで繰り返し探索しながら、置換表に置換データを置いて、更に それを並び替えに利用していたのですが、最初にPVを探索してしまうと、その後は 別の着手も評価値がαになってしまい、並び替えの意味が無くなっている感じです。 ちなみにPVだけは別ルートで必ず先頭に探索するようにしてあります。 というわけで、テスト的に初段のみ敢えて並び順を逆転させてmtd(f)を未使用にして ただのnegaScoutで、mpc99%→全探索をしてみたところ、探索ノード数がかなり減り ました。置換表使用の深さ全部で並び順を逆転させてみたら、mpcの99%ですら全く 終了する気配がなくなりました。 さて、どうやって実現しようかなと。 今のところ、mpcはかなり高速なので、これをnegaMaxにして。 いわゆる並び替え専用の浅い探査にしようかなと。
|

|