]> git.llucax.com Git - z.facultad/75.68/celdas.git/blobdiff - trunk/src/sistemaautonomo.cpp
Nueva versión del robot usando el sistema autónomo.
[z.facultad/75.68/celdas.git] / trunk / src / sistemaautonomo.cpp
index 5f1cf2c7b12b221b89cecaf6b5b185bfd4a1c0f6..0efe70abb023fec851d8d44d14af3a3a84460d4f 100644 (file)
@@ -20,6 +20,65 @@ bool incluye_a (CIndiceMagico<t_dato>& a, CIndiceMagico<t_dato>& b)
        return result ;
 }
 
+//--------------------------------------------------------------------------------------------
+//--
+void CSistemaAutonomo::plan()
+{
+       double p = 1.0;
+       m_plan.clear();
+       planificar(p_entorno->datos, m_datos_finales, m_plan, p);
+       curr_theory = m_plan.begin();
+}
+
+//--------------------------------------------------------------------------------------------
+//--
+#include <iostream> // XXX FIXME
+bool CSistemaAutonomo::has_next_theory()
+{
+       return curr_theory != m_plan.end();
+}
+
+//--------------------------------------------------------------------------------------------
+//--
+CTeoria* CSistemaAutonomo::get_next_theory()
+{
+       if (curr_theory == m_plan.end())
+       {
+               m_datos_finales.clear();
+               return 0;
+       }
+       else
+       {
+               return &*(curr_theory++);
+       }
+}
+
+//--------------------------------------------------------------------------------------------
+//--
+bool CSistemaAutonomo::validate_theory(CTeoria* t)
+{
+       bool result ;
+
+       result = verificar_condicion(t->datos_finales) ;
+
+
+       // Si fallo la teoria
+       if (!result)
+       {
+               // Aplico heuristicas de correccion
+               this->heurisitca_retraccion(*t) ;
+       }
+       else
+       {
+               t->p++ ;
+       }
+
+       // Aplico heuristicas de observacion
+       this->heurisitca_observacion(*t) ;
+       this->heurisitca_generalizacion(*t);
+
+       return result;
+}
 
 
 //--------------------------------------------------------------------------------------------
@@ -63,6 +122,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;
+       }
+}
 
 //--------------------------------------------------------------------------------------------
 //--
@@ -125,7 +242,7 @@ void CSistemaAutonomo::planificar ( CIndiceMagico<t_dato>&  datos_iniciales,
 }
 
 
-
+/*
 //--------------------------------------------------------------------------------------------
 //--
 bool CSistemaAutonomo::ejecutar (CIndiceMagico<CTeoria>& plan)
@@ -166,8 +283,10 @@ bool CSistemaAutonomo::ejecutar (CIndiceMagico<CTeoria>& plan)
 
                // Aplico heuristicas de observacion
                this->heurisitca_observacion(t) ;
+               this->heurisitca_generalizacion(t);
        }
 
        //
        return result ;
 }
+*/