コード例 #1
0
ファイル: Loader.cs プロジェクト: glakuub/CSP
        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);
        }
コード例 #2
0
ファイル: JolkaCSP.cs プロジェクト: glakuub/CSP
        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);
        }
コード例 #3
0
ファイル: JolkaCSP.cs プロジェクト: glakuub/CSP
        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);
        }
コード例 #4
0
ファイル: JolkaCSP.cs プロジェクト: glakuub/CSP
        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]);
            }
        }
コード例 #5
0
ファイル: JolkaCSP.cs プロジェクト: glakuub/CSP
        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);
        }