]> git.llucax.com Git - z.facultad/75.68/celdas.git/blob - trunk/src/sistemaautonomo.h
Últimos cambios y documentación.
[z.facultad/75.68/celdas.git] / trunk / src / sistemaautonomo.h
1
2 #ifndef __SISTEMAAUTONOMO__
3 #define __SISTEMAAUTONOMO__
4
5 #include "indicemagico.h"
6 #include <math.h>
7 #include <string>
8 #include <iostream>
9
10
11 // DEFINICIONES:
12 // ------------
13 //
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.
23 //      PLAN:
24 //      PASO:
25
26 class CEntorno ;
27
28
29 typedef double t_dato ;
30 #define ANY -3000000
31
32
33 //#define t_fnc(name)           double (*name)(CEntorno&)
34
35
36 #define INFINITO        9999999 //CORREGIR: Poner aca el numero maximo que puede tomar un unsigend long
37
38
39 // ------------------------------------------
40 // Parametros de configuracion de SA
41
42
43 // [Ejecutador]
44
45 // Precision en la comparacion de atributos.
46 // Poner en 0 si se quiere hacer la comparacion exacta.
47 #define PRECISION                                                               0.150000
48
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
53
54
55 // [Planificador]
56
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
63
64 // Es la minima relacion P/K que puede tener una teoria para considerarse como aceptable.
65 #define TOLERANCIA                                      0.75
66
67
68 // [Heuristicas]
69
70 // Cantidad de ciclos que se recuerda una teoria.
71 // Poner INFINITO si se desea deshabilitar esta opcion.
72 #define CICLOS_DE_MEMORIA                       10
73
74
75
76
77 bool incluye_a (CIndiceMagico<t_dato>&, CIndiceMagico<t_dato>&) ;
78
79
80
81 class CTeoria;
82 std::ostream& operator<< (std::ostream& os, const CTeoria& t);
83
84 // CTeoria
85 class CTeoria
86 {
87 public:
88
89         std::string             nombre ;
90
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 ;
95
96         // La funcion que se debe ejecutar para hacer valer la teoria.
97         std::string funcion ;
98         // TODO std::string accion; Debería ser el nombre de la acción que va a realizar el BREVE
99
100         // Condiciones finales que deben cumplirsem luego de ejecutar la funcion final valiendo la condicion inicial
101         CIndiceMagico<t_dato>   datos_finales ;
102
103 public:
104         CTeoria()
105         {
106                 nombre = "" ;
107                 funcion = "" ;
108                 k = 1 ;
109                 p = 1 ;
110         }
111
112         CTeoria(const std::string& ini_nombre, 
113                 const std::string& ini_funcion,
114                         unsigned long ini_k,
115                         unsigned long ini_p)
116         {
117                 nombre = ini_nombre ;
118                 funcion = ini_funcion ;
119                 k = ini_k ;
120                 p = ini_p ;
121         }
122
123 public: 
124         // Cantidad de veces que se probo la teoria.
125         unsigned long                   k ;
126
127         // Cantidad de veces que se probo la teoria y resulto correcta.
128         unsigned long                   p ;
129
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 ;
133
134 } ;
135
136 inline
137 std::ostream& operator<< (std::ostream& os, const CTeoria& t)
138 {
139 #ifdef LOG
140         return os << t.nombre << "," << t.funcion << "," << t.p << "," << t.k;
141 #else // ! LOG
142         return os << "CTeoria(nombre=" << t.nombre << ", funcion=" << t.funcion
143                 << ", p=" << t.p << ", k=" << t.k << ")";
144 #endif // LOG
145 }
146
147 template < >
148 inline
149 std::ostream& operator<< (std::ostream& os, CIndiceMagico<CTeoria*>& im)
150 {
151         unsigned c = im.count();
152         if (c-- == 0) return os << "";
153         for (unsigned i = 0; i < c; ++i)
154                 os << *im[i] << "\n";
155         os << *im[c];
156         return os;
157 }
158
159
160 // CEntorno
161 class CEntorno
162 {
163 public:
164         CIndiceMagico<t_dato>   datos ;
165
166 public:
167 //      CEntorno() { this->inicializar() ; }
168
169 public:
170         // Inicializar los datos
171         virtual void inicializar() {} ;
172
173         // Actualizar los datos
174         virtual void actualizar() {} ;
175
176         // Destructor
177         virtual ~CEntorno() {}
178 } ;
179
180
181
182 // CSistemaAutonomo
183 class CSistemaAutonomo
184 {
185 public:
186         // El entono en el que se mueve el SA.
187         CEntorno*                       p_entorno ;
188
189         // Datos finales a utilizar al hacer
190         CIndiceMagico<t_dato>           m_datos_finales;
191
192         // Las teorias que tiene el SA.
193         CIndiceMagico<CTeoria*>         teorias ;
194
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.
198         unsigned max_pasos;
199
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;
205
206 public:
207         // Constructor
208         CSistemaAutonomo(unsigned max_pasos = 4, unsigned max_teorias = 15):
209                 p_entorno(new CEntorno), max_pasos(max_pasos),
210                 max_teorias(max_teorias) {}
211
212         // Destructor
213         ~CSistemaAutonomo()
214         {
215                 delete p_entorno;
216                 for (unsigned i = 0; i < teorias.count(); ++i)
217                         delete teorias[i];
218         }
219
220         // Genera un nuevo plan
221         void plan();
222
223         // Indica si hay una teoria mas para ejecutar
224         bool has_next_theory();
225
226         // Obtiene la próxima teoría del plan actual
227         CTeoria* get_next_theory();
228
229         // Retorna true si los valores de la condicion coinciden con los valores del entorno.
230         bool validate_theory(CTeoria*) ;
231
232 //protected:
233         // Retorna true si los valores de la condicion coinciden con los valores del entorno.
234         bool verificar_condicion(CIndiceMagico<t_dato>& datos) ;
235
236         // plan actual
237         CIndiceMagico<CTeoria*> m_plan;
238
239         // teoria actual
240         CIndiceMagico<CTeoria*>::iterator curr_theory;
241
242 protected: 
243
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&) ;
247
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&) ;
251
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&);
255
256         // Purga las teorias que no son muy exitosas.
257         void purgar_teorias();
258
259 public:
260
261         
262         void planificar (CIndiceMagico<t_dato>& datos_iniciales,
263                         CIndiceMagico<t_dato>&  datos_finales,
264                         CIndiceMagico<CTeoria*>& plan,
265                         double&         p,
266                         unsigned long   numero_de_llamada=0) ;
267
268
269         // Ejecuta una serie de pasos.
270         // Retorna true si se alcanza la condicion final.
271 //      bool ejecutar (CIndiceMagico<CTeoria>& plan) ;
272 } ;
273
274
275
276 #endif
277