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;
80 unsigned cantidadTeorias = 0;
81 std::string nombreTeoria;
83 cantidadTeorias = this->teorias.count();
85 for (i=0; i<cantidadTeorias; i++)
87 for (k=0; k<this->teorias[i].datos_finales.count(); k++)
89 //me fijo si las condiciones finales de la teoria se corresponden con la del entorno.
90 if((this->teorias[i].datos_finales[k] != ANY) && (this->p_entorno->datos.find(t.datos_finales.keys(k)) != ANY))
92 if(this->teorias[i].datos_finales[k] != this->p_entorno->datos.find(t.datos_finales.keys(k)))
99 { // si se corresponden (las condiciones finales son iguales) => me fijo si hay alguna condicion inicial q cambia.
100 for (j=0; j<this->teorias[i].datos_iniciales.count(); j++)
102 if((this->teorias[i].datos_iniciales[j] != ANY) && (this->p_entorno->datos.find(t.datos_iniciales.keys(j)) != ANY))
104 if(this->teorias[i].datos_iniciales[j] != this->p_entorno->datos.find(t.datos_iniciales.keys(j)))
112 {//si cambia solo una => creo una nueva teoria igual pero con ANY en la condicion q cambia.
113 nt = this->teorias[i];
114 nt.datos_iniciales[posicionCambio] = ANY;
117 nombreTeoria = teorias.count() ;
118 teorias.add (nombreTeoria.c_str(), nt) ;
126 //--------------------------------------------------------------------------------------------
128 void CSistemaAutonomo::heurisitca_retraccion(CTeoria& t)
130 CTeoria nt ; //Nueva Teoria
133 // Recorro la condicion final de la teoria
134 for (i=0; i<t.datos_finales.count(); i++)
135 // Si el dato no coincidio con el del entorno, y no era ANY
136 if (t.datos_finales[i] != ANY &&
137 t.datos_finales[i] != this->p_entorno->datos.find(t.datos_finales.keys(i))
140 t.datos_finales[i] = ANY ;
144 //--------------------------------------------------------------------------------------------
146 void CSistemaAutonomo::planificar ( CIndiceMagico<t_dato>& datos_iniciales,
147 CIndiceMagico<t_dato>& datos_finales,
148 CIndiceMagico<CTeoria>& plan,
150 unsigned long numero_de_llamada)
153 CIndiceMagico<CTeoria> test_plan ;
154 CIndiceMagico<CTeoria> new_plan ;
159 if ( incluye_a(datos_iniciales, datos_finales) ) return ;
161 if ( numero_de_llamada > 7 ) return ;
163 for (i=0; i<teorias.count(); i++)
164 if ( incluye_a(teorias[i].datos_iniciales, datos_iniciales) )
167 test_plan.add (teorias[i].nombre.c_str(), teorias[i]) ;
169 test_p = p * ((double)teorias[i].p)/((double)teorias[i].k) ;
171 planificar(teorias[i].datos_finales, datos_finales, test_plan, test_p, numero_de_llamada+1) ;
174 if ( incluye_a(test_plan[test_plan.count()-1].datos_finales, datos_finales) )
178 new_plan.add (test_plan) ;
183 plan.add (new_plan) ;
188 //--------------------------------------------------------------------------------------------
190 bool CSistemaAutonomo::ejecutar (CIndiceMagico<CTeoria>& plan)
198 for (i=0; i<plan.count() && result; i++)
203 // Ejecuto la funcion
204 (*pFnc)(*(this->p_entorno)) ;
209 // Actualizo los datos del entorno
210 this->p_entorno->actualizar() ;
212 // Veo si se verifica la condicion final
213 result = this->verificar_condicion(t.datos_finales) ;
215 // Si fallo la teoria
218 // Aplico heuristicas de correccion
219 this->heurisitca_retraccion(t) ;
226 // Aplico heuristicas de observacion
227 this->heurisitca_observacion(t) ;
228 this->heurisitca_generalizacion(t);