public static Jolka LoadJolka(string boarFileName, string wordsFileName, char block, char empty) { Jolka result = null; if (File.Exists(boarFileName)) { var matrix = ParseJolkaBoard(File.ReadAllLines(boarFileName)); if (File.Exists(wordsFileName)) { var words = File.ReadAllLines(wordsFileName); var fileName = Path.GetFileName(boarFileName); result = new Jolka() { Name = fileName, Board = matrix, Words = words, Block = block, Empty = empty }; } } return(result); }
private List <Constraint <string, JolkaVariable> >[] CreateConstraints(Jolka jolka, Variable <string>[] variables) { var constraints = new List <Constraint <string, JolkaVariable> > [variables.Length]; for (int i = 0; i < variables.Length; i++) { constraints[i] = new List <Constraint <string, JolkaVariable> >(); for (int j = 0; j < variables.Length; j++) { if (i != j) { var cIntersection = ConstraintOfIntersection(variables, i, j); if (cIntersection != null) { constraints[i].Add(cIntersection); } var cOneInst = OneInstanceConstraint(variables, i, j); if (cOneInst != null) { constraints[i].Add(cOneInst); } } } } return(constraints); }
private Domain <string>[] CreateDmains(Jolka jolka, JolkaVariable[] variables) { var result = new Domain <string> [variables.Length]; for (int i = 0; i < result.Length; i++) { var validWords = jolka.Words.Where(w => w.Length == variables[i].Value.Length); result[i] = new Domain <string>(validWords.ToArray()) { Default = new string(EMPTY_CHAR, variables[i].Value.Length) }; } return(result); }
public JolkaCSP(Jolka jolka, IVariableSelectionHeuristics <string, JolkaVariable> variableSelectionheuristics) { _jolka = jolka; _variableSelectionHeuristics = variableSelectionheuristics; EMPTY_CHAR = jolka.Empty; var variables = ParseVariables(jolka).ToArray(); var domains = CreateDmains(jolka, variables); var constraints = CreateConstraints(jolka, variables); _variableSelectionHeuristics.RegisterVariables(variables, domains); VariablesWithConstraints = new Tuple <JolkaVariable, Domain <string>, List <Constraint <string, JolkaVariable> > > [variables.Length]; for (int i = 0; i < variables.Length; i++) { VariablesWithConstraints[i] = new Tuple <JolkaVariable, Domain <string>, List <Constraint <string, JolkaVariable> > >(variables[i], domains[i], constraints[i]); } }
private List <JolkaVariable> ParseVariables(Jolka jolka) { int varIndex = 0; var board = jolka.Board; var vars = new List <JolkaVariable>(); for (int row = 0; row < board.Rows; row++) { int wordStart = 0; int wordLength = 0; for (int column = 0; column < board.Columns; column++) { if (board.GetAt(row, column).Equals(jolka.Block)) { if (wordLength == 0) { wordStart++; } else if (wordLength == 1) { wordStart = column + 1; wordLength = 0; } else { vars.Add(new JolkaVariable() { Index = varIndex, Value = new string(jolka.Empty, wordLength), Start = new Tuple <int, int>(row, wordStart), Orientation = Orientation.HORIZONTAL }); wordLength = 0; wordStart = column + 1; varIndex++; } } else { wordLength++; } } if (wordLength > 1) { vars.Add(new JolkaVariable() { Index = varIndex, Value = new string(jolka.Empty, wordLength), Start = new Tuple <int, int>(row, wordStart), Orientation = Orientation.HORIZONTAL }); varIndex++; } } for (int column = 0; column < board.Columns; column++) { int wordStart = 0; int wordLength = 0; for (int row = 0; row < board.Rows; row++) { if (board.GetAt(row, column).Equals(jolka.Block)) { if (wordLength == 0) { wordStart++; } else if (wordLength == 1) { wordStart = row + 1; wordLength = 0; } else { vars.Add(new JolkaVariable() { Index = varIndex, Value = new string(jolka.Empty, wordLength), Start = new Tuple <int, int>(wordStart, column), Orientation = Orientation.VERTICAL }); varIndex++; wordLength = 0; wordStart = row + 1; } } else { wordLength++; } } if (wordLength > 1) { vars.Add(new JolkaVariable() { Index = varIndex, Value = new string(jolka.Empty, wordLength), Start = new Tuple <int, int>(wordStart, column), Orientation = Orientation.VERTICAL }); varIndex++; } } return(vars); }