#include <TeSkaterFunctions.h>
Definition at line 26 of file TeSkaterFunctions.h.
Public Member Functions | |
| void | BFS_Salva (TeSTElementSet ®Set, string name) |
| void | Particiona (int, long) |
| TParticao (TSkaterGrafo *) | |
| ~TParticao () | |
Data Fields | |
| TFilaR * | Clusters |
| TFilaDouble * | QuedaDesv |
Private Member Functions | |
| double | BFS_Desvio (int, int, double *) |
| void | BFS_Main (TFilaR::Item_ptr) |
| double * | BFS_Media (int, int, long *) |
| double | Dist (int, double *) |
Private Attributes | |
| TSkaterGrafo * | Grafo |
| int | Num_Grupos |
| long | PopMin |
| TParticao::TParticao | ( | TSkaterGrafo * | G | ) |
Definition at line 14 of file TeSkaterFunctions.cpp.
References Clusters, Grafo, TFilaR::Insere(), Num_Grupos, QuedaDesv, and TeMAXFLOAT.
00014 { 00015 Grafo=G; 00016 QuedaDesv = new TFilaDouble; 00017 Clusters = new TFilaR; 00018 Clusters->Insere(0,TeMAXFLOAT,(long)TeMAXFLOAT); 00019 Num_Grupos = 1; 00020 };
| TParticao::~TParticao | ( | ) |
Definition at line 23 of file TeSkaterFunctions.cpp.
References Clusters.
00023 { 00024 delete Clusters; 00025 };
| double TParticao::BFS_Desvio | ( | int | Raiz, | |
| int | Exceto, | |||
| double * | Media | |||
| ) | [private] |
Calculo do desvio
Insere Filhos na Lista
Definition at line 70 of file TeSkaterFunctions.cpp.
References Dist(), Grafo, TFilaInt::Insere(), TSkaterGrafo::MyGrafo, TFilaInt::Retira(), and TFilaInt::Size().
Referenced by BFS_Main().
00070 { 00071 double Acc=0; 00072 double Peso;// Usado na busca dos filhos 00073 int Indice; // Usado na busca dos filhos 00074 int Atual; // No sendo visitado 00075 TFilaInt *Fila; 00076 00077 Fila = new TFilaInt; 00078 Fila->Insere(Raiz); 00079 00080 while (Fila->Size()){ 00081 Atual = Fila->Retira(); 00082 00083 /** Calculo do desvio **/ 00084 Acc += Dist(Atual,Media); 00085 00086 /** Insere Filhos na Lista **/ 00087 Grafo->MyGrafo->Nos[Atual].ArViz->Adjacente(&Indice,&Peso); 00088 while(Indice != -1){ 00089 if (Indice != Exceto) 00090 Fila->Insere(Indice); 00091 Grafo->MyGrafo->Nos[Atual].ArViz->Adjacente(&Indice,&Peso); 00092 }; 00093 }; 00094 return Acc; 00095 };
| void TParticao::BFS_Main | ( | TFilaR::Item_ptr | Item | ) | [private] |
Definition at line 110 of file TeSkaterFunctions.cpp.
References BFS_Desvio(), BFS_Media(), Grafo, TFilaInt::Insere(), TSkaterGrafo::MyGrafo, PopMin, TFilaInt::Retira(), TFilaInt::Size(), and TeMAXFLOAT.
Referenced by Particiona().
00110 {//Raiz,Populacao,Desvio 00111 //int i=0; 00112 int Atual; // No sendo visitado 00113 double Peso;// Usado na busca dos filhos 00114 int Indice=0; // Usado na busca dos filhos 00115 double *M1,*M2,D1,D2; 00116 long Pop1,Pop2; 00117 double D_Min = TeMAXFLOAT; 00118 double DMin1; 00119 double DMin2; 00120 long Raiz1,PopMin1; 00121 long Raiz2,PopMin2; 00122 TFilaInt *Fila; 00123 00124 if (!Item->Desvio) return; 00125 00126 Fila = new TFilaInt; 00127 Fila->Insere(Item->Raiz); 00128 00129 M1 = new double[Grafo->MyGrafo->Num_Var]; 00130 M2 = new double[Grafo->MyGrafo->Num_Var]; 00131 00132 while (Fila->Size()){ 00133 Atual = Fila->Retira(); 00134 //i++; 00135 /* Insere Filhos na fila */ 00136 Grafo->MyGrafo->Nos[Atual].ArViz->AdjacenteB(&Indice,&Peso); 00137 while (Indice != -1){ 00138 Fila->Insere(Indice); 00139 M1 = BFS_Media(Indice,0,&Pop1); 00140 D1 = BFS_Desvio(Indice,0,M1); 00141 00142 M2 = BFS_Media(Item->Raiz,Indice,&Pop2); 00143 D2 = BFS_Desvio(Item->Raiz,Indice,M2); 00144 if (((D1+D2) < D_Min) && (Pop1 > PopMin) && (Pop2 > PopMin)) { //encontrou um minimo 00145 D_Min = (D1+D2); 00146 Raiz1 = Indice; 00147 Raiz2 = Atual; 00148 PopMin1 = Pop1; 00149 PopMin2 = Pop2; 00150 DMin1 = D1; 00151 DMin2 = D2; 00152 }; 00153 Grafo->MyGrafo->Nos[Atual].ArViz->AdjacenteB(&Indice,&Peso); 00154 }; 00155 }; 00156 /*Atualizacao dos dados*/ 00157 if (D_Min != TeMAXFLOAT){ 00158 Item->D1 = DMin1; 00159 Item->D2 = DMin2; 00160 Item->P1 = PopMin1; 00161 Item->P2 = PopMin2; 00162 Item->R1 = Raiz1; 00163 Item->R2 = Raiz2; 00164 Item->Queda = Item->Desvio - DMin1 - DMin2; 00165 } else 00166 Item->Desvio = 0; 00167 00168 delete Fila; 00169 delete M1; 00170 delete M2; 00171 };
| double * TParticao::BFS_Media | ( | int | Raiz, | |
| int | Exceto, | |||
| long * | Populacao | |||
| ) | [private] |
Calculo da Media
Insere Filhos na Lista
Definition at line 28 of file TeSkaterFunctions.cpp.
References Grafo, TFilaInt::Insere(), TSkaterGrafo::MyGrafo, TFilaInt::Retira(), and TFilaInt::Size().
Referenced by BFS_Main().
00028 { 00029 double *Acc; 00030 double Peso;// Usado na busca dos filhos 00031 int Indice; // Usado na busca dos filhos 00032 int i; 00033 int n=0; 00034 int Atual; // No sendo visitado 00035 TFilaInt *Fila; 00036 00037 Acc = new double[Grafo->MyGrafo->Num_Var]; 00038 for(i=0;i<Grafo->MyGrafo->Num_Var;i++) 00039 Acc[i] =0; 00040 *Populacao = 0; 00041 00042 Fila = new TFilaInt; 00043 Fila->Insere(Raiz); 00044 00045 while (Fila->Size()){ 00046 Atual = Fila->Retira(); 00047 00048 /** Calculo da Media **/ 00049 n++; 00050 for(i=0;i<Grafo->MyGrafo->Num_Var;i++) 00051 Acc[i] += Grafo->MyGrafo->Nos[Atual].Variaveis[i]; 00052 *Populacao = *Populacao + Grafo->MyGrafo->Nos[Atual].Populacao; 00053 00054 /** Insere Filhos na Lista **/ 00055 Grafo->MyGrafo->Nos[Atual].ArViz->Adjacente(&Indice,&Peso); 00056 while(Indice!=-1){ 00057 if (Indice != Exceto) 00058 Fila->Insere(Indice); 00059 Grafo->MyGrafo->Nos[Atual].ArViz->Adjacente(&Indice,&Peso); 00060 }; 00061 }; 00062 for(i=0;i<Grafo->MyGrafo->Num_Var;i++) 00063 Acc[i] /=n; 00064 00065 delete Fila; 00066 return Acc; 00067 };
| void TParticao::BFS_Salva | ( | TeSTElementSet & | regSet, | |
| string | name | |||
| ) |
Insere Filhos na Lista
Definition at line 299 of file TeSkaterFunctions.cpp.
References TeBaseSTInstanceSet< GeometryType, TimeType, InstanceType >::addProperty(), Clusters, TeBaseSTInstanceSet< GeometryType, TimeType, InstanceType >::getAttributeIndex(), TeBaseSTInstanceSet< GeometryType, TimeType, InstanceType >::getSTInstance(), Grafo, TFilaInt::Insere(), TSkaterGrafo::MyGrafo, TeAttributeRep::name_, TFilaR::Proximo(), TFilaInt::Retira(), TeBaseSTInstance< GeometryType, TimeType >::setPropertyValue(), TFilaInt::Size(), Te2String(), TeINT, and TeAttributeRep::type_.
Referenced by TeSkaterFunction().
00299 { 00300 double Peso;// Usado na busca dos filhos 00301 int Indice; // Usado na busca dos filhos 00302 int Atual; // No sendo visitado 00303 int i=1; 00304 TFilaInt *Fila; 00305 int Raiz; 00306 00307 TeAttributeRep rep; 00308 rep.name_ = name; 00309 rep.type_ = TeINT; 00310 regSet.addProperty(rep, ""); 00311 int index = regSet.getAttributeIndex(name); //get the index of the inserted attribute 00312 00313 Raiz=Clusters->Proximo(); 00314 while (Raiz != -1){ 00315 00316 string value = Te2String(i); 00317 00318 Fila = new TFilaInt; 00319 Fila->Insere(Raiz); 00320 00321 while (Fila->Size()){ 00322 Atual = Fila->Retira(); 00323 00324 /** Insere Filhos na Lista **/ 00325 Grafo->MyGrafo->Nos[Atual].ArViz->Adjacente(&Indice,&Peso); 00326 while(Indice != -1) 00327 { 00328 Fila->Insere(Indice); 00329 Grafo->MyGrafo->Nos[Atual].ArViz->Adjacente(&Indice,&Peso); 00330 }; 00331 //set the attribute in the set 00332 TeSTInstance* ins = regSet.getSTInstance(Grafo->MyGrafo->Nos[Atual].Label); 00333 if(ins) 00334 ins->setPropertyValue(index, value); 00335 } 00336 i++; 00337 Raiz=Clusters->Proximo(); 00338 } 00339 }
| double TParticao::Dist | ( | int | Atual, | |
| double * | Media | |||
| ) | [private] |
Definition at line 98 of file TeSkaterFunctions.cpp.
References Grafo, and TSkaterGrafo::MyGrafo.
Referenced by BFS_Desvio().
00098 { 00099 int i; 00100 double Acc=0; 00101 00102 for(i=0;i<Grafo->MyGrafo->Num_Var;i++) 00103 Acc += (Grafo->MyGrafo->Nos[Atual].Variaveis[i] - Media[i]) * 00104 (Grafo->MyGrafo->Nos[Atual].Variaveis[i] - Media[i]); 00105 return Acc; 00106 };
| void TParticao::Particiona | ( | int | N_Grp, | |
| long | Pop | |||
| ) |
Definition at line 174 of file TeSkaterFunctions.cpp.
References BFS_Main(), Clusters, Grafo, TFilaDouble::Insere(), TFilaR::Insere(), TFilaR::mFila, TSkaterGrafo::MyGrafo, Num_Grupos, PopMin, TFilaR::Proximo(), QuedaDesv, and TFilaR::Retira().
Referenced by TeSkaterFunction().
00174 { 00175 int i; 00176 int Raiz; 00177 int Sai; 00178 double QMax; 00179 int R1,R2; 00180 double D1,D2; 00181 long P1,P2; 00182 TFilaR::Item_ptr Item; 00183 double Acc; 00184 00185 PopMin = Pop; 00186 00187 if (Pop == -1){ // Nao levar em conta populacao 00188 while (N_Grp != Num_Grupos){ 00189 Item = Clusters->mFila->Head; 00190 for(i=0;i<Clusters->mFila->Size;i++){ 00191 if (!Item->Queda) BFS_Main(Item); 00192 Item = Item->Proximo; 00193 }; 00194 Item = Clusters->mFila->Head; 00195 QMax = 0; 00196 for(i=0;i<Clusters->mFila->Size;i++){ 00197 if (Item->Queda > QMax){ 00198 QMax = Item->Queda; 00199 Raiz = Item->Raiz; 00200 R1 = Item->R1; 00201 R2 = Item->R2; 00202 D1 = Item->D1; 00203 D2 = Item->D2; 00204 P1 = Item->P1; 00205 P2 = Item->P2; 00206 }; 00207 Item = Item->Proximo; 00208 }; 00209 Grafo->MyGrafo->Nos[R2].ArViz->Retira(R1); 00210 Num_Grupos++; 00211 Clusters->Insere(R1,D1,P1); 00212 Clusters->Retira(Raiz); 00213 Clusters->Insere(Raiz,D2,P2); 00214 Acc = 0; 00215 while (Clusters->Proximo() != -1) Acc += Clusters->mFila->Atual->Desvio; 00216 QuedaDesv->Insere(Acc); 00217 }; 00218 } else 00219 if (N_Grp == 0) 00220 { 00221 Sai=0; 00222 while (!Sai){ 00223 Item = Clusters->mFila->Head; 00224 for(i=0;i<Clusters->mFila->Size;i++){ 00225 if (!Item->Queda) BFS_Main(Item); 00226 Item = Item->Proximo; 00227 }; 00228 00229 Item = Clusters->mFila->Head; 00230 QMax = 0; 00231 Sai = 1; 00232 for(i=0;i<Clusters->mFila->Size;i++){ 00233 if (Item->Desvio) Sai = 0; 00234 if (Item->Queda > QMax){ 00235 QMax = Item->Queda; 00236 Raiz = Item->Raiz; 00237 R1 = Item->R1; 00238 R2 = Item->R2; 00239 D1 = Item->D1; 00240 D2 = Item->D2; 00241 P1 = Item->P1; 00242 P2 = Item->P2; 00243 }; 00244 Item = Item->Proximo; 00245 }; 00246 if (!Sai){ 00247 Grafo->MyGrafo->Nos[R2].ArViz->Retira(R1); 00248 Num_Grupos++; 00249 Clusters->Insere(R1,D1,P1); 00250 Clusters->Retira(Raiz); 00251 Clusters->Insere(Raiz,D2,P2); 00252 Acc = 0; 00253 while (Clusters->Proximo() != -1) Acc += Clusters->mFila->Atual->Desvio; 00254 QuedaDesv->Insere(Acc); 00255 }; 00256 };//while 00257 } else { // Grupos com populacao restringida 00258 Sai=0; 00259 while (!Sai){ 00260 Item = Clusters->mFila->Head; 00261 for(i=0;i<Clusters->mFila->Size;i++){ 00262 if (!Item->Queda) BFS_Main(Item); 00263 Item = Item->Proximo; 00264 }; 00265 00266 Item = Clusters->mFila->Head; 00267 QMax = 0; 00268 Sai = 1; 00269 for(i=0;i<Clusters->mFila->Size;i++){ 00270 if (Item->Desvio) Sai = 0; 00271 if (Item->Queda > QMax){ 00272 QMax = Item->Queda; 00273 Raiz = Item->Raiz; 00274 R1 = Item->R1; 00275 R2 = Item->R2; 00276 D1 = Item->D1; 00277 D2 = Item->D2; 00278 P1 = Item->P1; 00279 P2 = Item->P2; 00280 }; 00281 Item = Item->Proximo; 00282 }; 00283 if (!Sai){ 00284 Grafo->MyGrafo->Nos[R2].ArViz->Retira(R1); 00285 Num_Grupos++; 00286 Clusters->Insere(R1,D1,P1); 00287 Clusters->Retira(Raiz); 00288 Clusters->Insere(Raiz,D2,P2); 00289 Acc = 0; 00290 while (Clusters->Proximo() != -1) Acc += Clusters->mFila->Atual->Desvio; 00291 QuedaDesv->Insere(Acc); 00292 if (Num_Grupos >= N_Grp) Sai = 1; 00293 }; 00294 };//while 00295 }//else 00296 };
Definition at line 36 of file TeSkaterFunctions.h.
Referenced by BFS_Salva(), Particiona(), TParticao(), and ~TParticao().
TSkaterGrafo* TParticao::Grafo [private] |
Definition at line 32 of file TeSkaterFunctions.h.
Referenced by BFS_Desvio(), BFS_Main(), BFS_Media(), BFS_Salva(), Dist(), Particiona(), and TParticao().
int TParticao::Num_Grupos [private] |
long TParticao::PopMin [private] |
Definition at line 39 of file TeSkaterFunctions.h.
Referenced by Particiona(), TeSkaterFunction(), and TParticao().
1.5.3