Beispiel #1
0
        private Assignment <Var, Val> Backtrack(CSP <Var, Val> csp, Assignment <Var, Val> assignment)
        {
            if (assignment.IsComplete(csp.Variables))
            {
                return(assignment);
            }

            Assignment <Var, Val> result = null;

            var var = SelectUnassignedVariable(csp, assignment);

            foreach (var value in OrderDomainValues(csp, assignment, var))
            {
                assignment.Add(var, value);
                if (assignment.IsConsistent(csp.GetConstraints(var)))
                {
                    var log = Inference(csp, assignment, var);
                    if (!log.IsConsistencyFound())
                    {
                        result = Backtrack(csp, assignment);
                        if (result != null)
                        {
                            break;
                        }
                    }
                    log.Undo(csp);
                }
                assignment.Remove(var);
            }

            return(result);
        }
Beispiel #2
0
            private static int CountLostValues(CSP <Var, Val> csp, Assignment <Var, Val> assignment, Var var, Val value)
            {
                var result = 0;
                var assign = new Assignment <Var, Val>();

                assign.Add(var, value);
                foreach (var constraint in csp.GetConstraints(var))
                {
                    if (constraint.GetScope().Count() == 2)
                    {
                        Var neighbor = csp.GetNeighbor(var, constraint);
                        if (!assignment.Contains(neighbor))
                        {
                            foreach (var val in csp.GetDomain(neighbor))
                            {
                                assign.Add(neighbor, val);
                                if (!constraint.IsSatisfiedWith(assign))
                                {
                                    ++result;
                                }
                            }
                        }
                    }
                }
                return(result);
            }
Beispiel #3
0
            public IEnumerable <Var> Apply(CSP <Var, Val> csp, IEnumerable <Var> vars)
            {
                var result = new List <Var>();

                var maxDegree = -1;

                foreach (var var in vars)
                {
                    var degree = csp.GetConstraints(var).Count();
                    if (degree > maxDegree)
                    {
                        result.Clear();
                        maxDegree = degree;
                    }

                    if (degree == maxDegree)
                    {
                        result.Add(var);
                    }
                }

                return(result);
            }