[rc-simjp 614] Re: [Rctools-users 447] 乱数の固定について

Zurück zum Archiv-Index

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*****




Rc-oz-simjp メーリングリストの案内
Zurück zum Archiv-Index