![]() |
ノート/EPMRを見る〜C++4https://pepper.is.sci.toho-u.ac.jp:443/pepper/index.php?%A5%CE%A1%BC%A5%C8%2FEPMR%A4%F2%B8%AB%A4%EB%A1%C1%A3%C3%A1%DC%A1%DC%A3%B4 |
![]() |
ノート
訪問数 2486 最終更新 2008-02-03 (日) 15:46:52
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に書き込まれている