-//--------------------------------------------------------------------------------------------
-//-- PROBAR BIEN
-template < typename E >
-CIndiceMagico< CTeoria< E >* >* CSistemaAutonomo< E >::planificar (
- CIndiceMagico< t_dato >& datos_iniciales,
- CIndiceMagico< t_dato >& datos_finales,
- CIndiceMagico< CTeoria< E >* >& plan,
- unsigned long numero_de_llamada,
- double& p)
-{
- unsigned i ;
- double nuevo_p ;
- double max_p = 0 ;
- CIndiceMagico< CTeoria< E >* >* p_nuevo_plan ;
- CIndiceMagico< CTeoria< E >* >* pResult = NULL ;
- CIndiceMagico< CIndiceMagico< CTeoria< E >* > > planes ;
-
-
- for (i=0; i<this->teorias.count(); i++)
- {
- // Si la teoria cumple la condicion inicial
- if ( cumple_condiciones(this->teorias[i]->datos_iniciales, datos_iniciales) )
- {
- p_nuevo_plan = new CIndiceMagico< CTeoria< E >* > ;
-
- nuevo_p = ( p + ((double)this->teorias[i]->p) / ((double)this->teorias[i]->k) ) / 2 ;
-
- // Agrego la teoria al plan
- p_nuevo_plan->add (this->teorias[i]->nombre.c_str(), this->teorias[i]) ;
-
- if (numero_de_llamada<PASOS_MAXIMOS_DE_PLAN)
- {
- // Pero si no cumple con la condicion final
- if ( !cumple_condiciones(datos_finales, this->teorias[i]->datos_finales) )
- {
- planificar (this->teorias[i]->datos_finales,
- datos_finales,
- *p_nuevo_plan,
- numero_de_llamada+1,
- nuevo_p) ;
- }
- }
-
-
- // Si cumple con la condicion final
- if (nuevo_p>max_p)
- {
- if ( cumple_condiciones(datos_finales, (*p_nuevo_plan)[p_nuevo_plan->count()-1]->datos_finales) )
- {
- max_p = nuevo_p ;
-
- if (pResult) delete pResult ;
-
- pResult = p_nuevo_plan ;
- }
- }
- }
- }
-
- //
- return pResult ;
-}
-
-
-//--------------------------------------------------------------------------------------------
-//--
-template < typename E >
-bool CSistemaAutonomo< E >::ejecutar (CIndiceMagico<CTeoria< E > >& plan)
-{
- bool result = true ;
- int i ;
- CTeoria< E > t ;
-
-
- for (i=0; i<plan.count() && result; i++)
- {
- t = plan[i] ;
-
- // Ejecuto la funcion
- t.funcion() ;
-
- // 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) ;
- }
-
- //
- return result ;
-}
-
-