2 #ifndef __SISTEMAAUTONOMO__
3 #define __SISTEMAAUTONOMO__
5 #include "indicemagico.h"
14 // ENTORNO: Variables que definen el entorno.
15 // CONDICION va=a AND vb=b AND vc=c.
16 // TEORIA: Se cumple condicion_inicial y ejecuto funcion F, entonces se cumplira condicion_final.
17 // SISTEMA AUTONOMO: Tiene un ENTORNO y una cantidad de TEORIAS.
18 // CICLO: Son los pasos de:
19 // * Tomar los valores el entorno.
20 // * Decidir una condicion que deberia cumplir el entorno.
21 // * Planificar (PLAN) una serie de acciones (PASOS) para alcanzar la condicion deseada.
22 // * Ejecutar el plan, verificando en cada paso que se vayan cumpliendo las teorias intermedias.
29 typedef double t_dato ;
33 //#define t_fnc(name) double (*name)(CEntorno&)
36 #define INFINITO 9999999 //CORREGIR: Poner aca el numero maximo que puede tomar un unsigend long
39 // ------------------------------------------
40 // Parametros de configuracion de SA
45 // Precision en la comparacion de atributos.
46 // Poner en 0 si se quiere hacer la comparacion exacta.
47 #define PRECISION 0.150000
49 // Cuando se ejecuta un plan, se espera que al termina el ultimo paso se hallan alcanzado las condiciones finales.
50 // Es posible que las condiciones finales se alcancen en algun paso previo.
51 // Esto permite generar nuevas teorias, pero quita performance al proceso de ejecucion.
52 //#define VERIFICAL_RESULTADOS_EN_CADA_PASO true
57 // El metodo de planificacion puede encontrar varios planes, y de ellos elige el mejor.
58 // Si se hace seleccionar TODOS los posibles planes, puede tardar demasiado.
59 // Una opcion es determinar una cantidad maxima de posibles planes que se pueden testear.
60 // Este valor es un compromiso entre performance y eficiencia.
61 // Poner INFINITO si se desea deshabilitar esta opcion.
62 #define PLANES_MAXIMOS_TESTEADOS 10
64 // Es la minima relacion P/K que puede tener una teoria para considerarse como aceptable.
65 #define TOLERANCIA 0.75
70 // Cantidad de ciclos que se recuerda una teoria.
71 // Poner INFINITO si se desea deshabilitar esta opcion.
72 #define CICLOS_DE_MEMORIA 10
77 bool incluye_a (CIndiceMagico<t_dato>&, CIndiceMagico<t_dato>&) ;
82 std::ostream& operator<< (std::ostream& os, const CTeoria& t);
91 // Condiciones iniciales de la teoria.
92 // Cada condicion se representa como un par (clave, valor), que se leen como clave=valor +/- PRECISION.
93 // Las condiciones se concatenan con un operador &&
94 CIndiceMagico<t_dato> datos_iniciales ;
96 // La funcion que se debe ejecutar para hacer valer la teoria.
98 // TODO std::string accion; Debería ser el nombre de la acción que va a realizar el BREVE
100 // Condiciones finales que deben cumplirsem luego de ejecutar la funcion final valiendo la condicion inicial
101 CIndiceMagico<t_dato> datos_finales ;
112 CTeoria(const std::string& ini_nombre,
113 const std::string& ini_funcion,
117 nombre = ini_nombre ;
118 funcion = ini_funcion ;
124 // Cantidad de veces que se probo la teoria.
127 // Cantidad de veces que se probo la teoria y resulto correcta.
130 // Cantidad de ciclos ocurridos desde que se creo la teoria.
131 // Este parametro se usa para quitarle memoria al SA.
132 unsigned long ciclos ;
137 std::ostream& operator<< (std::ostream& os, const CTeoria& t)
140 return os << t.nombre << "," << t.funcion << "," << t.p << "," << t.k;
142 return os << "CTeoria(nombre=" << t.nombre << ", funcion=" << t.funcion
143 << ", p=" << t.p << ", k=" << t.k << ")";
149 std::ostream& operator<< (std::ostream& os, CIndiceMagico<CTeoria*>& im)
151 unsigned c = im.count();
152 if (c-- == 0) return os << "";
153 for (unsigned i = 0; i < c; ++i)
154 os << *im[i] << "\n";
164 CIndiceMagico<t_dato> datos ;
167 // CEntorno() { this->inicializar() ; }
170 // Inicializar los datos
171 virtual void inicializar() {} ;
173 // Actualizar los datos
174 virtual void actualizar() {} ;
177 virtual ~CEntorno() {}
183 class CSistemaAutonomo
186 // El entono en el que se mueve el SA.
187 CEntorno* p_entorno ;
189 // Datos finales a utilizar al hacer
190 CIndiceMagico<t_dato> m_datos_finales;
192 // Las teorias que tiene el SA.
193 CIndiceMagico<CTeoria*> teorias ;
195 // Cantidad maxima de pasos que puede tener un plan.
196 // Cuanto mas grande sea este numero, mas ciclos puede tardar el proceso de planificacion.
197 // Este valor es un compromiso entre performance y eficiencia.
200 // Cantidad máxima de teorías que puede tener el planificador. Al haber muchas teorías el
201 // tarda demasiado tiempo en planificar, por lo tanto es necesario sacar algunas teorías
202 // para que sea utilizable. El valor en realidad no es la cantidad máxima, pueden haber
203 // más, pero en cada nueva planificación se seleccionan las mejores max_teorias teorias.
204 unsigned max_teorias;
208 CSistemaAutonomo(unsigned max_pasos = 4, unsigned max_teorias = 15):
209 p_entorno(new CEntorno), max_pasos(max_pasos),
210 max_teorias(max_teorias) {}
216 for (unsigned i = 0; i < teorias.count(); ++i)
220 // Genera un nuevo plan
223 // Indica si hay una teoria mas para ejecutar
224 bool has_next_theory();
226 // Obtiene la próxima teoría del plan actual
227 CTeoria* get_next_theory();
229 // Retorna true si los valores de la condicion coinciden con los valores del entorno.
230 bool validate_theory(CTeoria*) ;
233 // Retorna true si los valores de la condicion coinciden con los valores del entorno.
234 bool verificar_condicion(CIndiceMagico<t_dato>& datos) ;
237 CIndiceMagico<CTeoria*> m_plan;
240 CIndiceMagico<CTeoria*>::iterator curr_theory;
244 // Heuristica de observacion.
245 // Segun la teoria que se ejecuto, se crea una nueva teoria con TODOS/ALGUNOS valores actuales del entorno como condicion_final.
246 void heuristca_observacion(CTeoria&) ;
248 // Heuristica de correccion por retraccion.
249 // Si una teoria no se verifico como correcta, se crea una nueva quitandole las condiciones_finales que no se verifican.
250 void heuristca_retraccion(CTeoria&) ;
252 //Heuristica de generalizacion.
253 // Si dentro de las teorias se encuentra unaque solo difiera de los datos del entorno en una condicíon inicial => se agrega una nueva teoria igual pero con ANY en esa condicion.
254 void heuristca_generalizacion(CTeoria&);
256 // Purga las teorias que no son muy exitosas.
257 void purgar_teorias();
262 void planificar (CIndiceMagico<t_dato>& datos_iniciales,
263 CIndiceMagico<t_dato>& datos_finales,
264 CIndiceMagico<CTeoria*>& plan,
266 unsigned long numero_de_llamada=0) ;
269 // Ejecuta una serie de pasos.
270 // Retorna true si se alcanza la condicion final.
271 // bool ejecutar (CIndiceMagico<CTeoria>& plan) ;