From: Leandro Lucarella Date: Sun, 10 Dec 2006 21:33:28 +0000 (+0000) Subject: Agrega heurística de generalización hecha por Daniel. X-Git-Tag: entrega-20061218~40 X-Git-Url: https://git.llucax.com/z.facultad/75.68/celdas.git/commitdiff_plain/d341574030ac5443b1aa739060e751826aea7016?ds=sidebyside Agrega heurística de generalización hecha por Daniel. --- diff --git a/trunk/src/sistemaautonomo.cpp b/trunk/src/sistemaautonomo.cpp index 5f1cf2c..73394ea 100644 --- a/trunk/src/sistemaautonomo.cpp +++ b/trunk/src/sistemaautonomo.cpp @@ -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; iteorias[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; jteorias[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& plan) // Aplico heuristicas de observacion this->heurisitca_observacion(t) ; + this->heurisitca_generalizacion(t); } // diff --git a/trunk/src/sistemaautonomo.h b/trunk/src/sistemaautonomo.h index a5e71c4..3179a93 100644 --- a/trunk/src/sistemaautonomo.h +++ b/trunk/src/sistemaautonomo.h @@ -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: