public Algoritmo( string path, string pred_obj) { predicados = new HashSet<Literal>(); dominio = new HashSet<string>(); baseConocimiento = new List<Literal>(); conocimientoPos = new List<Literal>(); conocimientoNeg = new List<Literal>(); objetivo = pred_obj; var file = (from lines in File.ReadAllLines(@path) let line = lines.Split(new[] { "(" }, StringSplitOptions.RemoveEmptyEntries) select new { predicado = line[0], atributos = line[1].Split(new[] { ", " }, StringSplitOptions.RemoveEmptyEntries) } ); foreach (var lit in file) { int natt = lit.atributos.Count(); Literal nuevo = new Literal(lit.predicado, natt); predicados.Add(nuevo.Clone()); //para tener la cardinalidad tb string[] att = lit.atributos; att[natt - 1] = att[natt - 1].Remove(att[natt - 1].Count() - 1); nuevo.Atributos = att; dominio.UnionWith(att); if (lit.predicado == pred_obj) conocimientoPos.Add(nuevo); else { baseConocimiento.Add(nuevo); //predicados.Add(lit.predicado); //Para recursivo poner fuera del else } } predicados.RemoveWhere(T => T.Nombre == objetivo); int n_att = conocimientoPos[0].nAtt; foreach (var litNeg in dominio.Repetitions(n_att)) { Literal nuevo = new Literal(pred_obj, n_att); nuevo.Atributos = litNeg; conocimientoNeg.Add(nuevo); } conocimientoNeg.RemoveAll(T => conocimientoPos.Contains(T)); }
private List<Literal> generarCandidatos(HashSet<Literal> predicados, HashSet<string> usados) { List<Literal> candidatos = new List<Literal>(); foreach(var predicado in predicados) { int natt_nuevo = Convert.ToInt32(usados.Max()); HashSet<string> usados_cpy = new HashSet<string>(usados); for (int i = 0; i < predicado.nAtt-1; i++) { usados_cpy.Add("" + (i+natt_nuevo+1) ); } // añadir natt_nuevo a usados foreach (var atributos in usados_cpy.Repetitions(predicado.nAtt)) { candidatos.Add(new Literal(predicado.Nombre, predicado.nAtt, atributos)); } } return candidatos; }