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 Clasificador ArmarClasificador(ConjuntoDeDatos datos) { if (datos == null || datos.Filas.Count == 0) { Console.WriteLine("El archivo CSV seleccionado está corrupto o vacío."); PressKey(); return(null); } else { Clasificador clasificador = new Clasificador(datos); return(clasificador); } }
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 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); }