]> git.llucax.com Git - z.facultad/75.68/celdas.git/blobdiff - trunk/src/sistemaautonomo.cpp
Construyo wrappers con la nueva interfaz que habíamos hablado para el sistema autónom...
[z.facultad/75.68/celdas.git] / trunk / src / sistemaautonomo.cpp
index 5f1cf2c7b12b221b89cecaf6b5b185bfd4a1c0f6..2b988f088856f06d4259455a2a03b187bba73bce 100644 (file)
@@ -63,6 +63,64 @@ 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;
+       unsigned k = 0;
+       unsigned j = 0;
+       int posicionCambio = -1;
+       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 +224,7 @@ bool CSistemaAutonomo::ejecutar (CIndiceMagico<CTeoria>& plan)
 
                // Aplico heuristicas de observacion
                this->heurisitca_observacion(t) ;
+               this->heurisitca_generalizacion(t);
        }
 
        //