TParticao Class Reference

#include <TeSkaterFunctions.h>


Detailed Description

Definition at line 26 of file TeSkaterFunctions.h.


Public Member Functions

void BFS_Salva (TeSTElementSet &regSet, string name)
void Particiona (int, long)
 TParticao (TSkaterGrafo *)
 ~TParticao ()

Data Fields

TFilaRClusters
TFilaDoubleQuedaDesv

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

TSkaterGrafoGrafo
int Num_Grupos
long PopMin

Constructor & Destructor Documentation

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 };


Member Function Documentation

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 };


Field Documentation

TFilaR* TParticao::Clusters

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]

Definition at line 34 of file TeSkaterFunctions.h.

Referenced by Particiona(), and TParticao().

long TParticao::PopMin [private]

Definition at line 33 of file TeSkaterFunctions.h.

Referenced by BFS_Main(), and Particiona().

TFilaDouble* TParticao::QuedaDesv

Definition at line 39 of file TeSkaterFunctions.h.

Referenced by Particiona(), TeSkaterFunction(), and TParticao().


The documentation for this class was generated from the following files:
Generated on Sun Jul 29 04:11:40 2012 for TerraLib - Development Source by  doxygen 1.5.3