X-Git-Url: https://git.llucax.com/z.facultad/75.68/celdas.git/blobdiff_plain/44029734cc5263d0548dc78ce9d71c43719d1ea7..4564a91af300e428600a997b3da82bf4abf50011:/trunk/src/sistemaautonomo.cpp diff --git a/trunk/src/sistemaautonomo.cpp b/trunk/src/sistemaautonomo.cpp index f4cbbab..2b988f0 100644 --- a/trunk/src/sistemaautonomo.cpp +++ b/trunk/src/sistemaautonomo.cpp @@ -4,19 +4,229 @@ //-------------------------------------------------------------------------------------------- //-- Funciones Auxiliares +bool incluye_a (CIndiceMagico& a, CIndiceMagico& b) +{ + bool result = true ; + unsigned i ; + + // Todas las variables de la condicion b deben estar en la condicion a + for (i=0; i& muestra, CIndiceMagico& patron) -{ +//-------------------------------------------------------------------------------------------- +//-- +bool CSistemaAutonomo::verificar_condicion(CIndiceMagico& datos) +{ bool result = true ; unsigned i ; - for (i=0; ip_entorno->datos.find(datos.keys(i)) ; + // return result ; +} + + + +//-------------------------------------------------------------------------------------------- +//-- +void CSistemaAutonomo::heurisitca_observacion(CTeoria& t) +{ + CTeoria nt ; //Nueva Teoria + unsigned i ; + std::string nombre ; + + // Le agrego los datos iniciales tal cual estaban antes + for (i=0; ip_entorno->datos.count(); i++) + nt.datos_finales.add(this->p_entorno->datos.keys(i), this->p_entorno->datos[i]) ; + + + // Agrego la teoria + nombre = teorias.count() ; + teorias.add (nombre.c_str(), nt) ; + +} + +//-------------------------------------------------------------------------------------------- +//-- +// 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; 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; + } +} + +//-------------------------------------------------------------------------------------------- +//-- +void CSistemaAutonomo::heurisitca_retraccion(CTeoria& t) +{ + CTeoria nt ; //Nueva Teoria + unsigned i ; + // Recorro la condicion final de la teoria + for (i=0; ip_entorno->datos.find(t.datos_finales.keys(i)) + ) + // Le asigno ANY + t.datos_finales[i] = ANY ; } + +//-------------------------------------------------------------------------------------------- +//-- +void CSistemaAutonomo::planificar ( CIndiceMagico& datos_iniciales, + CIndiceMagico& datos_finales, + CIndiceMagico& plan, + double& p, + unsigned long numero_de_llamada) +{ + unsigned i; + CIndiceMagico test_plan ; + CIndiceMagico new_plan ; + double test_p ; + double max_p = 0 ; + + + if ( incluye_a(datos_iniciales, datos_finales) ) return ; + + if ( numero_de_llamada > 7 ) return ; + + for (i=0; imax_p ) + if ( incluye_a(test_plan[test_plan.count()-1].datos_finales, datos_finales) ) + { + max_p = test_p ; + new_plan.clear() ; + new_plan.add (test_plan) ; + } + } + + if (max_p>0) + plan.add (new_plan) ; +} + + + +//-------------------------------------------------------------------------------------------- +//-- +bool CSistemaAutonomo::ejecutar (CIndiceMagico& plan) +{ + bool result = true ; + unsigned i ; + t_fnc(pFnc) ; + CTeoria t ; + + + for (i=0; ip_entorno)) ; + + // Incremento el K + t.k++ ; + + // Actualizo los datos del entorno + this->p_entorno->actualizar() ; + + // Veo si se verifica la condicion final + result = this->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 ; +}