デバッグ完了?
http://d.hatena.ne.jp/Gasyou/20120225/1330175123 で書いたバグの件。
http://d.hatena.ne.jp/Gasyou/20120229/1330512343 の「「4番目の合議クライアントが探索中」かつ「飛び利きが伸びる手*1」」って条件は間違ってました。正確には昨日書いた「5番目のクライアントが行動選択する時」でした。
んで、原因。1インスタンスが2.6GBほどのクラスを作ると、メモリ上での配置がおかしくなるのが原因みたいです。
こういうコードでインスタンスのメンバ変数のアドレスを、ヘッダファイルの上から順に出力してみます。
printf( "positions== 0x%p\n", &this->positions ); printf( "poloicies== 0x%p\n", &this->policies ); printf( "evaluators== 0x%p\n", &this->evaluators ); printf( "gameCount== 0x%p\n", &this->gameCount ); printf( "samplingCount== 0x%p\n", &this->samplingCount ); printf( "maxDerIndexArray== 0x%p\n", &this->maxDerIndexArray ); printf( "selectedMoveArray==0x%p\n", &this->selectedMoveArray ); printf( "pvArrays== 0x%p\n", &this->pvArrays ); printf( "scoreArrays== 0x%p\n", &this->scoreArrays ); printf( "finalTargetTurn== 0x%p\n", &this->finalTargetTurn ); printf( "piArrays== 0x%p\n", &this->piArrays ); printf( "returnArrays== 0x%p\n", &this->returnArray );
結果はこうなります。(Windows 7 Home Premium x64、Visual Studio 2008、WIN32コンソールアプリケーション x64バージョン。)
positions== 0x000000007FFF0048 poloicies== 0x000000008251E008 evaluators== 0x00000000E9015448 gameCount== 0x00000000E9015488 samplingCount== 0x00000000E9015490 maxDerIndexArray== 0x00000000E9015498 selectedMoveArray==0x00000000E90154D8 pvArrays== 0x00000000E90164D8 scoreArrays== 0x000000001C9164D8 finalTargetTurn== 0x000000001EE964D8 piArrays== 0x000000001EE964E0 returnArrays== 0x00000000214164E0
どうも、scoreArrays以降はアドレスの上位32ビットが0で埋められているっぽいです。
結局、policiesとpiArraysの2つのメンバ変数を配列から配列へのポインタに変更し、1インスタンスで2GBを超えない様にすると治りました。
…コンパイラの仕様なのかバグなのか知らないですが、警告なりエラーなり出して欲しかったな〜、コンパイル時に。
あと、このバグは合議+方策勾配法固有のバグでした。方策勾配法のバグだったら、状況改善したかもしれないのに。残念。