35 #ifndef DYNAMICSTRATEGY_D_H
36 #define DYNAMICSTRATEGY_D_H
62 int beginIndex ,
int endIndex ,
64 aims::
KmeansStrategy<T>( nbIterations, distanceType, beginIndex, endIndex, codeVector )
86 std::cout <<
"Dynamic clustering - Iteration n° " << nbOfIterations << std::endl ;
87 int nbOfClasses = classes.size() ;
89 unsigned int classCardNew, classCardOld ;
97 std::vector< std::list< aims::Individuals<T> > >* newClasses ;
98 newClasses = &classes ;
101 if( !nbOfIterations && ( classes[0].size() != 0 ) ){
103 typename std::list< aims::Individuals<T> >
::iterator iter( classes[0].begin() ),
104 last( classes[0].end() ) ;
105 while( iter != last ){
106 int indMin = aggregate( *iter ) ;
107 (*newClasses)[indMin].push_back( *iter ) ;
110 (*newClasses)[0].clear() ;
112 analyse( *newClasses ) ;
115 for(
int c = 0 ; c < nbOfClasses ; ++c ){
116 typename std::list< aims::Individuals<T> >
::iterator iter( classes[c].begin() ),
117 last( classes[c].end() ), iterToMove ;
118 while( iter != last ){
120 indMin = aggregate( *iter ) ;
125 classCardNew = (*newClasses)[indMin].size() ;
126 classCardOld = (*newClasses)[c].size() ;
128 centerComputation( indMin, c, classCardNew, classCardOld, *iterToMove ) ;
130 (*newClasses)[indMin].push_back( *iterToMove ) ;
131 (*newClasses)[c].erase( iterToMove ) ;
137 classes = *newClasses ;
139 std::cout <<
"nb d'individus - iterate end :" ;
140 for(
int c = 0 ; c < nbOfClasses ; ++c )
141 std::cout <<
" " << classes[c].size() ;
142 std::cout << std::endl ;
144 double new_inertia = globInertia( classes ) ;
164 for (
int i = 0 ; i < 3 ; ++i ){
165 meanIndivPosNew[i] = ( ( meanIndivPosNew[i] * cardNew ) + indPos[i] ) / ( cardNew + 1 ) ;
166 meanIndivPosOld[i] = ( ( meanIndivPosOld[i] * cardOld ) - indPos[i] ) / ( cardOld - 1 ) ;
169 std::vector<T> indVal = ind.
value() ;
170 unsigned int valIndSize = indVal.size() ;
172 std::vector<T> meanIndivValNew = meanIndivNew.
value() ;
173 std::vector<T> meanIndivValOld = meanIndivOld.
value() ;
174 std::vector<T> meanIndivValNewClass = meanIndivValNew ;
175 std::vector<T> meanIndivValOldClass = meanIndivValOld ;
177 for(
unsigned int k = 0 ; k < valIndSize ; ++k ){
178 meanIndivValNewClass[k] = ( ( meanIndivValNew[k] * cardNew ) + indVal[k] ) / ( cardNew + 1 ) ;
179 meanIndivValOldClass[k] = ( ( meanIndivValOld[k] * cardOld ) - indVal[k] ) / ( cardOld - 1 ) ;
182 Individuals<T> newMeanIndiv( meanIndivPosNew, meanIndivValNewClass ) ;
183 this->myMeanVector[cNew] = newMeanIndiv ;
184 Individuals<T> oldMeanIndiv( meanIndivPosOld, meanIndivValOldClass ) ;
185 this->myMeanVector[cOld] = oldMeanIndiv ;
virtual ~DynamicStrategy()
DynamicStrategy(const DynamicStrategy< T > &dynamicStrat)
virtual ClassifStrategy< T > * clone() const
virtual double iterate(int &nbOfIterations, std::vector< std::list< Individuals< T > > > &classes)
void centerComputation(int cNew, int cOld, unsigned int cardNew, unsigned int cardOld, const Individuals< T > &ind)
const std::vector< T > & value() const
const Point3df & position() const
float(* myDistance)(const std::vector< T > &ind1, const std::vector< T > &ind2, unsigned int beginIndex, unsigned int endIndex)
std::vector< Individuals< T > > myMeanVector
std::vector< Individuals< T > > myVarianceVector