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.50000
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 // Cantidad maxima de pasos que puede tener un plan.
58 // Cuanto mas grande sea este numero, mas ciclos puede tardar el proceso de planificacion.
59 // Este valor es un compromiso entre performance y eficiencia.
60 #define PASOS_MAXIMOS_DE_PLAN 20
62 // El metodo de planificacion puede encontrar varios planes, y de ellos elige el mejor.
63 // Si se hace seleccionar TODOS los posibles planes, puede tardar demasiado.
64 // Una opcion es determinar una cantidad maxima de posibles planes que se pueden testear.
65 // Este valor es un compromiso entre performance y eficiencia.
66 // Poner INFINITO si se desea deshabilitar esta opcion.
67 #define PLANES_MAXIMOS_TESTEADOS 10
69 // Es la minima relacion P/K que puede tener una teoria para considerarse como aceptable.
70 #define TOLERANCIA 0.75
75 // Cantidad de ciclos que se recuerda una teoria.
76 // Poner INFINITO si se desea deshabilitar esta opcion.
77 #define CICLOS_DE_MEMORIA 10
82 bool incluye_a (CIndiceMagico<t_dato>&, CIndiceMagico<t_dato>&) ;
94 // Condiciones iniciales de la teoria.
95 // Cada condicion se representa como un par (clave, valor), que se leen como clave=valor +/- PRECISION.
96 // Las condiciones se concatenan con un operador &&
97 CIndiceMagico<t_dato> datos_iniciales ;
99 // La funcion que se debe ejecutar para hacer valer la teoria.
100 double (*funcion)(CEntorno& e) ;
102 // Condiciones finales que deben cumplirsem luego de ejecutar la funcion final valiendo la condicion inicial
103 CIndiceMagico<t_dato> datos_finales ;
114 CTeoria(const char* ini_nombre,
115 double (*ini_funcion)(CEntorno& e),
119 nombre = ini_nombre ;
120 funcion = ini_funcion ;
127 // Cantidad de veces que se probo la teoria.
130 // Cantidad de veces que se probo la teoria y resulto correcta.
133 // Cantidad de ciclos ocurridos desde que se creo la teoria.
134 // Este parametro se usa para quitarle memoria al SA.
135 unsigned long ciclos ;
145 CIndiceMagico<t_dato> datos ;
148 // CEntorno() { this->inicializar() ; }
151 // Inicializar los datos
152 virtual void inicializar() {} ;
154 // Actualizar los datos
155 virtual void actualizar() {} ;
158 virtual ~CEntorno() {}
164 class CSistemaAutonomo
167 // El entono en el que se mueve el SA.
168 CEntorno* p_entorno ;
170 // Las teorias que tiene el SA.
171 CIndiceMagico<CTeoria> teorias ;
174 // Retorna true si los valores de la condicion coinciden con los valores del entorno.
175 bool verificar_condicion(CIndiceMagico<t_dato>& datos) ;
180 // Heuristica de observacion.
181 // Segun la teoria que se ejecuto, se crea una nueva teoria con TODOS/ALGUNOS valores actuales del entorno como condicion_final.
182 void heurisitca_observacion(CTeoria&) ;
184 // Heuristica de correccion por retraccion.
185 // Si una teoria no se verifico como correcta, se crea una nueva quitandole las condiciones_finales que no se verifican.
186 void heurisitca_retraccion(CTeoria&) ;
192 void planificar ( CIndiceMagico<t_dato>& datos_iniciales,
193 CIndiceMagico<t_dato>& datos_finales,
194 CIndiceMagico<CTeoria>& plan,
196 unsigned long numero_de_llamada=0) ;
199 // Ejecuta una serie de pasos.
200 // Retorna true si se alcanza la condicion final.
201 bool ejecutar (CIndiceMagico<CTeoria>& plan) ;