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 ;
23 //--------------------------------------------------------------------------------------------
25 void CSistemaAutonomo::plan()
29 planificar(p_entorno->datos, m_datos_finales, m_plan, p);
30 curr_theory = m_plan.begin();
33 //--------------------------------------------------------------------------------------------
35 #include <iostream> // XXX FIXME
36 bool CSistemaAutonomo::has_next_theory()
38 return curr_theory != m_plan.end();
41 //--------------------------------------------------------------------------------------------
43 CTeoria* CSistemaAutonomo::get_next_theory()
45 if (curr_theory == m_plan.end())
47 m_datos_finales.clear();
52 return &*(curr_theory++);
56 //--------------------------------------------------------------------------------------------
58 bool CSistemaAutonomo::validate_theory(CTeoria* t)
62 result = verificar_condicion(t->datos_finales) ;
68 // Aplico heuristicas de correccion
69 this->heurisitca_retraccion(*t) ;
76 // Aplico heuristicas de observacion
77 this->heurisitca_observacion(*t) ;
78 this->heurisitca_generalizacion(*t);
84 //--------------------------------------------------------------------------------------------
86 bool CSistemaAutonomo::verificar_condicion(CIndiceMagico<t_dato>& datos)
92 for (i=0; i<datos.count() && result; i++)
93 result = datos[i] == ANY || datos[i] == this->p_entorno->datos.find(datos.keys(i)) ;
102 //--------------------------------------------------------------------------------------------
104 void CSistemaAutonomo::heurisitca_observacion(CTeoria& t)
106 CTeoria nt ; //Nueva Teoria
110 // Le agrego los datos iniciales tal cual estaban antes
111 for (i=0; i<t.datos_iniciales.count(); i++)
112 nt.datos_iniciales.add(t.datos_iniciales.keys(i), t.datos_iniciales[i]) ;
114 // Le agrego todas las condiciones del entorno como condicion final
115 for (i=0; i<this->p_entorno->datos.count(); i++)
116 nt.datos_finales.add(this->p_entorno->datos.keys(i), this->p_entorno->datos[i]) ;
120 nombre = teorias.count() ;
121 teorias.add (nombre.c_str(), nt) ;
125 //--------------------------------------------------------------------------------------------
127 // Si las condiciones finales del entorno son iguales a las condiciones finales de alguna teoria y
128 // solo una condicion inicial es distinta => agrego una nueva teoría igual (a la q cumple los requisitos
129 // anteriormente detallados) pero tomando ANY en el valor de entrada en el cual difieren.
130 void CSistemaAutonomo::heurisitca_generalizacion(CTeoria& t)
132 CTeoria nt ; //Nueva Teoria
137 int posicionCambio = -1;
138 unsigned cantidadTeorias = 0;
139 std::string nombreTeoria;
141 cantidadTeorias = this->teorias.count();
143 for (i=0; i<cantidadTeorias; i++)
145 for (k=0; k<this->teorias[i].datos_finales.count(); k++)
147 //me fijo si las condiciones finales de la teoria se corresponden con la del entorno.
148 if((this->teorias[i].datos_finales[k] != ANY) && (this->p_entorno->datos.find(t.datos_finales.keys(k)) != ANY))
150 if(this->teorias[i].datos_finales[k] != this->p_entorno->datos.find(t.datos_finales.keys(k)))
157 { // si se corresponden (las condiciones finales son iguales) => me fijo si hay alguna condicion inicial q cambia.
158 for (j=0; j<this->teorias[i].datos_iniciales.count(); j++)
160 if((this->teorias[i].datos_iniciales[j] != ANY) && (this->p_entorno->datos.find(t.datos_iniciales.keys(j)) != ANY))
162 if(this->teorias[i].datos_iniciales[j] != this->p_entorno->datos.find(t.datos_iniciales.keys(j)))
170 {//si cambia solo una => creo una nueva teoria igual pero con ANY en la condicion q cambia.
171 nt = this->teorias[i];
172 nt.datos_iniciales[posicionCambio] = ANY;
175 nombreTeoria = teorias.count() ;
176 teorias.add (nombreTeoria.c_str(), nt) ;
184 //--------------------------------------------------------------------------------------------
186 void CSistemaAutonomo::heurisitca_retraccion(CTeoria& t)
188 CTeoria nt ; //Nueva Teoria
191 // Recorro la condicion final de la teoria
192 for (i=0; i<t.datos_finales.count(); i++)
193 // Si el dato no coincidio con el del entorno, y no era ANY
194 if (t.datos_finales[i] != ANY &&
195 t.datos_finales[i] != this->p_entorno->datos.find(t.datos_finales.keys(i))
198 t.datos_finales[i] = ANY ;
202 //--------------------------------------------------------------------------------------------
204 void CSistemaAutonomo::planificar ( CIndiceMagico<t_dato>& datos_iniciales,
205 CIndiceMagico<t_dato>& datos_finales,
206 CIndiceMagico<CTeoria>& plan,
208 unsigned long numero_de_llamada)
211 CIndiceMagico<CTeoria> test_plan ;
212 CIndiceMagico<CTeoria> new_plan ;
217 if ( incluye_a(datos_iniciales, datos_finales) ) return ;
219 if ( numero_de_llamada > 7 ) return ;
221 for (i=0; i<teorias.count(); i++)
222 if ( incluye_a(teorias[i].datos_iniciales, datos_iniciales) )
225 test_plan.add (teorias[i].nombre.c_str(), teorias[i]) ;
227 test_p = p * ((double)teorias[i].p)/((double)teorias[i].k) ;
229 planificar(teorias[i].datos_finales, datos_finales, test_plan, test_p, numero_de_llamada+1) ;
232 if ( incluye_a(test_plan[test_plan.count()-1].datos_finales, datos_finales) )
236 new_plan.add (test_plan) ;
241 plan.add (new_plan) ;
246 //--------------------------------------------------------------------------------------------
248 bool CSistemaAutonomo::ejecutar (CIndiceMagico<CTeoria>& plan)
256 for (i=0; i<plan.count() && result; i++)
261 // Ejecuto la funcion
262 (*pFnc)(*(this->p_entorno)) ;
267 // Actualizo los datos del entorno
268 this->p_entorno->actualizar() ;
270 // Veo si se verifica la condicion final
271 result = this->verificar_condicion(t.datos_finales) ;
273 // Si fallo la teoria
276 // Aplico heuristicas de correccion
277 this->heurisitca_retraccion(t) ;
284 // Aplico heuristicas de observacion
285 this->heurisitca_observacion(t) ;
286 this->heurisitca_generalizacion(t);