[[ノート>ノート/ノート]]~
訪問数 &counter();  最終更新 &lastmod();

***EPMRを読んでみる 〜 流れ? [#s32057fa]

   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)
 | |                          残すものを除いたそれより後ろの要素についてMutateする
 | |                          (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