public static void ImprimirProfundidadArbol(ArbolDecision <object> arbol) { if (arbol != null) { int nivelesArbol = 0; nivelesArbol = arbol.ContarNiveles(ref nivelesArbol); Console.WriteLine("Seleccione profunidad del árbol:"); int profunArbol = SafeParseOpcion(Console.ReadLine()); if (profunArbol > nivelesArbol) { Console.WriteLine("La profunidad seleccionada es mayor a la del árbol que es: {0}", nivelesArbol); } else { arbol.PrintNiveles(profunArbol); Console.WriteLine(); } } else { Console.WriteLine("Aún no se ha construido un árbol o el CSV seleccionado está vacio."); } //todo: tratar de sacar los titulos duplicados para las hojas }
public static ArbolDecision <object> JugarRespuesta(string resp, ArbolDecision <object> datos) { switch (resp) { case "si": if (!datos.EsHoja()) { return(datos.HijoDerecho); } else { return(datos); } case "no": if (!datos.EsHoja()) { return(datos.HijoIzquierdo); } else { return(datos); } default: return(null); } }
public static void Probar(ArbolDecision <object> arbol) { if (arbol == null) { Console.WriteLine("Aún no se ha construido un árbol o el CSV seleccionado está vacio."); } else { Dictionary <string, int> lista = new Dictionary <string, int>(); arbol.ProbabilidadPrediccion(); } }
public static ArbolDecision <object> ArmarArbol(Clasificador clasificador) { if (clasificador != null) { ArbolDecision <object> arbolBinario = new ArbolDecision <object>(); arbolBinario.MapArbol(clasificador); return(arbolBinario); } else { return(null); } }
public static void ImprimirArbol(ArbolDecision <object> arbol) { if (arbol == null) { Console.WriteLine("Aún no se ha construido un árbol o el CSV seleccionado está vacio."); } else { Console.WriteLine("\nEl árbol puede predecir los siguientes elementos:"); List <string> listado = new List <string>(); listado = arbol.PrintHojas(listado); //ordeno el árbol para imprimirlo alfabeticamente listado.Sort(); foreach (var item in listado) { Console.WriteLine(item); } Console.WriteLine(); } }
public static void SelectCaracteristicas(ConjuntoDeDatos conjuntoDeDatos, Clasificador clasificador, ArbolDecision <object> arbol) { if (arbol == null) { Console.WriteLine("Aún no se ha construido un árbol o el CSV seleccionado está vacio."); } else { //todo corregir nombres de variables List <Pregunta> caracteristicas = new List <Pregunta>(); Console.WriteLine("\nSeleccione caracteristicas:"); for (int i = 0; i < clasificador.Encabezados.Count - 1; i++) { Console.Write("{0}: ", clasificador.Encabezados[i]); string resp = Console.ReadLine(); caracteristicas.Add(new Pregunta(i, resp, clasificador.Encabezados[i])); } List <string> recorridoPreguntasRespuestas = new List <string>(); bool respuestaCarac = false; bool finArbol = false; while (!finArbol) { if (!arbol.EsHoja()) { Pregunta pregunta = (Pregunta)arbol.Dato; recorridoPreguntasRespuestas.Add(pregunta.ToString()); for (int j = 0; j < caracteristicas.Count; j++) { if (pregunta.ToString().Contains(" Mayor o igual a ") && caracteristicas[j].ToString().Contains(" Mayor o igual a ") && pregunta.Columna == caracteristicas[j].Columna) { if (Convert.ToDouble(caracteristicas[j].Valor) >= Convert.ToDouble(pregunta.Valor) && pregunta.Columna == caracteristicas[j].Columna) { respuestaCarac = true; recorridoPreguntasRespuestas.Add("Si"); break; } else { respuestaCarac = false; recorridoPreguntasRespuestas.Add("No"); break; } } else { if (pregunta.Valor == caracteristicas[j].Valor && pregunta.Columna == caracteristicas[j].Columna) { respuestaCarac = true; recorridoPreguntasRespuestas.Add("Si"); break; } else if (pregunta.Valor != caracteristicas[j].Valor && pregunta.Columna == caracteristicas[j].Columna) { respuestaCarac = false; recorridoPreguntasRespuestas.Add("No"); break; } } } switch (respuestaCarac) { case true: arbol = JugarRespuesta("si", arbol); break; case false: arbol = JugarRespuesta("no", arbol); break; } } else { finArbol = true; Dictionary <string, int> etiquetas = (Dictionary <string, int>)arbol.Dato; Console.WriteLine("\nPreguntas y respuestas hechas en base a las caracteristicas brindadas:"); foreach (string item in recorridoPreguntasRespuestas) { Console.WriteLine(item); } Console.WriteLine("\nDatos Encontrados:"); foreach (var hoja in etiquetas) { Console.WriteLine(hoja.Key); } } } } }
static void Main(string[] args) { Titulo(); ArbolDecision <object> arbol = null; Clasificador clasificador = null; ConjuntoDeDatos conjuntoDeDatos = null; int opcion = 0; do { Console.WriteLine(opciones); Console.Write("Seleccione opción: "); opcion = SafeParseOpcion(Console.ReadLine()); while (opcion > 4) { Console.WriteLine("\nOpción no valida."); PressKey(); Console.WriteLine(opciones); Console.Write("Seleccione opción: "); opcion = SafeParseOpcion(Console.ReadLine()); } switch (opcion) { //MÓDULO: ADMINISTRACIÓN case 1: int opcionMenu; do { Console.Clear(); Titulo(); Console.WriteLine(menuAdmin); Console.Write("Seleccione opción: "); opcionMenu = SafeParseOpcion(Console.ReadLine()); while (opcionMenu > 3) { Console.WriteLine("\nOpción no valida."); PressKey(); Console.WriteLine(menuAdmin); Console.Write("Seleccione opción: "); opcionMenu = SafeParseOpcion(Console.ReadLine()); } switch (opcionMenu) { case 1: conjuntoDeDatos = ArmarConjuntoDeDatos(args); clasificador = ArmarClasificador(conjuntoDeDatos); if (clasificador != null) { arbol = ArmarArbol(clasificador); } if (arbol != null) { Console.WriteLine("\n¡Él Árbol se ha generado correctamente!"); PressKey(); } break; case 2: Probar(arbol); PressKey(); break; case 3: Console.Clear(); Titulo(); break; } }while (opcionMenu != 3); break; //MÓDULO: CONSULTA case 2: int opcionMenuConsulta; do { Console.Clear(); Titulo(); Console.WriteLine(menuConsulta); Console.Write("Seleccione opción: "); opcionMenuConsulta = SafeParseOpcion(Console.ReadLine()); while (opcionMenuConsulta > 4) { Console.WriteLine("\nOpción no valida."); PressKey(); Console.WriteLine(menuConsulta); Console.Write("Seleccione opción: "); opcionMenuConsulta = SafeParseOpcion(Console.ReadLine()); } switch (opcionMenuConsulta) { case 1: ImprimirArbol(arbol); PressKey(); break; case 2: SelectCaracteristicas(conjuntoDeDatos, clasificador, arbol); PressKey(); break; case 3: ImprimirProfundidadArbol(arbol); PressKey(); break; case 4: Console.Clear(); Titulo(); break; } } while (opcionMenuConsulta != 4); break; case 3: Jugar(arbol); PressKey(); break; } } while (opcion < 4); Timer(3000); }
public static void Jugar(ArbolDecision <object> arbol) { if (arbol == null) { Console.WriteLine("Aún no se ha construido un árbol o el CSV seleccionado está vacio."); } else { //Consigna va a ser el árbol de referencia que se va a utilizar al jugar, una vez que se termine y quiera volver a jugar se vuelve a generar dicho árbol. ArbolDecision <object> consigna = arbol; Console.Write("¿Ya estas listo para jugar?\n"); Console.Write(respuestas); //Valido y convierto lo que ingrese por consola a un número. Sino vuelvo a preguntar int respuesta = ValidateOpcion(Console.ReadLine(), "¿Ya estas listo para jugar?\n"); switch (respuesta) { case 1: Console.Clear(); Titulo(); Console.WriteLine("¡¡Juguemos!!"); while (respuesta == 1) { //Si no es hoja imprimo la siguiente pregunta. if (!consigna.EsHoja()) { Console.WriteLine(consigna.Dato); Console.Write(respuestas); int respConsigna = ValidateOpcion(Console.ReadLine(), consigna.Dato.ToString()); switch (respConsigna) { case 1: consigna = JugarRespuesta("si", consigna); break; case 2: consigna = JugarRespuesta("no", consigna); break; } } else { //Si es una hoja, hago una conversión explicita del tipo object a dictionary para poder recorrerlo Dictionary <string, int> etiquetas = (Dictionary <string, int>)consigna.Dato; Console.WriteLine("Estoy pensando en/los:"); foreach (var hoja in etiquetas) { Console.WriteLine(hoja.Key); } Console.WriteLine("¿Deseas seguir jugando?"); Console.Write(respuestas); respuesta = ValidateOpcion(Console.ReadLine(), "¿Deseas seguir jugando?"); //Si quiere volver a jugar vuelvo a instanciar el arbol de decisión original. if (respuesta == 1) { Jugar(arbol); break; } else { Console.WriteLine("\n:(\n" + "¡Hasta la próxima!"); break; } } } break; case 2: Console.WriteLine("\n:(\n" + "¡Hasta la próxima!"); break; } } }
public ArbolDecision <T> MapArbol(Clasificador clasificador) { bool datosEnd = false; while (!datosEnd) { if (Dato == null) { Dato = clasificador.obtenerPregunta(); } //invierto los datos del clasificador para que en el árbol las respuestas positivas vayan a la derecha. Clasificador hijoDer = new Clasificador(clasificador.obtenerDatosIzquierdo()); //Si es hoja, almaceno las etiquetas if (hijoDer.crearHoja() && HijoDerecho == null) { HijoDerecho = new ArbolDecision <T>(); Dictionary <string, int> itemHoja = hijoDer.obtenerDatoHoja(); HijoDerecho.Dato = itemHoja; datosEnd = true; } //Si no es una hoja almaceno pregunta y vuelvo a llamar al método y pregunto de vuelta. else { if (HijoDerecho == null) { HijoDerecho = new ArbolDecision <T>(); HijoDerecho.Dato = hijoDer.obtenerPregunta(); HijoDerecho.MapArbol(hijoDer); } else { datosEnd = true; } } Clasificador hijoIzq = new Clasificador(clasificador.obtenerDatosDerecho()); if (hijoIzq.crearHoja() && HijoIzquierdo == null) { HijoIzquierdo = new ArbolDecision <T>(); Dictionary <string, int> itemHoja = hijoIzq.obtenerDatoHoja(); HijoIzquierdo.Dato = itemHoja; datosEnd = true; } else { //Si no es una hoja vuelvo a llamar al método y pregunto de vuelta. if (HijoIzquierdo == null) { HijoIzquierdo = new ArbolDecision <T>(); HijoIzquierdo.Dato = hijoIzq.obtenerPregunta(); HijoIzquierdo.MapArbol(hijoIzq); } else { datosEnd = true; } } } return(this); }