Ejemplo n.º 1
0
        public void registraEvento(Evento tipoEvento, RegistroSimulacion simulacion, String informacion)
        {
            informacion.Replace('\'', '"');
            informacion.Replace('\\', ' ');
            SqlConnection sqlConnection = new SqlConnection(connectionString);
            SqlCommand    cmd           = new SqlCommand();

            cmd.CommandText = string.Format("INSERT INTO SimulacionKarelotitlan.dbo.Evento (idSimulacion,tipoEvento,timestamp,comentario) VALUES ({0},{1},SYSDATETIME(),'{2}');", simulacion.id, tipoEvento.idEvento, informacion);
            cmd.Connection  = sqlConnection;
            sqlConnection.Open();
            cmd.ExecuteNonQuery();
            sqlConnection.Close();
        }
Ejemplo n.º 2
0
        public void Simula()
        {
            ciclosCompletos    = 0;
            totalRResueltas    = 0;
            totalRFallidas     = 0;
            totalSubioNivel    = 0;
            totalColdStart     = 0;
            alumnosCompletos   = 0;
            alumnosRendidos    = 0;
            sinRecomendaciones = 0;
            VariablesCompartidas.Instance.reinicia();

            RegistroSimulacion rsimulacion = new RegistroSimulacion();

            rsimulacion.inicia();
            idSimulacion = rsimulacion.id;
            EventoManager.Instance.registroSimulacion = rsimulacion; //indica que debe guardar las simulaciones
            rsimulacion.recomendador = recomendador;

            SimulacionDB simuladorDB = new SimulacionDB();

            simuladorDB.limpiaBase();
            //simuladorDB.llenaUsuarios();
            //simuladorDB.llenaUsuariosProbelmas();

            pasaUsuariosReales();

            log      = new StringBuilder();
            usuarios = new Dictionary <int, Usuario>();
            for (int i = 0; i < nUsuarios; i++)
            {
                Usuario nuevo = new Usuario(rsimulacion.id, motivacionInicial, aPositiva, aNegativa, fFacilidad, sinRecomendacion);
                usuarios[nuevo.idUsuario]       = nuevo;
                usuarios[nuevo.idUsuario].temas = temas;
            }
            VariablesCompartidas.Instance.usuarios = usuarios;
            Stopwatch sw = new Stopwatch();

            sw.Start();
            recomendador.iniciaRecomendador();
            sw.Stop();
            TimeSpan tiempoTranscurrido = sw.Elapsed;

            EventoManager.Instance.registraEvento("tIniciaRecomendador", tiempoTranscurrido.TotalMilliseconds.ToString());
            for (int iteracion = 0; iteracion < nCiclos; iteracion++)
            {
                parcialRResueltas = 0;
                parcialRFallidas  = 0;
                parcialSubioNivel = 0;
                VariablesCompartidas.Instance.nColdStart = 0;
                log.Append("Iteracion: " + iteracion.ToString() + "\r\n");
                foreach (var user in usuarios)
                {
                    log.Append(user.Value.ToString());
                }

                sw = new Stopwatch();
                sw.Start();
                recomendador.realizaAnalisis();
                sw.Stop();
                tiempoTranscurrido = sw.Elapsed;
                EventoManager.Instance.registraEvento("tRealizaAnalisis", tiempoTranscurrido.TotalMilliseconds.ToString());

                SelectorRandom sr = new SelectorRandom(nUsuarios);
                alumnosCompletos = 0;
                alumnosRendidos  = 0;
                foreach (var user in usuarios)
                {
                    int i = user.Key;
                    sr.agrega(i, (int)Math.Floor(usuarios[i].motivacion));
                    if (usuarios[i].rendido)
                    {
                        alumnosRendidos++;
                    }
                    if (usuarios[i].acaboProblemas)
                    {
                        alumnosCompletos++;
                    }
                }
                simulacionesADar  = sr.cuantosRestantes();
                simulacionesDadas = 0;
                EventoManager.Instance.registraEvento("nRecomendaciones", simulacionesADar.ToString());
                double totalTiempoRecomendacion = 0.0;
                int    contTiempoRecomendacion  = 0;
                while (!sr.empty())
                {
                    int pUsuario = sr.saca();

                    sw = new Stopwatch();
                    sw.Start();
                    int recomendacion = recomendador.recomendacion(usuarios[pUsuario].idUsuario);
                    sw.Stop();
                    tiempoTranscurrido        = sw.Elapsed;
                    totalTiempoRecomendacion += tiempoTranscurrido.TotalMilliseconds;
                    contTiempoRecomendacion++;

                    log.Append(pUsuario);
                    log.Append(",");
                    log.Append(recomendacion.ToString());
                    log.Append(",");
                    //Registrar recomendacion
                    //TODO: hacer un random Unico
                    if (recomendacion < 0)
                    {
                        // el recomendador no pudo generar recomendacion
                        if (usuarios[pUsuario].resolvioTodo())
                        {
                            log.Append("Resolvio Todo");
                        }
                        else
                        {
                            sinRecomendaciones++;
                            log.Append("Recomendador no tiene recomendaciones");
                        }
                    }
                    else
                    {
                        if (pasa(usuarios[pUsuario], recomendacion))
                        {
                            totalRResueltas++;
                            parcialRResueltas++;
                            log.Append("paso");
                            log.Append(",");
                            usuarios[pUsuario].resolvio(problemas[recomendacion]);
                            if (subeNivel(usuarios[pUsuario], recomendacion))
                            {
                                totalSubioNivel++;
                                parcialSubioNivel++;
                                rsimulacion.registraRecomendacion(usuarios[pUsuario], recomendacion, true, true);
                                usuarios[pUsuario].subeNivel(problemas[recomendacion].idTema);
                                log.Append("Subio");
                                log.Append(",");
                            }
                            else
                            {
                                rsimulacion.registraRecomendacion(usuarios[pUsuario], recomendacion, true, false);
                                log.Append("no subio");
                                log.Append(",");
                            }
                        }
                        else
                        {
                            totalRFallidas++;
                            parcialRFallidas++;
                            log.Append("no paso");
                            log.Append(",");
                            rsimulacion.registraRecomendacion(usuarios[pUsuario], recomendacion, false, false);
                            usuarios[pUsuario].fallo(problemas[recomendacion]);
                            log.Append("no subio,");
                        }
                    }
                    log.Append("\r\n");
                    simulacionesDadas++;
                }
                log.Append("\r\n");
                foreach (var user in usuarios)
                {
                    int i = user.Key;
                    usuarios[i].tickTiempo();
                }
                parcialColdStart = VariablesCompartidas.Instance.nColdStart;
                totalColdStart  += parcialColdStart;
                EventoManager.Instance.registraEvento("nFallos", totalRFallidas.ToString());
                EventoManager.Instance.registraEvento("nFallosCiclo", parcialRFallidas.ToString());
                EventoManager.Instance.registraEvento("nExitos", totalRResueltas.ToString());
                EventoManager.Instance.registraEvento("nExitosCiclo", parcialRResueltas.ToString());
                EventoManager.Instance.registraEvento("nIncNivel", totalSubioNivel.ToString());
                EventoManager.Instance.registraEvento("nIncNivelCiclo", parcialSubioNivel.ToString());
                EventoManager.Instance.registraEvento("nCompletos", alumnosCompletos.ToString());
                EventoManager.Instance.registraEvento("nRendidos", alumnosRendidos.ToString());
                EventoManager.Instance.registraEvento("nSinRecomendacion", sinRecomendaciones.ToString());
                EventoManager.Instance.registraEvento("nColdStart", totalColdStart.ToString());
                EventoManager.Instance.registraEvento("nColdStartCiclo", parcialColdStart.ToString());
                if (contTiempoRecomendacion > 0)
                {
                    EventoManager.Instance.registraEvento("tPromedioRecomendacion", (totalTiempoRecomendacion / (double)contTiempoRecomendacion).ToString());
                }
                else
                {
                    EventoManager.Instance.registraEvento("tPromedioRecomendacion", "0.0");
                }

                double presicion = 0.0;
                if (simulacionesADar != 0)
                {
                    presicion = (double)parcialRResueltas / (double)simulacionesADar;
                }
                EventoManager.Instance.registraEvento("precision", presicion.ToString());
                EventoManager.Instance.registraEvento("precisionRecomendacion", (presicion * simulacionesADar).ToString());
                EventoManager.Instance.registraEvento("precisionRecomendacion2", (presicion * Math.Log(simulacionesADar)).ToString());
                ciclosCompletos++;
            }
            rsimulacion.termina();
            idSimulacion = -1;
            this.termino = true;
        }