![]() |
ノート/EPMRを見る〜C++2https://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%B2 |
![]() |
ノート 訪問数 2502 最終更新 2008-01-21 (月) 13:44:56
template< class T > void IterativeOptimizer< T >::Optimize( T* solution ) { Initialize( solution ); while ( ! Converged() ) { Step(); } }に従うと考えてよかろう。
bool Epmr::Converged() { return ( ( maximizing && bestScore > scoreThreshold ) || ( ! maximizing && bestScore < scoreThreshold ) || firstTargetIndex >= (int) cells.size() ); }
Initialize( solution ); while ( ! Converged() ) { Step(); }ということになる。
template < class T > void EvolutionaryOptimizer< T >::Initialize( T* aSolution ) { solution = aSolution; if ( members == 0 ) { members = new T[ nMembers ]; scores = new double[ nMembers ]; ranks = new double[ nMembers ]; sortedIndices = new int[ nMembers ]; } creator->Create( members, members + nMembers ); for ( int i = 0; i < nMembers; i++ ) { sortedIndices[ i ] = i; } ScoreMembers( 0, nMembers - 1 ); RankMembers(); generation = 0; }
template < class T > bool EvolutionaryOptimizer< T >::Converged() { return ( generation >= nSteps ); }
template < class T > void EvolutionaryOptimizer< T >::Step() { int nSurvivors = selector->CalcNumberOfSurvivors( nMembers, generation, nSteps ); generation++; Regenerate( nSurvivors, nMembers - 1 ); ScoreMembers( nSurvivors, nMembers - 1 ); RankMembers(); // 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 ); }これをConvergedになるまで繰り返す。これが内側のループということになるのだろう。
int Optimization::LinearSelector::CalcNumberOfSurvivors( int nMembers, int generation, int maxGeneration ) { int numSurvivors = (int) ( ( startingSurvivalFraction + ( ( endingSurvivalFraction - startingSurvivalFraction ) * ( (double) generation / (double) maxGeneration ) ) ) * nMembers ); if ( numSurvivors < 1 ) numSurvivors = 1; else if ( numSurvivors > nMembers ) numSurvivors = nMembers; return numSurvivors; }
template< class T > void EvolutionaryOptimizer< T >::Regenerate( int firstIndex, int lastIndex ) { for ( int i = firstIndex; i <= lastIndex; i++ ) { mutator->Mutate( &members[ sortedIndices[ i ] ], firstIndex, this ); } }つまりfirstIndexからlastIndexまで、mutator->Mutateを呼び出すらしい。
template< class T > void EvolutionaryOptimizer< T >::ScoreMembers( int firstIndex, int lastIndex ) { for ( int i = firstIndex; i <= lastIndex; i++ ) { scores[ sortedIndices[ i ] ] = scorer->Score( members[ sortedIndices[ i ] ] ); } }だが、scoresを計算している。
template < class T > void EvolutionaryOptimizer< T >::RankMembers() { ranker->Rank( scores, scores + nMembers, ranks ); EvCompare compare( ranks ); std::sort( sortedIndices, sortedIndices + nMembers, compare ); }ranker->Rankを呼び出しておき(ranks上で計算?)、関数compare(比較「<」の代わり)を定義し、そのcompareを使ってstd::sortする?