#include "indicemagico.h"
#include <math.h>
#include <string>
-//#include <map>
+#include <iostream>
// DEFINICIONES:
// Cantidad maxima de pasos que puede tener un plan.
// Cuanto mas grande sea este numero, mas ciclos puede tardar el proceso de planificacion.
// Este valor es un compromiso entre performance y eficiencia.
-#define PASOS_MAXIMOS_DE_PLAN 20
+#define PASOS_MAXIMOS_DE_PLAN 4
// El metodo de planificacion puede encontrar varios planes, y de ellos elige el mejor.
// Si se hace seleccionar TODOS los posibles planes, puede tardar demasiado.
// Poner INFINITO si se desea deshabilitar esta opcion.
#define PLANES_MAXIMOS_TESTEADOS 10
+// Cantidad máxima de teorías que puede tener el planificador. Al haber muchas teorías el
+// tarda demasiado tiempo en planificar, por lo tanto es necesario sacar algunas teorías
+// para que sea utilizable.
+#define TEORIAS_MAX 20
+
// Es la minima relacion P/K que puede tener una teoria para considerarse como aceptable.
#define TOLERANCIA 0.75
+class CTeoria;
+std::ostream& operator<< (std::ostream& os, const CTeoria& t);
// CTeoria
class CTeoria
{
public:
- std::string nombre ;
+ std::string nombre ;
// Condiciones iniciales de la teoria.
// Cada condicion se representa como un par (clave, valor), que se leen como clave=valor +/- PRECISION.
p = 1 ;
}
- CTeoria(const char* ini_nombre,
- const char* ini_funcion,
+ CTeoria(const std::string& ini_nombre,
+ const std::string& ini_funcion,
unsigned long ini_k,
unsigned long ini_p)
{
p = ini_p ;
}
-
public:
// Cantidad de veces que se probo la teoria.
unsigned long k ;
} ;
+inline
+std::ostream& operator<< (std::ostream& os, const CTeoria& t)
+{
+ return os << "CTeoria(nombre=" << t.nombre << ", funcion=" << t.funcion
+ << ", p=" << t.p << ", k=" << t.k << /*", ciclos=" << t.ciclos <<*/ ")";
+// << "):\n\tdatos_iniciales:\n" << t.datos_iniciales
+// << "\tdatos_finales:\n" << t.datos_finales << "\n";
+}
// CEntorno
CIndiceMagico<t_dato> m_datos_finales;
// Las teorias que tiene el SA.
- CIndiceMagico<CTeoria> teorias ;
+ CIndiceMagico<CTeoria*> teorias ;
public:
// Constructor
CSistemaAutonomo(): p_entorno(new CEntorno) {}
// Destructor
- ~CSistemaAutonomo() { delete p_entorno; }
+ ~CSistemaAutonomo()
+ {
+ delete p_entorno;
+ for (unsigned i = 0; i < teorias.count(); ++i)
+ delete teorias[i];
+ }
// Genera un nuevo plan
void plan();
// Retorna true si los valores de la condicion coinciden con los valores del entorno.
bool validate_theory(CTeoria*) ;
-protected:
+//protected:
// Retorna true si los valores de la condicion coinciden con los valores del entorno.
bool verificar_condicion(CIndiceMagico<t_dato>& datos) ;
// plan actual
- CIndiceMagico<CTeoria> m_plan;
+ CIndiceMagico<CTeoria*> m_plan;
// teoria actual
- CIndiceMagico<CTeoria>::iterator curr_theory;
+ CIndiceMagico<CTeoria*>::iterator curr_theory;
protected:
// Heuristica de observacion.
// Segun la teoria que se ejecuto, se crea una nueva teoria con TODOS/ALGUNOS valores actuales del entorno como condicion_final.
- void heurisitca_observacion(CTeoria&) ;
+ void heuristca_observacion(CTeoria&) ;
// Heuristica de correccion por retraccion.
// Si una teoria no se verifico como correcta, se crea una nueva quitandole las condiciones_finales que no se verifican.
- void heurisitca_retraccion(CTeoria&) ;
+ void heuristca_retraccion(CTeoria&) ;
//Heuristica de generalizacion.
// 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.
- void heurisitca_generalizacion(CTeoria&);
+ void heuristca_generalizacion(CTeoria&);
+
+ // Purga las teorias que no son muy exitosas.
+ void purgar_teorias();
public:
void planificar (CIndiceMagico<t_dato>& datos_iniciales,
CIndiceMagico<t_dato>& datos_finales,
- CIndiceMagico<CTeoria>& plan,
+ CIndiceMagico<CTeoria*>& plan,
double& p,
unsigned long numero_de_llamada=0) ;