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) ;
66 //--------------------------------------------------------------------------------------------
68 // Si las condiciones finales del entorno son iguales a las condiciones finales de alguna teoria y
69 // solo una condicion inicial es distinta => agrego una nueva teoría igual (a la q cumple los requisitos
70 // anteriormente detallados) pero tomando ANY en el valor de entrada en el cual difieren.
71 void CSistemaAutonomo::heurisitca_generalizacion(CTeoria& t)
73 CTeoria nt ; //Nueva Teoria
78 int posicionCambio = -1;
79 unsigned cantidadTeorias = 0;
80 std::string nombreTeoria;
82 cantidadTeorias = this->teorias.count();
84 for (i=0; i<cantidadTeorias; i++)
86 for (k=0; k<this->teorias[i].datos_finales.count(); k++)
88 //me fijo si las condiciones finales de la teoria se corresponden con la del entorno.
89 if((this->teorias[i].datos_finales[k] != ANY) && (this->p_entorno->datos.find(t.datos_finales.keys(k)) != ANY))
91 if(this->teorias[i].datos_finales[k] != this->p_entorno->datos.find(t.datos_finales.keys(k)))
98 { // si se corresponden (las condiciones finales son iguales) => me fijo si hay alguna condicion inicial q cambia.
99 for (j=0; j<this->teorias[i].datos_iniciales.count(); j++)
101 if((this->teorias[i].datos_iniciales[j] != ANY) && (this->p_entorno->datos.find(t.datos_iniciales.keys(j)) != ANY))
103 if(this->teorias[i].datos_iniciales[j] != this->p_entorno->datos.find(t.datos_iniciales.keys(j)))
111 {//si cambia solo una => creo una nueva teoria igual pero con ANY en la condicion q cambia.
112 nt = this->teorias[i];
113 nt.datos_iniciales[posicionCambio] = ANY;
116 nombreTeoria = teorias.count() ;
117 teorias.add (nombreTeoria.c_str(), nt) ;
125 //--------------------------------------------------------------------------------------------
127 void CSistemaAutonomo::heurisitca_retraccion(CTeoria& t)
129 CTeoria nt ; //Nueva Teoria
132 // Recorro la condicion final de la teoria
133 for (i=0; i<t.datos_finales.count(); i++)
134 // Si el dato no coincidio con el del entorno, y no era ANY
135 if (t.datos_finales[i] != ANY &&
136 t.datos_finales[i] != this->p_entorno->datos.find(t.datos_finales.keys(i))
139 t.datos_finales[i] = ANY ;
143 //--------------------------------------------------------------------------------------------
145 void CSistemaAutonomo::planificar ( CIndiceMagico<t_dato>& datos_iniciales,
146 CIndiceMagico<t_dato>& datos_finales,
147 CIndiceMagico<CTeoria>& plan,
149 unsigned long numero_de_llamada)
152 CIndiceMagico<CTeoria> test_plan ;
153 CIndiceMagico<CTeoria> new_plan ;
158 if ( incluye_a(datos_iniciales, datos_finales) ) return ;
160 if ( numero_de_llamada > 7 ) return ;
162 for (i=0; i<teorias.count(); i++)
163 if ( incluye_a(teorias[i].datos_iniciales, datos_iniciales) )
166 test_plan.add (teorias[i].nombre.c_str(), teorias[i]) ;
168 test_p = p * ((double)teorias[i].p)/((double)teorias[i].k) ;
170 planificar(teorias[i].datos_finales, datos_finales, test_plan, test_p, numero_de_llamada+1) ;
173 if ( incluye_a(test_plan[test_plan.count()-1].datos_finales, datos_finales) )
177 new_plan.add (test_plan) ;
182 plan.add (new_plan) ;
187 //--------------------------------------------------------------------------------------------
189 bool CSistemaAutonomo::ejecutar (CIndiceMagico<CTeoria>& plan)
197 for (i=0; i<plan.count() && result; i++)
202 // Ejecuto la funcion
203 (*pFnc)(*(this->p_entorno)) ;
208 // Actualizo los datos del entorno
209 this->p_entorno->actualizar() ;
211 // Veo si se verifica la condicion final
212 result = this->verificar_condicion(t.datos_finales) ;
214 // Si fallo la teoria
217 // Aplico heuristicas de correccion
218 this->heurisitca_retraccion(t) ;
225 // Aplico heuristicas de observacion
226 this->heurisitca_observacion(t) ;
227 this->heurisitca_generalizacion(t);