35 #ifndef ITERATIVECLASSIFICATION_D_H
36 #define ITERATIVECLASSIFICATION_D_H
47 int nbOfClasses,
int maxNbOfRuns,
48 double threshold,
bool classified,
50 myClasses(0), myNbOfClasses( nbOfClasses ), myMaxNbOfRuns( maxNbOfRuns ), myThreshold( threshold ),
51 myClassified( classified ), myClassifStrategy(0)
53 myClasses = *classes ;
54 myClassifStrategy = strategy.
clone() ;
61 delete myClassifStrategy ;
69 delete myClassifStrategy ;
70 myClassifStrategy = strategy.
clone() ;
75 const std::vector< std::list< aims::Individuals<T> > >&
88 std::cout <<
"Initialisation..." ;
89 std::string init_type ;
92 if( myClassifStrategy->isCodeVectorsGiven() ){
93 init_type =
"CodeVectorsGiven" ;
94 for(
int c = 1 ; c <= nbOfClasses ; ++c ){
95 if( classes[c].size() != 0 ){
96 typename std::list< aims::Individuals<T> >
::iterator iter( classes[c].begin() ),
97 last( classes[c].end() ) ;
98 while( iter != last ){
99 classes[0].push_back( *iter ) ;
107 bool classesGiven =
true, individualsGiven = true ;
108 for(
int i = 1 ; i <= myNbOfClasses ; ++i ){
109 if( classes[i].size() == 0 )
110 classesGiven = false ;
111 else individualsGiven = false ;
114 if( classesGiven ==
true )
115 init_type =
"InitialClasses" ;
117 else if( classes[0].size() != 0 && individualsGiven ==
true )
118 init_type =
"NoInitialClasses" ;
122 for(
int c = 1 ; c <= nbOfClasses ; ++c ){
123 if( classes[c].size() != 0 ){
124 typename std::list< aims::Individuals<T> >
::iterator iter( classes[c].begin() ),
125 last( classes[c].end() ) ;
126 while( iter != last ){
127 classes[0].push_back( *iter ) ;
136 myClassifStrategy->init( init_type, nbOfClasses, classes ) ;
143 bool valid =
true, newRun = true ;
145 double old_inertia = 0., new_inertia = 0., min_inertia = 0. ;
146 int maxNbOfIterations = myClassifStrategy->getMaxNbOfIterations() ;
147 int maxNbOfRuns = myMaxNbOfRuns ;
148 double threshold = myThreshold ;
151 valid = myClassifStrategy->isValidStrategy() ;
152 if ( valid ==
false ){
153 std::cout <<
"Non valide: impossible de faire la classification." ;
157 std::vector< std::list< aims::Individuals<T> > > initialClasses( myClasses ) ;
158 std::vector< std::list< aims::Individuals<T> > > bestClasses( myNbOfClasses + 1 ) ;
161 bool classesGiven = true ;
162 for(
int i = 1 ; i <= myNbOfClasses ; ++i )
163 if( initialClasses[i].size() == 0 )
164 classesGiven = false ;
165 if( myClassifStrategy->isCodeVectorsGiven() || classesGiven ==
true )
169 for(
int r = 1 ; r <= maxNbOfRuns ; ++r ){
170 std::cout <<
"Run numero " << r << std::endl ;
175 initialization( initialClasses, myNbOfClasses ) ;
179 if( new_inertia != 0. )
180 old_inertia = new_inertia ;
182 for(
int c = 1 ; c <= myNbOfClasses ; ++c ){
183 if( myClasses[c].size() != 0 ){
184 typename std::list< aims::Individuals<T> >
::iterator iter( myClasses[c].begin() ),
185 last( myClasses[c].end() ) ;
186 while( iter != last ){
187 myClasses[0].push_back( *iter ) ;
190 myClasses[c].clear() ;
193 myClassifStrategy->init(
"Random", myNbOfClasses, myClasses ) ;
199 new_inertia = myClassifStrategy->iterate( nbOfIterations, myClasses ) ;
201 std::cout <<
"Inertie = " << new_inertia <<
" - Critere = " << (old_inertia - new_inertia ) / new_inertia << std::endl << std::endl ;
203 while( ((( old_inertia - new_inertia ) / new_inertia ) > threshold ||
204 old_inertia == 0. || new_inertia > old_inertia )
205 && nbOfIterations < maxNbOfIterations ) ;
207 if( nbOfIterations == maxNbOfIterations ){
209 std::cout <<
"Nb max d'iterations atteint!" << std::endl << std::endl ;
211 if( ( new_inertia < min_inertia || min_inertia == 0. )
212 && nbOfIterations < maxNbOfIterations ){
213 bestClasses = myClasses ;
214 min_inertia = new_inertia ;
215 std::cout <<
"Meilleur run n° " << r << std::endl << std::endl ;
218 std::cout <<
"done !" << std::endl ;
219 if( min_inertia == 0. )
220 std::cout <<
"Classification impossible" << std::endl << std::endl ;
221 myClasses = bestClasses ;
223 std::cout <<
"classes nb " << myClasses.size() << std::endl ;
virtual ClassifStrategy< T > * clone() const =0
void setClassifStrategy(const ClassifStrategy< T > &strategy, bool keepPreviousResult=false)
void initialization(std::vector< std::list< Individuals< T > > > &classes, int nbOfClasses)
~IterativeClassification()
IterativeClassification(std::vector< std::list< Individuals< T > > > *classes, int nbOfClasses, int maxNbOfRuns, double threshold, bool classified, const ClassifStrategy< T > &strategy)
const std::vector< std::list< Individuals< T > > > & getClasses()