ノート
訪問数 2046  最終更新 2008-02-03 (日) 15:46:52

EPMRを読んでみる 〜 流れ?

  Epmr epmr(cout)      main.cpp 39  Epmrのインスタンスepmr生成
       |                               Epmrのコンストラクタ(Epmr.cpp 54-60)実行
  main.cpp 41-133      コマンドオプション解析・epmr.SetOptionsによるオプション設定
       |
  main.cpp 134-161     オプション以外のパラメタ設定
       |
  epmr.Optimize(0)     main.cpp 163。実際に呼び出されるメソッドはIterativeOptimizer::Optimize(0)
                             Initialize( solution );
                             while ( ! Converged() ) {
                                   Step();
                             }
          |
     epmr::Initialize(0)   Epmr.cpp 186
          |
        中略 インスタンスepmr内の変数を初期化する?
          |
 --> while ( ! epmr::Converged())      Epmr.cpp 674
|                bestScoreがscoreThresholdを越えていて(maxかminかで符号が違う)
|                firstTargetIndex >= cells.size() ならば、Trueになる
|              |
|        epmr::Step()                  Epmr.cpp 479
|                  |
|           Solutionのインスタンスbestを作成
|                  |
|           第1回目(attempt==1)ならいくつかの初期化
|                CalcStaticStructureContibution()を計算
|                optimizerを消しておいて、CreateGlobalOptimizer() 〜 EvolutionaryOptimizerのインスタンスを作る
|                localOptimizerを消しておいて、CreateLocalOptimizer 〜 SolutionSimplexMinimizerのインスタンスを作る
|                  |
|           optimizer->Optimize(&best)  実体はEvolutionaryOptimizerのOptimize呼出し
|                 EvolutionaryOptimizerにはOptimizeはなく、superclassのIterativeOptimizerのOptimize呼出し
|                            Initialize( solution );
|                            while ( ! Converged() ) {
|                                  Step();
|                            }
|                        |
|                 EvolutionaryOptimizer::Initialize( aSolution )
|                           |
|                    solution = aSolution
|                    membersが空なら members, scores, ranks, sortedIndicesを作る
|                    creator->Create(members, members+nMembers)
|                             このcreatorはEpmr.cpp 1327 (CreateGlobalOptimizer)でnew RandomSolutionCreatorへのptrを代入
|                    sortedIndices、ScoreMenbers、RankMebersを初期化
|                    generation = 0
|                        |
|  ----------->  while ( ! Converged() )
| |                         EvolutionaryOptimizer::Convergedなので
| |                         return ( generation >= nSteps )
| |                      |
| |                  Step();
| |                         EvolutionaryOptimizer::Step()はEvolutionaryOptimizer.hの118行目
| |                          |
| |                     int nSurvivors = selector->CalcNumberOfSurvivors( nMembers, generation, nSteps );
| |                           残すものの数を決める
| |                           selectorはEpmr.cpp1333(CreateGlobalOptimizer)でnew LinearSelector(rate.starting, rate.ending)を代入
| |                           LinearSelector::CalcNumberOfSurvivors() は LinearSelector.cpp(22)
| |                          |
| |                     generation++;
| |                          |
| |                     Regenerate( nSurvivors, nMembers - 1 );
| |                          EvolutionaryOptimizer::Regenerate(first, last)  EvolutionaryOptimizer.h(155)
| |                          (membersのうち)先頭nSurvivorsを除いたそれより後ろの要素についてMutateする
| |                            for (i=first; i<=last; i++)
| |                               mutator->Mutate(&members[sortedIndices[i]], first, this)
| |                                  mutatorの値はEvolutionaryOptimizerのコンストラクタの引数として渡されてきている。
| |                                  EvolutionaryOptimizerのコンストラクタの呼出しはEpmr.cpp(1348-50)で
| |                                     実引数はCreateMutator(randomNumberGenerator)
| |                                  Epmr::CreateMutatorの定義はEpmr.cpp(1366-)で、
| |                                      mutator = new CompositeMutator;
| |                                      mutator->AddMutator(new InterpolatingMutator(...))  以下の**MutatorはすべてInterpolatingMutator.hにあり
| |                                      コマンドラインオプションによって他を追加
| |                                         mutator->AddMutator(new GaussianRotationMutator(...))
| |                                         mutator->AddMutator(new UniformRotationMutator(...))
| |                                         以下略
| |                                      CompositeMutatorの定義はCompositeMutator.hの28行目から
| |                                         CompositeMutatorはMutatorのサブクラスで、内部にMutatorのvectorであるMutatorListを持つ
| |                                         メソッドMutateはMutatorList上のMutatorを1番目から最後まで順に(それぞれのMutatorの)Mutateを実行する。----> Mutateは下段に詳述
| |                                         メソッドAddMutatorはListにmutatorを追加する
| |                         Regenerateの結果はmembersに残る(Mutateの結果)
| |                          |
| |                     ScoreMembers( nSurvivors, nMembers - 1 );
| |                           EvolutionaryOptimizer::ScoreMembers(first, last)  EvolutionaryOptimizer.h(147-151) 
| |                             firstからlastまですべてのscores[sortedIndices[i]]に
| |                               scorer->Score( members[ sortedIndices[ i ] ])代入
| |                                 scorerはEvolutionaryOptimizerインスタンス生成時の第3引数で与えられる(EvolutionaryOptimizer.h(45))
| |                                 EVのインスタンスはEpmr::CreateGlobalOptimizer (Epmr(1349))で、globalscorerの値として与えられる
| |                                    globalscorerの値はEpmr::Initialize (Epmr.cpp(458)) で、new CcScorer( *reflectionCalculator, magfo )を代入される
| |                                      CcScorerはCcScorer.hとCcScorer.cppで定義されており
| |                                      Epmr::Initiazlie (Epmr.cpp(458))でインスタンスを作られている。
| |                                      その時のreflectionCalculatorはコマンドオプションによってFcCalculatorかInterpolatingFcCalculatorか選ばれる
| |                                      メソッドScoreは何やらかのlinear correlationを計算してdouble値を返す
| |                          |
| |                     RankMembers(first, last);
| |                           EvolutionaryOptimizer::RankMembers   EvolutionaryOptimizer.h(139-144)
| |                           ranker->Rank( scores, scores + nMembers, ranks );
| |                              rankerの値はEpmr::CreateGlobalOptimizer (Epmr.cpp(1339,1341)で
| |                                if ( numberOfCompetitors == 0 )
| |                                  ranker = new DeterministicRanker( maximizing );
| |                                else 
| |                                  ranker = new TournamentRanker( randomNumberGenerator, numberOfCompetitors, maximizing );
| |                              で決まる
| |                           EvCompare compare( ranks );   EvCompareクラスのインスタンスcompareを作って
| |                           std::sort( sortedIndices, sortedIndices + nMembers, compare );    そのcompareで比較してソートする
| |                          |
| |                     // copy the best solution so the output is updated on each step
| |                     *solution = members[ sortedIndices[ 0 ] ];
| |                     if ( reporter != 0 ) reporter->Report( generation, scores, scores + nMembers );
| |                          |
|  --------------------------
|
|                  |
|           localResult = best;
|                  |
|           localoptimizer->Optimize(&localResult)  実体はSolutionSimplexMinimizerのOptimize呼出し
|                 SolutionSimplexMinimizerにはOptimizeはなく、superclassのDownhillSimplexMinimizerのOptimize呼出し (DownhillSimplexMinimizer.h(109))
|                 あとでゆっくり見てみる
|                  |
|           local-segmentsオプションが指定されていれば
|              SplitSegments(localResult, models)
|              さらにverboseityなら
|                 CalcSegmentTransforms(localResult)
|              localOptimizer->Optimize( &localResult ) で再度optimize
|                  |
|           NormalizeSolution(&localResult)
|                  |
|           currentScore = localScorer->Score(localResult)
|           currentRfactor = rfactorScorer->Score(localResult)
|           ReportSolution(localResult)
|                  |
|           bestScoreよりcurrentScoreが良ければbestScoreを置き換える
|           averageScore(currentScore)を計算
|                  |
|           報告の書出し
|                  |
|           attempt++
|                  |
|           もしattempt>nAttemptsなら
|              いろいろ初期化?
|                      |
|              もしcopyNum>totalCopiesなら
|                  何か更に初期設定をしている??
|                  でなければ、StoreAtoms(bestSolution)
|                  |
 ------------------

InterpolatingMutatorのMutateメソッド

InterpolatingMutatorのMutateメソッド (InterpolatingMutator.cp(34)に本体)

引数 Solutionへのポインタs
      int maxParentRank
      EvolutionaryOptimizerへのポインタeo
    呼び出し時の(実引数の)値は
      Solution* s は &members[sortedIndices[i]]
      maxParentRank は first
      eo は this
p1は、eo->Member(rand->NextUniform × maxParentRank)
   eoのMember(rank)は、members[ sortedIndices[ rank ] ]を返す
   randはInterpolatingMutatorのインスタンス作成時に第3引数rngとして受け取っている
     このインスタンス作成はEpmr.cpp(1369)で、その第3引数randはEpmr::CreateMutatorの引数に由来
        このCreateMutatorのインスタンス作成はEpmr::CreateGlobalOptimizerの最後(Epmr.cpp(1350)で
           new EvolutionaryOptimizerの引数内でCreateMutator(randomNumberGenerator)
           RandomNumberGeneratorクラスはRandomNumberGenerator.h, 同.cppで定義され
             メソッドNextUniformはRandomNumberGenerator.h(51)にあり0〜1間の乱数を返す
p2も、eo->Member(rand->NextUniform × maxParentRank)
   乱数生成のためp1とは違う値

もしuniform乱数を振ってそれがcrossoverRateを越えていれば(parentsをcrossover交差する)
   sの全てのセグメントについて
     乱数を振って、0.5以上ならsのorientationをp1のorientationにset、以下ならp2のorientationにsetする
     乱数を振って、同様にsのpositionをp1(もしくはp2)のpositionにセットする
越えていなければ(parentsをinterpolate補間する)
   sの全てのセグメントについて
     乱数を振って、interpolation rateを越えていれば
       sのorientationを、p1とp2のorientationのrandom位置でのinterpolateをする
          interpolateはたとえばQuat4などの中で定義(Quat4.h(113))
       sのpositionを、p1とp2のpositionのrandom位置でのinterpolateをする
     越えていなければ
       sのorientation/positionをp1のorientation/positionとする
   Ksol, Bsolについて
     乱数を振って、interpolation rateを越えていれば
       sのKsolをp1とp2のKsolの単純平均値とする
       sのBsolをp1とp2のBsolの単純平均値とする
     越えていなければ
       sのKsol/Bsolをp1のKsol/Bsolの値とする
結果はsに書き込まれている

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-02-03 (日) 15:46:52 (3576d)