]> git.llucax.com Git - z.facultad/75.68/celdas.git/commitdiff
Agrega heurística de generalización hecha por Daniel.
authorLeandro Lucarella <llucax@gmail.com>
Sun, 10 Dec 2006 21:33:28 +0000 (21:33 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Sun, 10 Dec 2006 21:33:28 +0000 (21:33 +0000)
trunk/src/sistemaautonomo.cpp
trunk/src/sistemaautonomo.h

index 5f1cf2c7b12b221b89cecaf6b5b185bfd4a1c0f6..73394ea48f964180cce0494dd8e0c003cf879761 100644 (file)
@@ -63,6 +63,65 @@ void CSistemaAutonomo::heurisitca_observacion(CTeoria& t)
        
 }
 
+//--------------------------------------------------------------------------------------------
+//--
+// Si las condiciones finales del entorno son iguales a las condiciones finales de alguna teoria y
+// solo una condicion inicial es distinta => agrego una nueva teoría igual (a la q cumple los requisitos
+// anteriormente detallados) pero tomando ANY en el valor de entrada en el cual difieren.  
+void CSistemaAutonomo::heurisitca_generalizacion(CTeoria& t)
+{
+       CTeoria nt ; //Nueva Teoria
+       unsigned i ;
+       int count = 0;
+       int k = 0;
+       int j = 0;
+       int posicionCambio = -1;
+       bool seguir = true;
+       unsigned cantidadTeorias = 0;
+       std::string nombreTeoria;
+
+       cantidadTeorias = this->teorias.count();
+
+       for (i=0; i<cantidadTeorias; i++)
+       {
+               for (k=0; k<this->teorias[i].datos_finales.count(); k++)
+               {
+                       //me fijo si las condiciones finales de la teoria se corresponden con la del entorno.
+                       if((this->teorias[i].datos_finales[k] != ANY) && (this->p_entorno->datos.find(t.datos_finales.keys(k)) != ANY))
+                       {
+                               if(this->teorias[i].datos_finales[k] != this->p_entorno->datos.find(t.datos_finales.keys(k))) 
+                               {
+                                       count++;
+                               }
+                       }
+               }
+               if(count == 0)
+               {       // si se corresponden (las condiciones finales son iguales) => me fijo si hay alguna condicion inicial q cambia. 
+                       for (j=0; j<this->teorias[i].datos_iniciales.count(); j++)
+                       {
+                               if((this->teorias[i].datos_iniciales[j] != ANY) && (this->p_entorno->datos.find(t.datos_iniciales.keys(j)) != ANY))
+                               {
+                                       if(this->teorias[i].datos_iniciales[j] != this->p_entorno->datos.find(t.datos_iniciales.keys(j))) 
+                                       {
+                                               posicionCambio = j;
+                                               count++;
+                                       }
+                               }
+                       }
+                       if(count == 1)
+                       {//si cambia solo una => creo una nueva teoria igual pero con ANY en la condicion q cambia.
+                               nt = this->teorias[i];
+                               nt.datos_iniciales[posicionCambio] = ANY;
+
+                               // Agrego la teoria
+                               nombreTeoria = teorias.count() ;
+                               teorias.add (nombreTeoria.c_str(), nt) ;
+                       }
+               }
+               posicionCambio = -1;
+               count = 0;
+       }
+}
 
 //--------------------------------------------------------------------------------------------
 //--
@@ -166,6 +225,7 @@ bool CSistemaAutonomo::ejecutar (CIndiceMagico<CTeoria>& plan)
 
                // Aplico heuristicas de observacion
                this->heurisitca_observacion(t) ;
+               this->heurisitca_generalizacion(t);
        }
 
        //
index a5e71c44ecec3be5ae1f91bc2cc78246415accbf..3179a931a1bc7b2160e0e281d95edffa48c49477 100644 (file)
@@ -185,6 +185,9 @@ protected:
        //      Si una teoria no se verifico como correcta, se crea una nueva quitandole las condiciones_finales que no se verifican.
        void heurisitca_retraccion(CTeoria&) ;
 
+       //Heuristica de generalizacion.
+       // Si dentro de las teorias se encuentra unaque solo difiera de los datos del entorno en una condicíon inicial => se agrega una nueva teoria igual pero con ANY en esa condicion.
+       void heurisitca_generalizacion(CTeoria&);
 
 public: