]> git.llucax.com Git - z.facultad/75.68/celdas.git/blobdiff - trunk/src/sistemaautonomo.cpp
Bugfix, cambia modo de rotación para que rote en el lugar y varios cambios de parámet...
[z.facultad/75.68/celdas.git] / trunk / src / sistemaautonomo.cpp
index 7469d10122cc747a70f92b01f1d1df860c5c90c8..2c85e518eb2bc21b82100a8f4a4f319a4ee03c30 100644 (file)
@@ -31,9 +31,11 @@ void CSistemaAutonomo::plan()
 {
        double p = 1.0;
        m_plan.clear();
+       if (teorias.count() > max_teorias) purgar_teorias();
 #ifdef DEBUG
        std::cout << "SA: Planificando...\n";
        std::cout << "SA: \tentorno:\n" << p_entorno->datos << "\n";
+       std::cout << "SA: \tteorias:\n" << teorias << "\n";
        std::cout << "SA: \tdatos finales:\n" << m_datos_finales << "\n";
 #endif // DEBUG
        planificar(p_entorno->datos, m_datos_finales, m_plan, p);
@@ -67,6 +69,9 @@ CTeoria* CSistemaAutonomo::get_next_theory()
        }
        else
        {
+#ifdef DEBUG
+               std::cout << "SA: ejecuta teoria: " << **(curr_theory) << "\n";
+#endif // DEBUG
                return *(curr_theory++);
        }
 }
@@ -80,6 +85,10 @@ bool CSistemaAutonomo::validate_theory(CTeoria* t)
        // Aumento k (cantidad de veces que se probó la teoría
        ++t->k;
 
+#ifdef DEBUG
+       std::cout << "SA: Entorno de verificacion:\n" << p_entorno->datos;
+#endif // DEBUG
+
        // Verifico
        result = verificar_condicion(t->datos_finales) ;
 
@@ -105,6 +114,9 @@ bool CSistemaAutonomo::validate_theory(CTeoria* t)
                // Aplico heuristicas de correccion
                this->heuristca_retraccion(*t) ;
        }
+#ifdef DEBUG
+       else std::cout << "SA: Verifica!\n";
+#endif // DEBUG
 
        return result;
 }
@@ -270,7 +282,7 @@ void CSistemaAutonomo::planificar (CIndiceMagico<t_dato>&   datos_iniciales,
 
        if ( incluye_a(datos_iniciales, datos_finales) ) return ;
 
-       if ( numero_de_llamada > 7 ) return ;
+       if (numero_de_llamada > max_pasos) return ;
 
        for (i = 0; i < teorias.count(); i++)
                if ( incluye_a(teorias[i]->datos_iniciales, datos_iniciales) )
@@ -281,7 +293,7 @@ void CSistemaAutonomo::planificar (CIndiceMagico<t_dato>&   datos_iniciales,
                        test_p = p * ((double)teorias[i]->p)/((double)teorias[i]->k) ;
 
                        planificar(teorias[i]->datos_finales, datos_finales, test_plan, test_p, numero_de_llamada+1) ; 
-                       
+
                        if ( test_p>max_p )
                        if ( incluye_a(test_plan[test_plan.count()-1]->datos_finales, datos_finales) )
                        {
@@ -295,52 +307,24 @@ void CSistemaAutonomo::planificar (CIndiceMagico<t_dato>& datos_iniciales,
                plan.add (new_plan) ;
 }
 
-
-/*
-//--------------------------------------------------------------------------------------------
-//--
-bool CSistemaAutonomo::ejecutar (CIndiceMagico<CTeoria>& plan)
+void CSistemaAutonomo::purgar_teorias()
 {
-       bool result = true ;
-       unsigned i ;
-       t_fnc(pFnc) ;
-       CTeoria t ;     
-
-
-       for (i=0; i<plan.count() && result; i++)
+       unsigned size = teorias.count();
+       unsigned pos = size - 1;
+       double whorst_prob = 1.0;
+       for (unsigned i = 0; i < size; ++i)
        {
-               t = plan[i] ;
-               pFnc = t.funcion;
-
-               // Ejecuto la funcion
-               (*pFnc)(*(this->p_entorno)) ;
-
-               // Incremento el K
-               t.k++ ;
-
-               // Actualizo los datos del entorno
-               this->p_entorno->actualizar() ;
-
-               // Veo si se verifica la condicion final
-               result = this->verificar_condicion(t.datos_finales) ;
-
-               // Si fallo la teoria
-               if (!result)
-               {
-                       // Aplico heuristicas de correccion
-                       this->heuristca_retraccion(t) ;
-               }
-               else
+               double p = (double)teorias[i]->p / (double)teorias[i]->k;
+               if (p < whorst_prob)
                {
-                       t.p++ ;
+                       whorst_prob = p;
+                       pos = i;
                }
-
-               // Aplico heuristicas de observacion
-               this->heuristca_observacion(t) ;
-               this->heuristca_generalizacion(t);
        }
-
-       //
-       return result ;
+       teorias.remove(pos);
+#ifdef DEBUG
+       std::cout << "SA: Se purgo la teoria " << *teorias[pos] << "\n";
+#endif // DEBUG
+       if (size - 1 > max_teorias) purgar_teorias();
 }
-*/
+