]> git.llucax.com Git - z.facultad/75.68/celdas.git/blob - trunk/src/sistemaautonomo.h
Evitamos memory leaks.
[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 // 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
61
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
68
69 // Es la minima relacion P/K que puede tener una teoria para considerarse como aceptable.
70 #define TOLERANCIA                                      0.75
71
72
73 // [Heuristicas]
74
75 // Cantidad de ciclos que se recuerda una teoria.
76 // Poner INFINITO si se desea deshabilitar esta opcion.
77 #define CICLOS_DE_MEMORIA                       10
78
79
80
81
82 bool incluye_a (CIndiceMagico<t_dato>&, CIndiceMagico<t_dato>&) ;
83
84
85
86 class CTeoria;
87 std::ostream& operator<< (std::ostream& os, const CTeoria& t);
88
89 // CTeoria
90 class CTeoria
91 {
92 public:
93
94         std::string             nombre ;
95
96         // Condiciones iniciales de la teoria.
97         // Cada condicion se representa como un par (clave, valor), que se leen como clave=valor +/- PRECISION.
98         // Las condiciones se concatenan con un operador &&
99         CIndiceMagico<t_dato>   datos_iniciales ;
100
101         // La funcion que se debe ejecutar para hacer valer la teoria.
102         std::string funcion ;
103         // TODO std::string accion; Debería ser el nombre de la acción que va a realizar el BREVE
104
105         // Condiciones finales que deben cumplirsem luego de ejecutar la funcion final valiendo la condicion inicial
106         CIndiceMagico<t_dato>   datos_finales ;
107
108 public:
109         CTeoria()
110         {
111                 nombre = "" ;
112                 funcion = "" ;
113                 k = 1 ;
114                 p = 1 ;
115         }
116
117         CTeoria(const std::string& ini_nombre, 
118                 const std::string& ini_funcion,
119                         unsigned long ini_k,
120                         unsigned long ini_p)
121         {
122                 nombre = ini_nombre ;
123                 funcion = ini_funcion ;
124                 k = ini_k ;
125                 p = ini_p ;
126         }
127
128 //private:
129         CTeoria(const CTeoria& t):
130                 nombre(t.nombre),
131                 datos_iniciales(t.datos_iniciales),
132                 funcion(t.funcion),
133                 datos_finales(t.datos_finales),
134                 k(t.k),
135                 p(t.p)
136         {
137                 std::cout << "-----> CTeoria::operator=(" << t << ") <-----\n";
138         }
139         CTeoria& operator= (const CTeoria& t)
140         {
141                 std::cout << "-----> " << *this << "::operator=(" << t << ") <-----\n";
142                 nombre = t.nombre;
143                 funcion = t.funcion;
144                 k = t.k;
145                 p = t.p;
146                 datos_iniciales = t.datos_iniciales;
147                 datos_finales = t.datos_finales;
148                 return *this;
149         }
150
151
152 public: 
153         // Cantidad de veces que se probo la teoria.
154         unsigned long                   k ;
155
156         // Cantidad de veces que se probo la teoria y resulto correcta.
157         unsigned long                   p ;
158
159         // Cantidad de ciclos ocurridos desde que se creo la teoria.
160         // Este parametro se usa para quitarle memoria al SA.
161         unsigned long                   ciclos ;
162
163 } ;
164
165 inline
166 std::ostream& operator<< (std::ostream& os, const CTeoria& t)
167 {
168         return os << "CTeoria(nombre=" << t.nombre << ", funcion=" << t.funcion
169                 << ", p=" << t.p << ", k=" << t.k << /*", ciclos=" << t.ciclos <<*/ ")";
170 //              << "):\n\tdatos_iniciales:\n" << t.datos_iniciales
171 //              << "\tdatos_finales:\n" << t.datos_finales << "\n";
172 }
173
174
175 // CEntorno
176 class CEntorno
177 {
178 public:
179         CIndiceMagico<t_dato>   datos ;
180
181 public:
182 //      CEntorno() { this->inicializar() ; }
183
184 public:
185         // Inicializar los datos
186         virtual void inicializar() {} ;
187
188         // Actualizar los datos
189         virtual void actualizar() {} ;
190
191         // Destructor
192         virtual ~CEntorno() {}
193 } ;
194
195
196
197 // CSistemaAutonomo
198 class CSistemaAutonomo
199 {
200 public:
201         // El entono en el que se mueve el SA.
202         CEntorno*                       p_entorno ;
203
204         // Datos finales a utilizar al hacer
205         CIndiceMagico<t_dato>           m_datos_finales;
206
207         // Las teorias que tiene el SA.
208         CIndiceMagico<CTeoria*>         teorias ;
209
210 public:
211         // Constructor
212         CSistemaAutonomo(): p_entorno(new CEntorno) {}
213
214         // Destructor
215         ~CSistemaAutonomo()
216         {
217                 delete p_entorno;
218                 for (unsigned i = 0; i < teorias.count(); ++i)
219                         delete teorias[i];
220         }
221
222         // Genera un nuevo plan
223         void plan();
224
225         // Indica si hay una teoria mas para ejecutar
226         bool has_next_theory();
227
228         // Obtiene la próxima teoría del plan actual
229         CTeoria* get_next_theory();
230
231         // Retorna true si los valores de la condicion coinciden con los valores del entorno.
232         bool validate_theory(CTeoria*) ;
233
234 //protected:
235         // Retorna true si los valores de la condicion coinciden con los valores del entorno.
236         bool verificar_condicion(CIndiceMagico<t_dato>& datos) ;
237
238         // plan actual
239         CIndiceMagico<CTeoria*> m_plan;
240
241         // teoria actual
242         CIndiceMagico<CTeoria*>::iterator curr_theory;
243
244 protected: 
245
246         // Heuristica de observacion.
247         //      Segun la teoria que se ejecuto, se crea una nueva teoria con TODOS/ALGUNOS valores actuales del entorno como condicion_final.
248         void heuristca_observacion(CTeoria&) ;
249
250         // Heuristica de correccion por retraccion.
251         //      Si una teoria no se verifico como correcta, se crea una nueva quitandole las condiciones_finales que no se verifican.
252         void heuristca_retraccion(CTeoria&) ;
253
254         //Heuristica de generalizacion.
255         // 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.
256         void heuristca_generalizacion(CTeoria&);
257
258 public:
259
260         
261         void planificar (CIndiceMagico<t_dato>& datos_iniciales,
262                         CIndiceMagico<t_dato>&  datos_finales,
263                         CIndiceMagico<CTeoria*>& plan,
264                         double&         p,
265                         unsigned long   numero_de_llamada=0) ;
266
267
268         // Ejecuta una serie de pasos.
269         // Retorna true si se alcanza la condicion final.
270 //      bool ejecutar (CIndiceMagico<CTeoria>& plan) ;
271 } ;
272
273
274
275 #endif
276