[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
[[ノート>ノート/ノート]]~
訪問数 &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)
| | (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に書き込まれている
終了行:
[[ノート>ノート/ノート]]~
訪問数 &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)
| | (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に書き込まれている
ページ名: