Hidehisa Akiyama
hideh****@aist*****
2009年 8月 25日 (火) 12:53:57 JST
秋山です. 有用そうなのでSimJPにもCcしておきます. Keisuke Endo wrote: > 現在RoboCup上で学習実験を行っており、 > 乱数列を固定して再現性のある実験を行いたいと考えています。 > > librcscとチームのソース、rcssserverのそれぞれでseedを固定すれば、 > 処理落ち等が無い限り同じ結果になると考えて大丈夫でしょうか? > また、librcscとrcssserverで乱数のseedを固定する方法、オプション等はありますか? > (rcssserverに関してはsim-jpの方で、ということであればそちらに再投稿します) > > RandomEngineクラスのコンストラクタに直書きすればseedを固定できそうですが、 > より良い方法があれば教えて頂きたいです。 結論から言うと,現状ではrcssserverで完全な再現性を得る簡単な方法はありません. librcsc-3.1.0以降では,librcscに手を入れないのであれば,ライブラリ内部で 使用している乱数のシードは固定されています. RandomEngineクラスやその他のUniformRealクラスなどを自分のチームで使う 場合は,以下のようにシードをセットする処理をmain関数の最初に呼んでおけば シードが固定されるはずです. #include <rcsc/random.h> int main( int argc, char **argv ) { rcsc::RandomEngine::instance().seed( 123456789 ); ... boost::randomが分かるのであれば,乱数生成オブジェクトとそのシードを boost::randomを使って独自に管理した方がより確実です. rcssserverについては,ヘテロジーニアスプレイヤ生成に関する乱数シードは オプションで設定できます. ~/.rcssserver/player.conf などで player::random_seed = 123456789 のように設定すればヘテロのパラメータに関しては固定されるはずです. しかし,その他の乱数に関してはサーバの起動時間が乱数シードとして使われて いるので,リリースパッケージのままではシードを固定する手段がありません. rcssserver-13.2.2では,field.cppの164〜166行目に乱数シードを設定するコードが 書かれているので,ここを書き変えればシードを固定できるはずです. ただし,乱数シードを固定できたとして,さらにsynch_modeで動かしたとしても, 各プレイヤからサーバへのコマンド到着順序を固定しなければ完全な再現性は 得られません. 現状,サーバに直接手を入れない限り,これを実現する方法は無いと思います. synch_modeを使うのは前提として,field.cppの2548行目付近にあるdoSendThink() を改造すれば何とかなると思いますが,ざっと見た感じでは,それなりに手を 入れないといけなさそうです. 需要はありそうなので(自分も欲しいので),次期バージョンのrcssserverでは 乱数シード固定を含めて完全な再現性を実現する仕組みをサーバ本体に組み込む ことを提案してみます. 多分,反対する人もいないでしょうし実現すると思いますが,すぐにはリリース できません. とりあえずパッチを作ってみるつもりですが,ちょっと時間がかかるかもしれません. -- Hidehisa Akiyama hideh****@aist*****