2 #include "sistemaautonomo.h"
5 //--------------------------------------------------------------------------------------------
6 //-- Funciones Auxiliares
7 bool incluye_a (CIndiceMagico<t_dato>& a, CIndiceMagico<t_dato>& b)
12 // Todas las variables de la condicion b deben estar en la condicion a
13 for (i=0; i<b.count() && result; i++)
14 result=a.exist(b.keys(i)) ;
16 // Todas las variables de la condicion a deben tener el mismo valor que en la condicion b
17 for (i=0; i<b.count() && result; i++)
18 result = b[i] == a.find(b.keys(i)) || b[i] == ANY || a.find(b.keys(i)) == ANY ;
25 //--------------------------------------------------------------------------------------------
27 bool CSistemaAutonomo::verificar_condicion(CIndiceMagico<t_dato>& datos)
33 for (i=0; i<datos.count() && result; i++)
34 result = datos[i] == ANY || datos[i] == this->p_entorno->datos.find(datos.keys(i)) ;
43 //--------------------------------------------------------------------------------------------
45 void CSistemaAutonomo::heurisitca_observacion(CTeoria& t)
47 CTeoria nt ; //Nueva Teoria
51 // Le agrego los datos iniciales tal cual estaban antes
52 for (i=0; i<t.datos_iniciales.count(); i++)
53 nt.datos_iniciales.add(t.datos_iniciales.keys(i), t.datos_iniciales[i]) ;
55 // Le agrego todas las condiciones del entorno como condicion final
56 for (i=0; i<this->p_entorno->datos.count(); i++)
57 nt.datos_finales.add(this->p_entorno->datos.keys(i), this->p_entorno->datos[i]) ;
61 nombre = teorias.count() ;
62 teorias.add (nombre.c_str(), nt) ;
67 //--------------------------------------------------------------------------------------------
69 void CSistemaAutonomo::heurisitca_retraccion(CTeoria& t)
71 CTeoria nt ; //Nueva Teoria
74 // Recorro la condicion final de la teoria
75 for (i=0; i<t.datos_finales.count(); i++)
76 // Si el dato no coincidio con el del entorno, y no era ANY
77 if (t.datos_finales[i] != ANY &&
78 t.datos_finales[i] != this->p_entorno->datos.find(t.datos_finales.keys(i))
81 t.datos_finales[i] = ANY ;
85 //--------------------------------------------------------------------------------------------
87 void CSistemaAutonomo::planificar ( CIndiceMagico<t_dato>& datos_iniciales,
88 CIndiceMagico<t_dato>& datos_finales,
89 CIndiceMagico<CTeoria>& plan,
91 unsigned long numero_de_llamada)
94 CIndiceMagico<CTeoria> test_plan ;
95 CIndiceMagico<CTeoria> new_plan ;
100 if ( incluye_a(datos_iniciales, datos_finales) ) return ;
102 if ( numero_de_llamada > 7 ) return ;
104 for (i=0; i<teorias.count(); i++)
105 if ( incluye_a(teorias[i].datos_iniciales, datos_iniciales) )
108 test_plan.add (teorias[i].nombre.c_str(), teorias[i]) ;
110 test_p = p * ((double)teorias[i].p)/((double)teorias[i].k) ;
112 planificar(teorias[i].datos_finales, datos_finales, test_plan, test_p, numero_de_llamada+1) ;
115 if ( incluye_a(test_plan[test_plan.count()-1].datos_finales, datos_finales) )
119 new_plan.add (test_plan) ;
124 plan.add (new_plan) ;
129 //--------------------------------------------------------------------------------------------
131 bool CSistemaAutonomo::ejecutar (CIndiceMagico<CTeoria>& plan)
139 for (i=0; i<plan.count() && result; i++)
144 // Ejecuto la funcion
145 (*pFnc)(*(this->p_entorno)) ;
150 // Actualizo los datos del entorno
151 this->p_entorno->actualizar() ;
153 // Veo si se verifica la condicion final
154 result = this->verificar_condicion(t.datos_finales) ;
156 // Si fallo la teoria
159 // Aplico heuristicas de correccion
160 this->heurisitca_retraccion(t) ;
167 // Aplico heuristicas de observacion
168 this->heurisitca_observacion(t) ;